2017-05-12 2 views
2

私はDelphiのVirtual Treeviewを試していて、F2キーを押してエディタを呼び出すサンプルプログラムを実行しました。編集プロセスを開始するには、Virtualtreeviewの組み込みエディタを使用しました。テキストは変更されましたが、別のノードをクリックしたときにすぐに元の状態に戻りました。TVirtualTreeviewエディタはどのように機能しますか?

これで、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に配置されている方法で、どのようにデータレコードに置か編集の結果は?

答えて

4

あなたが例えば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が編集処理を開始します。

ビルドインエディタTStringEditLinkIVTEditLinkを実装しており、その動作を知りたい場合は、コードを勉強する必要があります。

独自のエディタ(たとえば、エディタのようなComboBox)を使用する必要がある場合は、IVTEditLinkを実装し、OnCreateEditorイベントにEditLinkを返す必要があります。

VSTのDemoディレクトリには、独自のエディタの実装方法を示すプロパティエディタの例がいくつかあります。

関連する問題