AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Doppelte Einträge in einem Treeview verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte Einträge in einem Treeview verhindern

Ein Thema von RWarnecke · begonnen am 10. Jun 2009 · letzter Beitrag vom 11. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 19:51
Hallo zusammen,

ich stehe vor dem Problem, dass ich in einem Zweig von einem TreeView doppelte Einträge verhindern möchte. Dazu habe ich den folgenden Versuch angestellt mit dem Ereignis OnEdited :
Delphi-Quellcode:
procedure TMainForm.TV_CategoryEdited(Sender: TObject; Node: TTreeNode;
  var S: string);
begin
  // To search for a duplicated tree node
  if TreeNodeSearch(Node.Parent, S) <> nil then
  begin
    case MessageBox(0, 'Sie haben einen doppelten Eintrag erstellt. Ändern ?', 'Doppelter Eintrag', MB_ICONQUESTION or MB_YESNO) of
      idYes: Node.EditedTex;
      idNo: S := S + ' [new]';
    end;
  end;
end;
Die Funktion "TreeNodeSearch" macht folgendes :
Delphi-Quellcode:
function TMainForm.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;
Die Edit-Funktion klappt leider nicht. Es gibt aber auch keine Fehlermeldung. Wie kann ich diese Edit-Funktion realisieren ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 20:06
Also bei idYes soll der Name gesetzt werden, der vorm umbenennen war?
Delphi-Quellcode:
     
idYes: S := Node.Text; // Setzt wieder alten Wert vorm umbenennen
idNo: S := S + ' [new]';
Node.Text hält noch den alten Namen, der Node steht ja erst kurz davor unbenannt zu werden...

btw: statt [new] würde sich [1]..[n] anbieten


Vielleicht kannst Du was mit anfangen, ansonsten einfach ignorieren
(der Teil für einen Zweig ist alleine ja recht übersichtlich)
Delphi-Quellcode:
function GetUniqueNodeText(aTreeView: TTreeView; aParentNode: TTreeNode;
                           aNodeText : String; OnlyInTwig : Boolean = True): String;
var
  i : Integer;
  sl : TStringList;
begin
  Result := aNodeText;

  {<--- Prüft nur einen Zweig bzw. erste Ebene --->}
  if OnlyInTwig then begin

    i := 0;
    while NodeTextExistsInTwig(aTreeView, aParentNode, Result) do begin
      inc(i);
      Result := aNodeText+'['+IntToStr(i)+']';
    end;

  {<--- Prüft alle Nodes --->}
  end else begin

    sl := TStringList.Create;
    try
      // Namen sammeln, damit Items nicht x-mal durchlaufen werden muss
      // Aufwand relativiert sich bei großen Bäumen
      for i := 0 to aTreeView.Items.Count-1 do
        if Pos(AnsiUpperCase(aNodeText), AnsiUpperCase(aTreeView.Items[i].text)) > 0 then
          sl.Add(AnsiUpperCase(aTreeView.Items[i].text));

      // Prüfen und gg. erweitern
      i := 0;
      while sl.IndexOf(AnsiUpperCase(Result)) >= 0 do begin
        inc(i);
        Result := aNodeText+'['+IntToStr(i)+']';
      end;

    finally
      sl.Free;
    end;

  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 20:46
Hallo Satty67,

danke erstmal für Deine Antwort. Nur leider funktioniert es nicht. Die Funktion "GetUniqueNodeText" die Du gepostet hast, verstehe ich, aber weiss nicht, wie Sie bei meinem Problem weiterhelfen kann. Ich beschreibe nochmal, was ich machen möchte :

Ich gebe den Befehl eine neue Node anzulegen. Der TreeView geht in den Editiermodus und es kann der Name eingegeben werden. Nachdem mit der Enter-Taste bestätigt wird, soll überpüft werden, ob die eingegebene Node in dem Zweig schonmal existiert. Dieses mache ich in dem Ereignis OnEditing durch die IF-Abfrage. Dann soll der User entscheiden über die Case-Anweisung ob der neue Namen geändert werden soll oder nicht. Entscheidet er sich für die Änderung, soll die Node wieder in den Editiermodus versetzt werden. Bei einem "Nein" soll an den bestehenden Namen nur ein "[new]" angehängt werden. Das mit der Verneinung funktioniert, nur leider mit dem Editiermodus nicht.

