标签: virtualtreeview

是否可以在Virtual Treeview中选择多个列?

我需要添加复制矩形选择的节点和列的功能,但我找不到任何方法来实际选择虚拟树视图中的多个列(在toFullRowSelect旁边).

我只是错过了一些东西吗?如果没有,是否有一个网格状多列选择支持的后代?

delphi virtualtreeview

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

TVirtualStringTree中的自动调整大小列

爬上TVirtualTreeView的学习之山,我正在尝试创建一个自定义后代,确保在控件调整大小时,最后一列的宽度完全填充控件的宽度,而不需要水平滚动条.

我看到了许多与"AutoFitColumns"有关的项目(方法和一些事件),但没有涉及此功能的文档.我可以使用AutoFitColumns自动调整上一列的大小,如果是,则如何.

delphi virtualtreeview delphi-2010

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

如何可靠地将Virtual TreeView滚动到底部?

具有自定义节点高度的TVirtualStringTree对象,如何可靠地将Virtual TreeView滚动到底部(即滚动条到达底部)?

我打过电话tree1.FullExpand,然后tree1.ScrollIntoView.(tree1.GetLast),但它不工作.

先感谢您.

delphi virtualtreeview

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

在虚拟树视图中为每个项目组创建一个带有标题栏的主 - 详细视图(TVirtualStringTree)

我试图从TVirtualStringTree得到一个看起来像这样的结果:

所需的virtualtreeview外观

我相信它可以直接使用TVirtualStringTree(Mike Lischke的主要Virtual Treeview控件),或者通过子类化和修改继承的控件,或者转到TVirtualDrawTree.

这是我能得到的,并显示了我面临的问题:

实际的vritualtreeview外观

我遇到的问题是我似乎无法让第0列的文本占据虚拟树视图控件的整个水平区域.高级演示中有一个虚拟树视图演示,显示多线文本似乎可以满足我的需要,但我无法弄清楚如何将它与标题行下方需要的详细列结合使用(显示为Node,节点,图片中的节点).

这是我尝试过的:

  • 在BeforeCellPaint事件中修改ContentRect.Right:
  • 开始toGridExtensionsTreeOptions.MiscOptions.

这是一个代码示例,显示了我如何尝试更改contentRect:

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
   level:Integer;
begin
 level := VirtualStringTree1.GetNodeLevel(Node);
 if (level=0) then
    Inc( ContentRect.Right, 300);

end;
Run Code Online (Sandbox Code Playgroud)

更新:

使用下面接受的答案,我得到以下内容:

在此输入图像描述

delphi virtualtreeview delphi-xe

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

VirtualStringTree - 在单元格中嵌入控件 - 控件不显示

所以,我的最终游戏是通过客户区内的添加/删除按钮来列出项目(如vsReport中的TListView).

例如:

|----------------|
|Old Item 1    X |
|Old Item 2    X |
|Add new item... |
|                |
|----------------|
Run Code Online (Sandbox Code Playgroud)

如果您知道某个组件在没有这些额外工作的情况下执行此操作,请告诉我们!

所以我挑选了一个红色的"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; …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview tvirtualstringtree

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

TVirtualStringTree和垂直滚动无法正常工作

我已经学会了如何使用TVirtualStringTree,我发现它非常棒.我有一个名为PackedList的自定义非可视列表,由另一个线程填充.我想实时显示TVirtualStringTree中的所有列表内容.所以我在主窗体上放了一个定时器,每500ms更新一次HexLog(即TVirtualStringTree)RootNodeCount.

我的所有数据都出现在VirtualStringTree上,我没有任何速度问题,非常好.但垂直滚动条有一个问题.当我在控件上按Ctrl + End以跳转到列表的末尾时,它会在中间某处.类似地,当我将滚动条拖动到结尾时,它不会结束.但是HexLog知道DataCount.为什么不跳到最后?如果我按几次按Ctrl + END,它会到达结尾.

在计时器例程中,我想说HexLog按代码跳转到列表的末尾.我该怎么做以及如何正确处理垂直滚动条?

procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject);
begin
   if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then
    begin
      HexLog.RootNodeCount := PacketList.Items.Count;
    end;
end;

procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
  if Sender.MultiLine[Node] then
  begin
    TargetCanvas.Font := Sender.Font;
    NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

HexLog的外观

TLama的建议回复无法正常工作,请参阅图片以获得解释: TLama解决方案无效

有关详细图像说明,请参阅该链接:http://i43.tinypic.com/1445thi.png

delphi scroll virtualtreeview tvirtualstringtree

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

TVirtualStringTree:OnMeasureItem事件和OnGetText事件之间的数据发生了变化

我有一个数组保存数据将在TVirtualStringTree上表示.该阵列是线程安全且可锁定的.并由另一个线程增长.

我的问题是,当VST执行OnMeasureItem事件来测量节点的高度时,用于测量的数据可能会在使用OnGetText事件打印数据时发生变化.

我检查了事件的执行顺序,这对我的设计不利.首先它为未初始化的所有节点触发OnMeasureItem事件,然后它开始调用OnGetText事件.我的意思是,假设我们有3个节点,事件将按此顺序触发:

OnMeasureItem for node 1
OnMeasureItem for node 2
OnMeasureItem for node 3
OnGetText for node 1
OnGetText for node 2
OnGetText for node 3
Run Code Online (Sandbox Code Playgroud)

但是我需要这样的东西才能锁定:

OnMeasureItem for node 1
OnGetText for node 1

OnMeasureItem for node 2
OnGetText for node 2

OnMeasureItem for node 3
OnGetText for node 3
Run Code Online (Sandbox Code Playgroud)

保持OnMeasureItem和OnGetText事件之间获得的数据同步的最佳方法是什么?

我不想在所有OnMeasureItem()和OnGetText()事件中锁定我的数组.

谢谢.

添加onTimer:

procedure TMainForm.SyncHexLog;
begin
  HexLog.BeginUpdate;
  Try
    if (HexLog.RootNodeCount <> FirpList.ComOperationCountLagged) then
      begin
          HexLog.RootNodeCount := FirpList.ComOperationCountLagged;

          // measure for fast scrolling
          HexLog.ReInitNode(HexLog.GetLastNoInit(), True);    

          if FAutoScroll then …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview tvirtualstringtree

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

如何在VirtualTreeView中将单元格与背景图像进行颜色混合?

我正在使用VT.Background在VT中显示带有几列的背景图像.
但我无法找到一种方法为细胞使用不同的颜色,因为它们隐藏了背景图像.

我曾尝试使用,OnBeforeItemErase但如果我使用EraseAction := eaColor单元格上的背景位图区域也正在绘制,如果我使用eaDefault的颜色没有被应用.

知道如何做到这一点?

delphi delphi-7 virtualtreeview tvirtualstringtree

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

TVirtualStringTree - 如何更改[ - ]/[+]按钮?

如何使用我自己的自定义按钮(图像)来替换VST中的默认[-]/ [+]按钮?
我想用箭头代替(在此输入图像描述, 在此输入图像描述),还支持RTL bidi模式(在此输入图像描述, 在此输入图像描述).

编辑:我知道bsTriangle样式(ButtonStyle).它不尊重RTL.我想使用自己的自定义图像.

delphi virtualtreeview tvirtualstringtree

6
推荐指数
2
解决办法
1920
查看次数

TVirtualStringTree搜索结果的重点

我想根据搜索条件突出显示VirtualStringTree节点中的文本,例如来自bellow的示例:

在此输入图像描述

有什么建议吗?

delphi virtualtreeview tvirtualstringtree

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