Autor Beitrag
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mo 08.11.04 14:56 
Hi
Ich möchte das man im TreeView einen Namen nur einmal benutzen kann.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var Item: Integer;

{...}

procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
  var S: String);
begin
  for Item:=0 to TreeView1.Items.Count-1 do
  begin
    if TreeView1.Items[Item]<>Node then 
    if TreeView1.Items[Item].Text=S then
    begin
      MessageDlg('Der Name '''+S+''' ist bereits vorhanden.',mtError,[mbOK],0);
      Node.EditText;
      break;
    end;
  end;
end;


Funktioniert irgendwie nicht. :?
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mo 08.11.04 15:11 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure FindDublicateNode(const ATreeView: TTreeView; const S: String);
var
  I: Integer;
begin
  with ATreeView do begin
    for I := 0 to Items.Count - 1 do begin
      if Items[I].Text = S then begin
        ShowMessage(S + ' existiert schon!');
        Exit;
      end;
    end;
  end;
end;

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mo 08.11.04 15:36 
Wie benutzt man das? :?!?:
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mo 08.11.04 16:25 
Achso, dein Code geht nicht so wirklich, da das Item sich ja nicht selbst überprüfen soll. Am ende wäre es das gleiche was ich gemacht habe.

Eigentlich funktioniert es ja auch, aber das " Node.EditText; " wird nicht richtig angezeigt/ausgeführt.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 08.11.04 19:23 
Hast Du schon mal in der OH nachgeschaut, was Node.EditText überhaupt macht?
Sicherlich nicht, denn es steht nicht drin. Also probiert man was anderes, z.B.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
  var S: String);
var Item: Integer;
begin
  for Item:=0 to TreeView1.Items.Count-1 do
  begin
    if TreeView1.Items[Item]<>Node then
    if TreeView1.Items[Item].Text=S then
    begin
      MessageDlg('Der Name '''+S+''' ist bereits vorhanden.',mtError,[mbOK],0);
      S := Node.Text;   // <- hier ist die Änderung.
      break;
    end;
  end;
end;


Und moser bitte nicht nach 3,5 Stunden in anderen Foren, dass dir hier nicht geholfen werden kann... :evil:

_________________
JSXGraph
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mo 08.11.04 19:58 
sorry :flehan: :eyes: (ich wollt nur schnell eine Antwort bekommen)

Aber so richtig ist das auch nicht was ich brauche. :(

Also nachdem man ein Item erstellt hat kann man einen Namen eingeben. (das funktioniert)

Wenn man dann bestätigt, wird TreeView1Edited aufgerufen, in dem überprüft wird ob bereits ein Item mit diesem Namen existiert.
Wenn ja wird eine Fehlermeldung ausgegeben und Node.EditText; ausgeführt damit der User einen anderen Namen eingeben kann.

Das funktioniert ja wie gesagt fast alles. Nur bei Node.EditText; ist plötzlich der Name weg und es kommt so ein 'fester' TextCursor und man kann nichts mehr eingeben. Der Node scheint dann auch nicht ausgewählt zu sein, aber ich hab auch schon TreeView1.Select(Node); ausprobiert.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 10.11.04 00:13 
Titel: Senf...
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 :wink:

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:
ausblenden volle Höhe Delphi-Quelltext
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