How does the TVirtualTreeview editor work?
delphi, virtualtreeview
Solution
You need to handle the `OnNewText` event eg:
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;
This event is called right after you edit the text in the editor.
The editor is implemented via the `IVTEditLink` interface. `FEditLink.BeginEdit` starts the process of the editing.
The build-in editor `TStringEditLink` implements `IVTEditLink`, and if you want to know how that works, You need to study the code.
If you need to use your own editor (eg a ComboBox like editor) you will need to implement `IVTEditLink` and return your `EditLink` in the `OnCreateEditor` event.
There are a few good examples of property editors in the Demo directory of the VST, that show how to implement your own editors.
Problem
I am exploring Virtual Treeview in Delphi and ran a sample program where the editor is invoked by pressing F2 beginning the editing process uses the built-in editor in Virtualtreeview (No attached editing component). The text changed, but immediately changed back to the original when I clicked on a different node. This led me to explore the source code in VirtualTrees.pas to study how the editing process works. Everything appears to boil down to the `TBaseVirtualTree.doedit`. I have examined each step but am uncertain what exactly operates the editing box positioned in the column. ``` 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; ``` So my question is how is the actual keyboard input being placed in the node.text by VirtualTree and how is the result of the edit placed into the data record?