Problem mit TTreeView

Rund um die LCL und andere Komponenten
Antworten
t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Problem mit TTreeView

Beitrag von t-z »

Hallo,

ich benutze in einem Programm die Komponente TTreeView. Diese hat (zur Zeit) direkt nach dem Start keinen Eintrag/ einen Starteintrag. Um nun weitere Einträge hinzufügen zu können, behandle ich das OnMouseUp-Event (nur auf Rechtsklick), lese mit

Code: Alles auswählen

PopupNode:=TreeView1.GetNodeAt(X,Y);
den Node aus, öffne ein Popup-Menü, worin dann z.B. mittels

Code: Alles auswählen

Treeview1.Items.InsertBehind(PopupNode,NodeName);
ein neuer Eintrag hinzugefügt wird. In nahezu allen Fällen läuft dies Problemlos. Aber wenn ich zwei mal den obersten, alleinstehenden Eintrag zum Einfügen auswähle wird dieser beim zweiten Mal gelöscht (taucht dann nicht mehr in der Datei erstellt durch

Code: Alles auswählen

TreeView1.SaveToFile(ExtractFilePath(Application.ExeName)+'Test.txt');
auf, ein zugreifen auf den Dritten Eintrag mittels

Code: Alles auswählen

TreeView1.Items.Item[i].Text
führt zu einer Ausnahme).

Code: Alles auswählen

TreeView1.Items.TopLvlCount;
Sagt mir aber immer noch, das drei Einträge vorhanden seien. Wenn schon mehr als diese zwei Einträge da sind, der untere Eintrag ausgewählt wird, auf einen leeren Bereich geklickt wird, oder ein beliebiger Unterpunkt besteht, läuft alles normal. Der Fehler tritt auch auf, wenn alle Elemente bis auf zwei gelöscht wurden.

Weiß jemand, wo der Fehler liegt bzw. wie man ihn umgehen kann?

Zu den Anhängen:
Mit

Code: Alles auswählen

TreeView1.ConsistencyCheck;
tritt die Exception2.png zwei mal auf, danach stürzt das Programm ab. Ohne tritt die Exception1.png einmalig auf, das Programm läuft aber normal weiter und stürzt nicht ab. Allerdings bleibt der Fehler weiterhin bestehen.
Dateianhänge
Exception2.png
Exception2.png (13.63 KiB) 1185 mal betrachtet
Exception1.png
Zuletzt geändert von Lori am Sa 30. Apr 2011, 22:32, insgesamt 1-mal geändert.
Grund: Highlighter

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Problem mit TTreeView

Beitrag von pluto »

Warum fügst du die Einträge mit "Treeview1.Items.InsertBehind(PopupNode,NodeName);" hinzu?
ich kenne wohl Insert... aber nicht InserBehind. Hast du geprüft ob PopupNode ein Wert hat? z.b. mit ShowMessage(Assigned(PopupNode)); ?
MFG
Michael Springwald

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Problem mit TTreeView

Beitrag von t-z »

Für InsertBefore ist es kein Problem, wenn für den vorangehenden Knoten nil übergeben wird. In diesem Fall wird ein Knoten auf unterster Ebene angehängt.
Sicherheitshalber habe ich testweise dies vorher abgefragt und ggf. durch

Code: Alles auswählen

Treeview1.Items.Add(nil,NodeName);
erledigen lassen.
Ebenfalls habe ich mal

Code: Alles auswählen

Treeview1.Items.BeginUpdate;
vor und

Code: Alles auswählen

Treeview1.Items.EndUpdate;
nach dem Hinzufügen gesetzt, obwohl dies meines wissens nach nur verhindert, dass der Bildschirm unnötig oft mit neuem Inhalt aufgefrischt wird - soll also das hinzufügen von vielen Knoten beschleunigen.
Trotz allem tritt der Fehler wie bisher auf.

Code: Alles auswählen

Treeview1.Items.Insert(PopupNode,NodeName)
führt ab dem zweiten Knoten zu der selben Fehlermeldung, wie erste Methode. Dies bleibt bei allen weiteren Konstellationen. Der Fehler tritt hier als immer auf. Allerdings erscheint der Knoten diesmal nicht in der Datei - es steht also immer nur der Erste Knoten drin bzw. alle angehängten.
Insert kommt nicht mit nil als Nachfolgerknoten zurecht. Hier muss zuvor abgefragt werden.

Hier nochmal die beiden Code-Schnipsel (ich habe jeweils den nicht benötigten Block auskommentiert):

Code: Alles auswählen

Treeview1.Items.BeginUpdate;
 
  {if Assigned(PopupNode) then
    Treeview1.Items.InsertBehind(PopupNode,NodeName)
  else
    Treeview1.Items.Add(nil,NodeName);}
 
  if Assigned(PopupNode) then
    Treeview1.Items.Insert(PopupNode,NodeName)
  else
    Treeview1.Items.Add(nil,NodeName);
 
  Treeview1.Items.EndUpdate;
Zuletzt geändert von Lori am Sa 30. Apr 2011, 22:34, insgesamt 1-mal geändert.
Grund: Highlighter

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Problem mit TTreeView

Beitrag von pluto »

ist vielleicht NodeName leer?
MFG
Michael Springwald

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Problem mit TTreeView

Beitrag von t-z »

Dies ist dadurch ausgeschlossen, dass zuvor mit einer InputBox ein Wert eingegeben wird. Abgesichert ist dies zwar noch nicht, ich bin aber auch noch den Grundstein am programmieren. Die Datenordnung soll dabei über die TTreeView-Komponente erfolgen.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Problem mit TTreeView

Beitrag von pluto »

Was ist wenn du komplett InsertBehind weglässt. Versuch mal die Methode AddChild. So kenne ich es jedenfalls. AddChild kannst du ebenfalls ein Parent Übergeben.
MFG
Michael Springwald

Antworten