VirtualStringTree - 在单元格中嵌入控件 - 控件不显示

Thi*_*Six 6 delphi virtualtreeview tvirtualstringtree

所以,我的最终游戏是通过客户区内的添加/删除按钮来列出项目(如vsReport中的TListView).

例如:

|----------------|
|Old Item 1    X |
|Old Item 2    X |
|Add new item... |
|                |
|----------------|
Run Code Online (Sandbox Code Playgroud)

如果您知道某个组件在没有这些额外工作的情况下执行此操作,请告诉我们!

所以我挑选了一个红色的"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;
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)

现在的问题是,这根本不显示该项目.我知道来自TImageList的图像很好,因为我可以在设计时创建按钮,它在运行时看起来很好.

我也知道这个代码应该可以工作,因为如果我让TJvTransparentButton成为一个常规的TButton(不改变代码逻辑)它就可以正常运行并且显示正常!

我唯一能想到的是TButton继承自TWinControl,而TJvTransparentButton继承自TControl.

有任何想法吗?

Fra*_*ois 3

我假设 TJvTransparentButton 是 TGraphicControl,因此显示为 Parent 背景的一部分(这就是为什么 Tlabel 始终位于同一 Parent 中的 TEdit 或 TButton 后面)。
TButton 是一个 TWinControl,因此绘制在 Parent 的顶部以及同一 Parent 中其他 WinControl 的上方或下方。

因此,要么在单元格的常规绘制发生后再次绘制 TJvTransparentButton(更新 BoundsRect 是不够的),要么使用 WinControl。
例如,使用带有 TJvTransparentButton 的 TPanel 应该可以。

免责声明:我不熟悉 VirtualStringTree 也不熟悉 TJvTransparentButton ...