所以,我在这里的最终目标是有一种方法来列出项目(如 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 继承。
有任何想法吗?