【发布时间】:2012-01-28 20:17:26
【问题描述】:
所以,我的最终目标是使用客户区域内的添加/删除按钮列出项目(如 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。
有什么想法吗?
【问题讨论】:
标签: delphi virtualtreeview tvirtualstringtree