Hallo,
mit dem Problem hab ich auch schon mal gekämpft.
Zitat von
Satty67:
...
Denke beim Ereignis Edited ist der Node noch in der Methode zum ändern des Nodes, weshalb aus dem Ereignis heraus ein erneuter Aufruf scheitert?
€: Vielleicht TVN_BEGINLABELEDIT mit Post-Message bei idYes an den TreeView abschicken, hängt sich ja dann an und ruft den Edit-Modus gleich wieder auf? ...
das ist genau das Problem und der richtige Ansatz.
In OnEdit prüfen ob der Nodetext schon vorhanden ist, wenn ja mit Postmessage eine selbst definierte Message abschicken.
Dadurch kommst Du raus aus dem Ereignis, in dem die Aktivierung des Edit-Modus scheitert.
In der Procedur dann die Problembehandlung durchführen.
Hab Dir eine Beispiel-
Unit zusammengestellt:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;
type
TForm1 =
class(TForm)
TreeView1: TTreeView;
procedure TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S:
String);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
FDupeNodeText :
String;
function TreeNodeSearch(aNode: TTreeNode; SearchItem:
string): TTreeNode;
procedure PM_TVNodeTextAlreadyExists(
var Msg: TMessage);
message WM_USER +1001;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.TreeNodeSearch(aNode: TTreeNode; SearchItem:
string): TTreeNode;
var
I: Integer;
begin
result :=
nil;
if (aNode =
nil)
or (SearchItem = '
')
then Exit;
for I := 0
to aNode.Count - 1
do
begin
if SearchItem = aNode.Item[i].Text
then
begin
Result := aNode.Item[i];
exit;
end;
end;
end;
procedure TForm1.PM_TVNodeTextAlreadyExists(
var Msg: TMessage);
begin
case MessageBox(0, '
Sie haben einen doppelten Eintrag erstellt. Ändern ?',
'
Doppelter Eintrag', MB_ICONQUESTION
or MB_YESNO)
of
idYes: TTreeNode( Msg.WParam ).EditText;
idNo: TTreeNode( Msg.WParam ).Text := FDupeNodeText + '
[new]';
end;
end;
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S:
String);
begin
if TreeNodeSearch(Node.Parent, S) <>
nil then
begin
// neue Caption speichern
FDupeNodeText := S;
// zurücksetzen
S := Node.Text;
// nach dem Ereignis Problem behandeln
PostMessage(
Handle, WM_USER +1001, integer(Node), 0);
end;
end;
end.