所以,我的最终游戏是通过客户区内的添加/删除按钮来列出项目(如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。
有什么想法吗?
答案 0 :(得分:3)
我假设TJvTransparentButton是一个TGraphicControl,因此显示为Parent的背景的一部分(这就是为什么Tlabel将始终在同一Parent中的TEdit或TButton后面)。
TButton是一个TWinControl,因此绘制在Parent的顶部,并在同一Parent的其他WinControls之上或之下。
所以,或者,你经常在绘制单元格之后再次绘制TJvTransparentButton(更新BoundsRect是不够的)或者你使用WinControl。 例如,使用带有TJvTransparentButton的TPanel应该可以工作。
免责声明:我不熟悉VirtualStringTree和TJvTransparentButton ...
答案 1 :(得分:3)
你这样做是错误的。您必须为实现TVirtualStringTree
接口的IVTEditLink
编写自己的编辑器。然后在OnCreateEditor
事件中,您需要创建编辑器:
procedure TForm1.VSTCreateEditor(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
begin
EditLink:=TStringEditLink.Create;
end;
您可以获得更多信息here。