TVirtualTreeview 编辑器如何工作?
How does the TVirtualTreeview editor work?
我正在 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 because the selection rectangle and static text must disappear.
InvalidateNode(FFocusedNode);
if not FEditLink.BeginEdit then
DoStateChange([], [tsEditing]);
end
else
DoStateChange([], [tsEditing]);
if not (tsEditing in FStates) then
FEditLink := nil;
end;
end;
end;
所以我的问题是 VirtualTree 如何将实际的键盘输入放置在 node.text 中以及编辑的结果如何放置到数据记录中?
您需要处理 OnNewText
事件,例如:
procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Text: UnicodeString);
var
data: TMyData;
begin
data := TMyData(Sender.GetNodeData(Node)^);
if Assigned(data) then
begin
if Column = 0 then
data.Caption := Text
else
data.Value := Text;
end;
end;
在编辑器中编辑文本后立即调用此事件。
编辑器是通过IVTEditLink
接口实现的。 FEditLink.BeginEdit
开始编辑过程。
内置编辑器TStringEditLink
实现了IVTEditLink
,如果你想知道它是如何工作的,你需要研究代码。
如果您需要使用自己的编辑器(例如 ComboBox 之类的编辑器),您需要在 OnCreateEditor
事件中实现 IVTEditLink
和 return 您的 EditLink
.
VST 的 Demo 目录中有一些很好的 属性 编辑器示例,展示了如何实现您自己的编辑器。
我正在 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 because the selection rectangle and static text must disappear.
InvalidateNode(FFocusedNode);
if not FEditLink.BeginEdit then
DoStateChange([], [tsEditing]);
end
else
DoStateChange([], [tsEditing]);
if not (tsEditing in FStates) then
FEditLink := nil;
end;
end;
end;
所以我的问题是 VirtualTree 如何将实际的键盘输入放置在 node.text 中以及编辑的结果如何放置到数据记录中?
您需要处理 OnNewText
事件,例如:
procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Text: UnicodeString);
var
data: TMyData;
begin
data := TMyData(Sender.GetNodeData(Node)^);
if Assigned(data) then
begin
if Column = 0 then
data.Caption := Text
else
data.Value := Text;
end;
end;
在编辑器中编辑文本后立即调用此事件。
编辑器是通过IVTEditLink
接口实现的。 FEditLink.BeginEdit
开始编辑过程。
内置编辑器TStringEditLink
实现了IVTEditLink
,如果你想知道它是如何工作的,你需要研究代码。
如果您需要使用自己的编辑器(例如 ComboBox 之类的编辑器),您需要在 OnCreateEditor
事件中实现 IVTEditLink
和 return 您的 EditLink
.
VST 的 Demo 目录中有一些很好的 属性 编辑器示例,展示了如何实现您自己的编辑器。