6

所以,我在这里的最终目标是有一种方法来列出项目(如 vsReport 中的 TListView),并在客户区域内使用添加/删除按钮。

前任:

|----------------|
|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 继承。

有任何想法吗?

4

2 回答 2

3

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

因此,在单元格的常规绘制发生后(更新 BoundsRect 还不够),或者您使用 WinControl 再次绘制自己的 TJvTransparentButton。
例如,使用带有 TJvTransparentButton 的 TPanel 应该可以工作。

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

于 2011-12-28T00:15:11.127 回答
3

你这样做是错误的。您必须编写自己的编辑器来TVirtualStringTree实现IVTEditLink接口。然后,OnCreateEditor如果您需要创建编辑器:

procedure TForm1.VSTCreateEditor(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
begin
  EditLink:=TStringEditLink.Create;
end;

您可以在此处获取更多信息。

于 2011-12-28T08:53:42.100 回答