VirtualStringTree - Встраивание элементов управления в ячейки - элемент управления не отображается

Итак, моя конечная цель - найти способ перечислить элементы (например, TListView в vsReport) с помощью кнопок добавления / удаления внутри клиентской области.

Пример:

|----------------|
|Old Item 1    X |
|Old Item 2    X |
|Add new item... |
|                |
|----------------|

Если вам известен компонент, который делает это без всей этой дополнительной работы, пожалуйста, дайте мне знать!

Я выбрал красный закрывающий «X» и использую TJvTransparentButton (Jedi Components - JVCL) для его отображения. Он обрабатывает состояния нажатие / не нажатие и показывает только изображение. Изначально я использовал TButton, но мне не нужен был весь беспорядок вокруг глифа.

Теперь я сохраняю кнопку изображения в записи, связанной с каждым узлом.

Код выглядит следующим образом:

procedure TfrmMain.AddNewAccount(const Username, Password: String);
var
  Data : PTreeData;
  XNode : PVirtualNode;
Begin
  XNode := vstAccounts.AddChild(nil);
  If vstAccounts.AbsoluteIndex(XNode) > -1 Then
    begin
    Data := vstAccounts.GetNodeData(Xnode);
    Data^.Column0 := Username;
    Data^.Column1 := '';
    Data^.DeleteButton := TJvTransparentButton.Create(nil);
    With Data^.DeleteButton Do
      begin
      Parent := vstAccounts;
      Left := 0;
      Top := 0;
      Width := 16;
      Height := 16;
      Anchors := [];
      AutoGray := False;
      BorderWidth := 0;
      FrameStyle := fsNone;
      Images.ActiveImage := iListView;
      Images.ActiveIndex := 0;
    end;
  end;
end;

В событии OnAfterCellPaint я управляю позиционированием кнопки изображения следующим образом:

procedure TfrmMain.vstAccountsAfterCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
var
  Data : PTreeData;
begin
  If Column = 1 Then
    begin
    Data := vstAccounts.GetNodeData(Node);
    If Assigned(Data) Then
      begin
      With Data^.DeleteButton Do
        begin
        BoundsRect := CellRect;
      end;
    end;
  end;
end;

Проблема в том, что элемент не отображается вообще. Я знаю, что изображение из TImageList в порядке, потому что я могу создать кнопку во время разработки, и она отлично выглядит во время выполнения.

Я также знаю, что этот код должен работать, потому что, если я сделаю TJvTransparentButton обычным TButton (без изменения логики кода), он будет работать нормально и нормально отображаться!

Единственное, о чем я могу думать, это то, что TButton наследуется от TWinControl, а TJvTransparentButton наследуется от TControl.

Есть идеи?

6
задан ThievingSix 27 December 2011 в 23:51
поделиться