Muss ich diese Abfrage in ein anderes Ereignis setzen oder habe ich einen Denkfehler in meiner Version ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 20:58
ah OK, Du willst bei idYes zurück in den Editiermodus. Das hatte ich dann falsch verstanden.

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?

PS: function GetUniqueNodeText war als Ersatz für simples anhängen von [new] gedacht. Es kann ja sonst der Fall eintreten, das Du Einträge [new][new] anlegst, falls der Benutzer ständig den gleichen Namen eintippen will.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 21:52
Zitat von Satty67:
PS: function GetUniqueNodeText war als Ersatz für simples anhängen von [new] gedacht. Es kann ja sonst der Fall eintreten, das Du Einträge [new][new] anlegst, falls der Benutzer ständig den gleichen Namen eintippen will.
Ok, danke. Aber erst muss ich es hinbekommen mit der Änderung.

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?
Aber das müsste doch schon der Aufruf node.editedtext erledigen oder ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 10. Jun 2009, 22:01
EditText ruft TreeView_EditLabel (COM-Interface) auf, wenn sich der Node aber wie im aktuellen Fall noch im Editiermodus befindet, passiert nichts (vermute ich jetzt mal).

Es wird mit EditText ja keine Botschaft verschickt, sondern eine Funktion aufgerufen, die den Inplace-Editor aktiviert bzw. aktiviert lässt, wenn er schon aktiv ist.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 11. Jun 2009, 11:49
Zitat von Satty67:
EditText ruft TreeView_EditLabel (COM-Interface) auf, wenn sich der Node aber wie im aktuellen Fall noch im Editiermodus befindet, passiert nichts (vermute ich jetzt mal).

Es wird mit EditText ja keine Botschaft verschickt, sondern eine Funktion aufgerufen, die den Inplace-Editor aktiviert bzw. aktiviert lässt, wenn er schon aktiv ist.
Das Ereignis OnEdited wird doch nach dem Editeren aufgerufen. Ich habe jetzt mal folgendes probiert :
Delphi-Quellcode:
  if TreeNodeSearch(Node.Parent, S) <> nil then
  begin
    case MessageBox(0, PChar(rsDuplicateEntry), PChar(rsDuplicateEntryTitle), MB_ICONQUESTION or MB_YESNO) of
      idYes: begin
        PostMessage(Self.Handle, WM_NOTIFY, TVN_BEGINLABELEDIT, 0);
        Node.Text := S;
      end;
      idNo: S := S + ' [new]';
    end;
  end;
Nur das funktioniert nicht. Ich habe vermutlich das mit der Message falsch gemacht, weiß aber nicht genau wo und wie.

Dazu habe ich noch getestet, wenn ich in der Case-Anweisung bin, liefert mir TV_Category.IsEditing gleich False zurück.

Edit : Die Delphi-Tags korrigiert.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 11. Jun 2009, 12:13
Hallo RWarnecke,

mir ist jetzt nicht ganz klar was Dein Problem ist, aber mit dieser Funktion kann man feststellen, ob man doppelte Einträge im TreeView vorhanden sind.

Delphi-Quellcode:
function IstDoppelt(Nod: TTreeNodes; StrKnoten: String):boolean;
var
  sNode: TTreeNode;
begin
  Result:= FALSE; // Eintrag noch nicht vorhanden.
  sNode:= nod.getFirstNode;
  while sNode <> NIL do // Solange prüfen bis kein Eintrag
  begin
    If (CompareText(sNode.Text, StrKnoten)=0) then // Ist der Knoten schon
    begin // vorhanden?
      Result:= TRUE; // Eintrag vorhanden
    end;
    sNode:= sNode.GetNext; // nächster Knoten prüfen
  end;
end;
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 11. Jun 2009, 12:16
Wäre es so nicht performanter?while (sNode <> NIL) and not Result do Wenn das Ergebnis feststeht, muss man ja nicht weiterprüfen, oder hab ich die Routine falsch verstanden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Doppelte Einträge in einem Treeview verhindern

  Alt 11. Jun 2009, 12:19
Hallo Chemiker,

die doppelten Nodes zu finden ist kein Problem. Schaue nochmals in die Beschreibung von Beitrag #3. Dort habe ich alles genau beschrieben.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz