Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TreeView - AddObject Pointerproblem (https://www.delphipraxis.net/91680-treeview-addobject-pointerproblem.html)

Neutral General 8. Mai 2007 16:24


TreeView - AddObject Pointerproblem
 
Hi,

Ich füge so Nodes hinzu:

Delphi-Quellcode:
 
var tmp: TAnswer;
begin
  if TreeView1.Selected.IsFirstNode then
  begin
    // dieses TreeView1.Selected.Data wurden im FormCreate schon gesetzt...
    tmp := PDialogue(TreeView1.Selected.Data)^.Answers.Add('Neue');
    tmp.Text.Add('Bitte Text einfügen');
    TreeView1.Items.AddChildObject(TreeView1.Selected,'Neue',@tmp);
  end
  else
  begin
    // Wenn man auf ein Child-Node ausgewählt hat
    // TreeView1.Selected.Data müsste jetzt ein @tmp sein das oben in dem Node gespeichert wurde
    // Das ist es auch.. aber komischerweise ist PAnswer(TreeView1.Selected.Data)^.Answers = nil
    tmp := PAnswer(TreeView1.Selected.Data)^.Answers.Add('Neue'); // AV
    tmp.Text.Add('Bitte Text einfügen');
    TreeView1.Items.AddChildObject(TreeView1.Selected,'Neue',@tmp)
  end;
Es steht alles im Quelltext.. Ich verstehe halt nicht warum dann Answers = nil ist...
Wenn ihr nicht kapiert was ich will dann schreibt das bitte :mrgreen:

Gruß
Neutral General

SirThornberry 8. Mai 2007 17:09

Re: TreeView - AddObject Pointerproblem
 
tmp ist eine lokale Variable. Durch dein Add bekommst du ein TAnswer zurück und weißt es tmp zu. Den Zeiger auf Tmp weißt du dann data zu (durch AddObject). Und genau da ist der Fehler!
Letzendlich weißt du einen Pointer auf den Stack zu. Nach verlassen der procedure wird tmp vom stack entfernt und dein Pointer zeigt auf eine Stelle im Stack wo nichts mehr liegt bzw. inzwischen was anderes.

Letztendlich machst du es dir einfach zu schwer. TAnswer ist eine ObjectInstanz und somit ein Pointer! Du brauchst also nicht den Pointer auf den Pointer zuweisen sondern kannst auch direkt die Objectinstanz auf Data zuweisen. Dementsprechend brauchst du dann auch nicht auf PAnswer casten und zu dereferenzieren sondern kannst gleich auf TAnswer casten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 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