我正在学习TVirtualStringTree使用,必须实施增量搜索.当用户输入字符时,TEdit我想将焦点节点移动到树中的第一个合格节点.
我正在阅读我能找到的所有演示和示例代码,似乎无法找到这个的起点.谁能让我开始使用伪代码或更好?
这是重现问题的非常小的项目(VirtualStringTree版本6.5):
type
TForm1 = class(TForm)
vstTest: TVirtualStringTree;
Images: TImageList;
procedure FormCreate(Sender: TObject);
procedure vstTestGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: string);
procedure vstTestGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex);
private
{ Private declarations }
public
{ Public declarations }
end;
PTestRec = ^TTestRec;
TTestRec = record
Col1: string;
Col2: string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Node: PVirtualNode;
Data: PTestRec;
begin
vstTest.Header.Columns.Add;
vstTest.Header.Columns.Add;
vstTest.Header.Options := …Run Code Online (Sandbox Code Playgroud) delphi virtualtreeview tvirtualstringtree delphi-10.1-berlin
假设我有这个节点数据记录:
Type
PPerson = ^TPerson;
TPerson = record
Name: String;
Age: Integer;
SomeBool: Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
要填充我的VirtualStringTree,我会这样做:
Procedure AddToTree(Person: TPerson);
Var
Node: PVirtualNode;
Data: PPerson;
Begin
Node := VT.AddChild(nil);
Data := VT.GetNodeData(Node);
Data.Name := Person.Name;
Data.Age := Person.Age;
Data.SomeBool := Person.SomeBool;
End;
Procedure TMyForm.MyButtonClick(Sender: TObject);
Var
Person: TPerson;
Begin
Person.Name := 'Jeff';
Person.Age := 16;
Person.SomeBool := False;
AddToTree(Person);
End:
Run Code Online (Sandbox Code Playgroud)
现在,虽然这很好用,但我想简化它,所以每当我向记录添加新字段时,我都不会修改AddToTree方法.
所以我尝试了这个:
Procedure AddToTree(Person: TPerson);
Begin
VT.AddChild(nil,@Person);
End;
Run Code Online (Sandbox Code Playgroud)
这个编译,但似乎PVirtualNode没有得到数据,因为我的VT没有显示任何东西,并且当打破OnGetText事件时,我看到变量是空的.
我究竟做错了什么?:)
我正在寻找一个程序或一些东西,如果我右键单击一个节点(或通常在VirtualStringTree上)被解雇
我有以下场景:
现在我希望为我的所有子节点(仅当它们被选中)有一个不同的弹出菜单(1个常用).
希望你能理解我的意思,谢谢你的帮助.
我需要将目录中的文件显示到 TVirtualStringTree。所以,我使用 SHGetFileInfo 来获取文件的图标。但似乎我只能获得“正常”图标(以下屏幕截图的左侧)。如果是这样,TVirtualStringTree 可以将图标绘制为“禁用”吗?就像您禁用了 a 节点一样。请看屏幕截图:

更新
Soft Gems 论坛中有一个类似的帖子。我可以获得图标的矩形,然后自己绘制图标。我正在使用 TcxImageList,它可以轻松绘制“禁用”图标。我首先在 GetImageIndex 事件中分配了一个不存在的图像索引,所以我有一个空间来绘制图标。然后使用以下代码进行绘制。
procedure TfrmMain.tvSharesAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
rImage: TRect;
OffsetLeft: Integer;
begin
rImage := ItemRect;
with TVirtualStringTree(Sender) do begin
if (toShowRoot in TreeOptions.PaintOptions) then
OffsetLeft := Indent * (GetNodeLevel(Node) + 1)
else
OffsetLeft := Indent * GetNodeLevel(Node);
Inc(rImage.Left, Margin + OffsetLeft);
Inc(rImage.Top, (NodeHeight[Node] - Images.Height) div 2);
rImage.Right := rImage.Left + Images.Width;
rImage.Bottom := rImage.Top + Images.Height;
end;
// draw the …Run Code Online (Sandbox Code Playgroud) 我正在尝试将项目从D6移动到D-XE3.使用VirtualStringTree版本5.10在OnSaveNode和OnLoadEvents中保存和加载树数据时,我得到了垃圾.我可能没有正确处理Unicode,但我可能还有其他一些无知:
procedure TfMain.vstGridSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
// Owned: boolean;
Stream.Write(Data.Owned, SizeOf(boolean) );
// Symbol: string;
Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
// AvgTarget: currency;
//Stream.Write(Data.AvgTarget, SizeOf(currency));
// PE: double;
Stream.Write(Data.PE, SizeOf(double));
end;
procedure TfMain.vstGridLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
//Owned: boolean;
Stream.Read(Data.Owned, SizeOf(boolean));
//Symbol: string;
Stream.Read(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
//AvgTarget: currency;
Stream.Read(Data.AvgTarget, SizeOf(currency));
//PE: double;
Stream.Read(Data.PE, SizeOf(double));
end;
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
delphi unicode virtualtreeview tvirtualstringtree delphi-xe3
我有一个将Header.Column设置为taLeftJustify(默认)的VirtualStringTree .
有没有办法设置该列的单元格/节点,taRightJustify以便节点将向右对齐,但标题列文本将向左对齐?
这是我想要的结果(在第1栏):
我使用的是相当旧的VT版本4.5.5
在虚拟字符串树中是否可以在每列中都有一个复选框(或单选按钮)?这是一张有关更多信息的图片:
我试图附加单选按钮/复选框,但只附加在节点的第一列.