Moin!
Nunja, da die Diskussion wohl noch nicht beendet ist, will ich mal meine bescheidenen Gedanken beitragen, vielleicht hilft´s ja was.
Auf den ersten Blick scheint Coders Problem recht trivial zu sein, auf den Zweiten nicht mehr
Wenn ich dich richtig verstanden habe, Coder, willst du
nur den Inplace-Editor des TreeView verwenden, vermutlich, weil der optisch ganz nett rüberkommt. Nunja, Geschmacksache. Leider gibt es da aber folgendes Problem: Der Inplace-Editor erzeugt nur dann das Signal OnEdited, wenn man den Text tatsächlich verändert hat, nicht wenn man z.B. den Vorgang abbricht.
Daraus ergeben sich zwei Folgeprobleme: Wenn man einen neuen Node mit einem Standard-Text einfügt und direkt den Inplace-Editor öffnet, um den Text zu ändern, bekommt man ein Problem, wenn man den Editiervorgang abbricht. Da hier kein OnEdited ausgelöst wird, sammeln sich Nodes mit dem Standard-Text an, die man nicht ohne größeren Aufwand wieder eingesammelt kriegt. Unpraktisch. Weiterhin: Wenn man nach einem Editiervorgang in der OnEdited-Prozedur landet und feststellt, dass der Eintrag doppelt ist, kann man nicht mit Node.EditText wieder in denselben zurückwechseln. Jedenfalls bewirkte ein entsprechender Aufruf bei mir nix. Fazit: Es ist (mir?) nicht möglich, den Inplace-Editor des TreeView selektiv zu verlassen.
Aus den genannten Gründen würde sich meines Erachtens folgende Lösung anbieten, ohne exzessiv Code zu produzieren:
- Den Text eines neuen Eintrags vor dem Einfügen abfragen
- Prüfen, ob dieser Text bereits einem Node zugewiesen ist, ggfs. Aktionen einleiten
- Ist der Text bisher noch nicht verwendet, einen entsprechenden Node anlegen
Auf diese Weise gelangen keine "doppelten" Nodes in das TreeView-Objekt! -> Neuanlage-Problem erledigt
- Im OnEdited-Ereignis prüfen, ob der neue Text noch nicht verwendet wird
- Wird der Text verwendet, auf den vorherigen Text zurückfallen, fertig
- Sonst Änderung akzeptieren, fertig
In jedem Fall wird der Inplace-Editor verlassen und muss manuell neu gestartet werden. Damit ist aber sichergestellt, dass keine "doppelten" Nodes durch umbenennen erzeugt werden können!
Hier mein Testprojekt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function TForm1.NodeExists(Text: String; Node: TTreeNode): Boolean; var i: TTreeNode; begin result := FALSE; i := TreeView1.TopItem; while ((i <> NIL) and (NOT result)) do begin if (i <> Node) then if (Text = i.Text) then result := TRUE; i := i.GetNext; end; end;
procedure TForm1.Button1Click(Sender: TObject); var text: String; begin if InputQuery('Neuer Eintrag','Name:',text) then if (NOT NodeExists(text,NIL)) then TreeView1.Items.Add(NIL,text) else ShowMessage('Eintrag existiert bereits!'); end;
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode; var S: String); begin if (NodeExists(S,Node)) then begin ShowMessage('Eintrag existiert bereits!'); S := Node.Text; end; end; |
Tja, (speziell für Coder) scheint mir der Inplace-Editor einfach kein geeignetes Werkzeug zu sein.
cu