我使用此代码来填充VirtualStringTree并允许重命名项目:
//---------------------------------------------------------------------------
// Structure for the tree
//---------------------------------------------------------------------------
struct TVSTdata
{
UnicodeString Name;
};
//---------------------------------------------------------------------------
// Initialization of the tree
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
VirtualStringTree1->NodeDataSize = sizeof(TVSTdata);
// Fill all nodes with initial data
InitializeTree();
}
//---------------------------------------------------------------------------
// Fill all nodes with data and assign FocusedNode
//---------------------------------------------------------------------------
void TForm1::InitializeTree()
{
TVirtualNode* pNode;
TVirtualNode* pActiveNode;
TVSTdata* pData;
VirtualStringTree1->BeginUpdate();
VirtualStringTree1->Clear();
pNode = VirtualStringTree1->AddChild(NULL); pData = static_cast<TVSTdata*>(VirtualStringTree1->GetNodeData(pNode)); pData->Name = "This is name 1";
pNode = VirtualStringTree1->AddChild(NULL); pData = static_cast<TVSTdata*>(VirtualStringTree1->GetNodeData(pNode)); pData->Name …Run Code Online (Sandbox Code Playgroud) 我的朋友正在使用 VirtualTreeView 在 Delphi 中工作,并且有下一个问题:他有两列,第一列中的每一行都有数据和子项。是否可以不更改第一列宽度来设置最大子列宽度?

传奇:
现在的样子 - 看看孩子的黑色反应角。它必须如何 - 看红色矩形。
我刚刚发现使用Option toUseExplorerTheme可以为VirtualStringTree生成一个很好的选择矩形.但是,如果设置了选项toGridExtensions并且树中有多个列,则不会为内部单元格绘制选区的垂直边框,并且也会丢失圆角.仅正确绘制左侧和最右侧列的最外边缘和角.看起来好像在最外面的列之间绘制了选择矩形,并且刚刚在选择矩形上绘制了未选择列的背景.
关闭toGridExtensions会产生正确的选择矩形,但我更喜欢将其打开,因为只能通过单击标准模式中的文本来选择单元格(而不是单击文本旁边的空白区域).
Delphi 7和XE2会出现问题,也可能与其他版本一起出现问题.
要重现向表单添加TVirtualStringTree,显示标题,向标题添加多个列,并激活选项toGridExtensions(MiscOptions),toUseExplorerTheme(PaintOptions),toExtendedFocus(SelectionOptions),运行程序并单击任何单元格.
是否可以VirtualStringTree像在Excel中一样在水平滚动期间锁定列0(带节点名称)?
我想在virtualtreeview中实现一个搜索功能.我想突出显示或强调节点中搜索到的单词.
我怎样才能做到这一点?谢谢
这是重现问题的非常小的项目(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
我正在 Delphi 中探索 Virtual Treeview 并运行了一个示例程序,其中通过按 F2 来调用编辑器,开始编辑过程使用 Virtualtreeview 中的内置编辑器(无附加编辑组件)。文本发生了变化,但当我单击不同的节点时,它立即变回了原始文本。
这让我探索了 VirtualTrees.pas 中的源代码,以研究编辑过程是如何工作的。一切似乎都归结为TBaseVirtualTree.doedit. 我已经检查了每个步骤,但不确定列中的编辑框究竟是什么操作。
procedure TBaseVirtualTree.DoEdit;
begin
Application.CancelHint;
StopTimer(ScrollTimer);
StopTimer(EditTimer);
DoStateChange([], [tsEditPending]);
if Assigned(FFocusedNode) and not (vsDisabled in FFocusedNode.States) and
not (toReadOnly in FOptions.FMiscOptions) and (FEditLink = nil) then
begin
FEditLink := DoCreateEditor(FFocusedNode, FEditColumn);
if Assigned(FEditLink) then
begin
DoStateChange([tsEditing], [tsDrawSelecting, tsDrawSelPending, tsToggleFocusedSelection, tsOLEDragPending,
tsOLEDragging, tsClearPending, tsDrawSelPending, tsScrollPending, tsScrolling, tsMouseCheckPending]);
ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions,
not (toDisableAutoscrollOnEdit in FOptions.AutoOptions));
if FEditLink.PrepareEdit(Self, FFocusedNode, FEditColumn) then
begin
UpdateEditBounds;
// Node needs repaint …Run Code Online (Sandbox Code Playgroud) 有没有人碰巧有与Delphi5兼容的Virtual TreeView的副本?或者有谁知道它可以从哪里下载?
在此先感谢任何回复.
我在同一个表单上同时使用了几个TVirtualStringTree.
如果树具有选定节点,但焦点当前位于另一个树上,则选择将以浅灰色突出显示.
是否有一种简单的方法可以选择使用通常的选择颜色(我的计算机上的蓝色)突出显示未聚焦的TVirtualStringTree?
谢谢
正如Rob Kennedy先生所建议的那样,我已经到了需要停止将数据存储在VCL组件中并具有"基础数据结构"的地步.
首先,这个问题是关于"我如何建立基础数据结构".:)
我的层次结构由2级节点组成.
现在,我通过循环根节点来完成我的东西,其中我循环通过rootnode的子节点,以获得我需要的东西(数据).我希望能够将所有数据存储在所谓的底层数据结构中,以便我可以使用线程轻松修改条目(我想我能够做到这一点?)
但是,当循环遍历我的条目(现在)时,结果取决于节点的Checkstate - 如果我使用的是底层数据结构,我怎么知道我的节点是否被检查,当我的数据结构循环通过时,而不是我的节点?
假设我想使用2个级别.
这将是父母:
TRoot = Record
RootName : String;
RootId : Integer;
Kids : TList; //(of TKid)
End;
Run Code Online (Sandbox Code Playgroud)
那孩子:
TKid = Record
KidName : String;
KidId : Integer;
End;
Run Code Online (Sandbox Code Playgroud)
这基本上就是我现在所做的.评论说这不是最好的解决方案,所以我愿意接受建议.:)
我希望你理解我的问题.:)
谢谢!