标签: tvirtualstringtree

如何使用TVirtualStringTree进行增量搜索

我正在学习TVirtualStringTree使用,必须实施增量搜索.当用户输入字符时,TEdit我想将焦点节点移动到树中的第一个合格节点.

我正在阅读我能找到的所有演示和示例代码,似乎无法找到这个的起点.谁能让我开始使用伪代码或更好?

delphi virtualtreeview tvirtualstringtree

3
推荐指数
1
解决办法
2712
查看次数

TVirtualStringTree中的图标绘有异常

这是重现问题的非常小的项目(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

3
推荐指数
1
解决办法
570
查看次数

将数据写入PVirtualNode而不手动设置每个字段值

假设我有这个节点数据记录:

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事件时,我看到变量是空的.

我究竟做错了什么?:)

delphi pointers virtualtreeview tvirtualstringtree

2
推荐指数
1
解决办法
941
查看次数

VirtualStringTree OnNodeRightClick

我正在寻找一个程序或一些东西,如果我右键单击一个节点(或通常在VirtualStringTree上)被解雇

我有以下场景:

  • 我的VST接近列表视图.
  • 我只能使用鼠标多选择根节点(按住鼠标按钮并移动鼠标)
  • 如果我点击任何子节点(右或左) - 它被选中(+ [VSelected]状态)
  • 如果我右键单击根节点,它会自动选择并打开弹出菜单.

现在我希望为我的所有子节点(仅当它们被选中)有一个不同的弹出菜单(1个常用).

希望你能理解我的意思,谢谢你的帮助.

delphi delphi-7 virtualtreeview tvirtualstringtree

2
推荐指数
1
解决办法
2673
查看次数

如何让 TVirtualStringTree 在禁用状态下显示图标?

我需要将目录中的文件显示到 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)

delphi virtualtreeview tvirtualstringtree

2
推荐指数
1
解决办法
3149
查看次数

保存VirtualStringTree节点数据

我正在尝试将项目从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

2
推荐指数
1
解决办法
637
查看次数

TVirtualStringTree - 设置列单元/节点对齐

我有一个将Header.Column设置为taLeftJustify(默认)的VirtualStringTree .

有没有办法设置该列的单元格/节点,taRightJustify以便节点将向右对齐,但标题列文本将向左对齐?

这是我想要的结果(在第1栏):

在此输入图像描述

我使用的是相当旧的VT版本4.5.5

delphi virtualtreeview tvirtualstringtree

2
推荐指数
1
解决办法
456
查看次数

虚拟字符串树中节点/行中的多个复选框/单选按钮

在虚拟字符串树中是否可以在每列中都有一个复选框(或单选按钮)?这是一张有关更多信息的图片:在此输入图像描述

我试图附加单选按钮/复选框,但只附加在节点的第一列.

delphi virtualtreeview delphi-xe2 tvirtualstringtree

1
推荐指数
1
解决办法
2536
查看次数