Home » Tutorials » Third-Party-Komponenten » VirtualTreeView

VirtualTreeView

Editieren ermöglichen

Folgendes Kapitel zeigt, wie du es dem Anwender ermöglichst, die Nodes zum späteren Zeitpunkt zu editieren. Diese Funktionalität kennst du sicherlich vom Windows Explorer her, wo du auf diese Weise Dateien umbenennen kannst.

Die Komponente stellt für das Editieren vier Ereignisse zur Verfügung. OnEditing wird ausgelöst, wenn der Baum gerade im Begriff ist, das Editier-Feld einzublenden. Hier ist noch Zeit, das Editieren zu unterbinden. Wurde ein Node erfolgreich editiert, wird zunächst das OnNewText-Ereignis ausgelöst. An dieser Stelle wird dem Node der neue Text zugewiesen. Es folgt das Ereignis OnEdited, welches den erfolgreichen Editier-Vorgang abschließt. Wurde die Bearbeitung vorzeitig abgebrochen (z.B. über die Taste ESC), wird stattdessen das Ereignis EditCancelled ausgelöst.

Bevor man Nodes überhaupt editieren kann, muss der Eigenschaft TreeOptions.MiscOptions der Wert toEditable hinzugefügt werden. Wird diese Eigenschaft nicht gesetzt, ist ein editieren über den Benutzer unmöglich. Prinzipiell ist es nur möglich, die Hauptspalte (in der Regel die Spalte am linken Rand) zu editieren.

In unserem Beispiel setzen wir auf folgenden Datenrecord:

type
  PTreeData = ^TTreeData;
  TTreeData = record
    TestStr: String
end;

TestStr soll die Beschriftung der Nodes darstellen.

Ein Editieren soll nur möglich sein, wenn der Node in der Root-Ebene liegt. Die Funktion GetNodeLevel würde also 0 zurückgeben. Das Ereignis OnEditing ist dabei der richtige Ansatzpunkt:

procedure TForm1.vstEditing(Sender: TBaseVirtualTree;
 Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
  Allowed := Sender.GetNodeLevel(Node)<1;
end;

Entscheidend ist hier der Parameter Allowed, der, wenn er den Wert True zugewiesen bekommt, ein Editieren ermöglicht. Node stellt einen Zeiger auf den zu editierenden Node dar.

Hat der Benutzer einen neuen Text eingegeben und die Eingabe mit Return bestätigt, wird das Ereignis OnNewText aufgerufen. Hier wird der neue Text dem Daten-Record übergeben:

procedure TForm1.vstGraphicsNewText(Sender: TBaseVirtualTree;
 Node: PVirtualNode; Column: TColumnIndex; NewText: WideString);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node.Parent);
  if Assigned(Data) then
    Data.Description:=NewText;
end;

Der Parameter NewText enthält den vom Benutzer eingegebenen Text.

Über die Eigenschaft EditDelay steuern Sie, mit welcher Verzögerung in Millisekunden das Editier-Feld angezeigt werden soll. Standardmäßig steht die Eigenschaft auf dem Wert 1000.