![]() |
TreeList, pointer freigeben
Hallo, ich habe ein Treeview und einige einträge haben Informationen in der Data eigenschaft :
Delphi-Quellcode:
Zum auslesen der Pointer hab ich folgendes :
Type
PMyData = ^TMyData; TMyData = Record IntVal : Integer; End; procedure TMainForm.ComboBox1Change(Sender: TObject); var z,i : Integer; ReNode : TTreeNode; RaNode : TTreeNode; s : String; Str1: String; pData : PMyData; begin Button1.Enabled := False; TreeView1.Items.BeginUpdate; TreeView1.Items.Clear; NewListBox3.Clear; for z := 0 to DKStringGrid4.RowCount - 2 do begin If StrToInt(DKStringGrid4.Cells[0,z]) = ComboBox1.ItemIndex+ 1 then begin i := 2; For i := 2 to StrToInt(DKStringGrid4.Cells[1,z]) do begin CityTable.Locate('Index', DKStringGrid4.Cells[i,z] ,[]); Str1 := CityTable.FieldByName('City').AsString; Str1 := Str1 +' ('+CityTable.FieldByName('Station').AsString+')'; s := s + Str1+ #09; Application.ProcessMessages; end; AddTreeNodePathDupIgnore(TreeView1,s,#09,ReNode); CityTable.Locate('Index', DKStringGrid4.Cells[StrToInt(DKStringGrid4.Cells[1,z])+1, z] ,[]); Str1 := CityTable.FieldByName('City').AsString; s := Str1 +' ('+CityTable.FieldByName('Station').AsString+')'; ReNode := TreeView1.Items.AddChild(ReNode, s); pData := New(PMyData); // Tu aloues de la mémoire pData^.IntVal := z+1; ReNode.Data := pData; s := ''; TreeView1.Items.EndUpdate; Application.ProcessMessages; end; end; Button1.Enabled := True; end;
Delphi-Quellcode:
Wie kann ich den benutzten speicherplatz wieder freigeben?
procedure TMainForm.TreeView1Click(Sender: TObject);
Var pData : PMyData; begin If Assigned(TreeView1.Selected.Data) Then Begin pData := PMyData(TreeView1.Selected.Data); ShowMessage(IntToStr(pData^.IntVal)); end; end; |
Re: TreeList, pointer freigeben
Im Event OnDeletion:
Delphi-Quellcode:
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin if Node.Data <> nil then Dispose(Node.Data); end; |
Re: TreeList, pointer freigeben
Hallo!
Ich möchte hier noch mal anfügen: Mir ist noch nicht klar, wie ich die erzeugten Nodes beim Beenden des Programms wieder freigeben kann. Oder brauche ich das nicht? Ich komme nicht drauf, wie man die sozusagen durchrattert, ohne das ein Node angeklickt wird. Gruß Michael |
Re: TreeList, pointer freigeben
Nodes werden automatisch gelöscht.
Und man könnte auch so vorgehen, falls man nur einen Integer speichern will.
Delphi-Quellcode:
var
myInt, i: Integer; Node: TTreenode; begin //.... Node.Data := Pointer(myInt); // man braucht später nichts zu löschen und auch kein Speichr zu reserviren // wieder zugreifen: i := Integer(Node.Data); end; |
Re: TreeList, pointer freigeben
Nur nochmal um es deutlich zu machen: Wie shmia schon geschrieben hat: Das OnDeletion Event der Treeview wird automatisch aufgerufen mit dem jeweiligen Knoten der entfernt wird. Beim freigeben des Treeviews, wird das OnDeletion Event automatisch nacheinander für alle Nodes ausgelöst.
|
Re: TreeList, pointer freigeben
Nu hab ich es auch kapiert :-)
Danke! |
Re: TreeList, pointer freigeben
Beispiel von sniper_w funktioniert in Delphi 6 nicht!
Komischerweise gibt es keine Fehlermeldung vom Compiler, das die Klasse noch nicht erzeugt wurde (Speicherverletzung). Außerdem kann der Wert nicht wieder zugegriffen werden! "myInt" ist in dem Fall "0"! Trotzdem verwirrend, da es keine Fehlermeldung gibt! |
Re: TreeList, pointer freigeben
Würde er das Objekt
Delphi-Quellcode:
zuvor erzeugen, würde sein Beispiel stimmen.
Node := TreeView1.Items.Add( nil, 'TEST1' );
Oder seh ich da was nicht richtig? |
Re: TreeList, pointer freigeben
Zitat:
Das Beispiel bezieht sich darauf ein vorhandenen TreeNode eines TTreeView zu nutzen. Zitat:
/EDIT: Zu deinem erneuten Beitrag: Ja, dann würde es stimmen. Wenn du in einer anderen Procedure dann auch den Knoten wieder aus dem Treeview herausholst, dann ist auch der Data Inhalt richtig. /EDIT2: Der Compiler warnt bei mir auch richtig vor einer möglicherweise nicht initialisierten Variable, wenn ich das Beispiel 1 zu 1 übernehme... |
Re: TreeList, pointer freigeben
Okay, dann ist´s mir jetzt klar.
Thx Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz