Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TreeList, pointer freigeben (https://www.delphipraxis.net/91403-treelist-pointer-freigeben.html)

DavidKlimas 4. Mai 2007 11:25


TreeList, pointer freigeben
 
Hallo, ich habe ein Treeview und einige einträge haben Informationen in der Data eigenschaft :

Delphi-Quellcode:
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;
Zum auslesen der Pointer hab ich folgendes :

Delphi-Quellcode:
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;
Wie kann ich den benutzten speicherplatz wieder freigeben?

shmia 4. Mai 2007 14:43

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;

glunzl 23. Mai 2007 20:59

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

sniper_w 23. Mai 2007 21:41

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;

Muetze1 24. Mai 2007 11:37

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.

glunzl 24. Mai 2007 11:53

Re: TreeList, pointer freigeben
 
Nu hab ich es auch kapiert :-)

Danke!

Flax 5. Jun 2007 13:34

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!

Flax 5. Jun 2007 13:42

Re: TreeList, pointer freigeben
 
Würde er das Objekt

Delphi-Quellcode:
Node := TreeView1.Items.Add( nil, 'TEST1' );
zuvor erzeugen, würde sein Beispiel stimmen.

Oder seh ich da was nicht richtig?

Muetze1 5. Jun 2007 14:01

Re: TreeList, pointer freigeben
 
Zitat:

Zitat von Flax
Komischerweise gibt es keine Fehlermeldung vom Compiler, das die Klasse noch nicht erzeugt wurde (Speicherverletzung).

Dir ist anscheinend nicht klar, dass es nur ein Auszug mit den für das Beispiel wichtigsten Stellen ist. Er hat nur die Elemente als "lokale Variablen" deklariert, damit jeder um den Typ Bescheid weiss.

Das Beispiel bezieht sich darauf ein vorhandenen TreeNode eines TTreeView zu nutzen.

Zitat:

Zitat von Flax
Außerdem kann der Wert nicht wieder zugegriffen werden! "myInt" ist in dem Fall "0"!

Wenn es der selbe Knoten ist und du was zugewiesen hast, dann glaube ich dass nicht. Zeig mal deinen (kompletten) Code her...

/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...

Flax 5. Jun 2007 14:07

Re: TreeList, pointer freigeben
 
Okay, dann ist´s mir jetzt klar.

Thx Muetze1


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