AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeList, pointer freigeben

Offene Frage von "DavidKlimas"
Ein Thema von DavidKlimas · begonnen am 4. Mai 2007 · letzter Beitrag vom 5. Jun 2007
Antwort Antwort
DavidKlimas

Registriert seit: 24. Sep 2006
Ort: Arlon, Belgien
71 Beiträge
 
#1

TreeList, pointer freigeben

  Alt 4. Mai 2007, 12:25
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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: TreeList, pointer freigeben

  Alt 4. Mai 2007, 15:43
Im Event OnDeletion:
Delphi-Quellcode:
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
   if Node.Data <> nil then
      Dispose(Node.Data);
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von glunzl
glunzl

Registriert seit: 21. Mär 2004
Ort: Reinbek
119 Beiträge
 
Delphi 7 Professional
 
#3

Re: TreeList, pointer freigeben

  Alt 23. Mai 2007, 21:59
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
Michael
--
10 Jahre Step5 entschuldigen hoffentlich meinen Programmierstiel!
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: TreeList, pointer freigeben

  Alt 23. Mai 2007, 22:41
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;
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: TreeList, pointer freigeben

  Alt 24. Mai 2007, 12:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von glunzl
glunzl

Registriert seit: 21. Mär 2004
Ort: Reinbek
119 Beiträge
 
Delphi 7 Professional
 
#6

Re: TreeList, pointer freigeben

  Alt 24. Mai 2007, 12:53
Nu hab ich es auch kapiert

Danke!
Michael
--
10 Jahre Step5 entschuldigen hoffentlich meinen Programmierstiel!
  Mit Zitat antworten Zitat
Flax

Registriert seit: 12. Mär 2003
76 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: TreeList, pointer freigeben

  Alt 5. Jun 2007, 14:34
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!
  Mit Zitat antworten Zitat
Flax

Registriert seit: 12. Mär 2003
76 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: TreeList, pointer freigeben

  Alt 5. Jun 2007, 14:42
Würde er das Objekt

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

Oder seh ich da was nicht richtig?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: TreeList, pointer freigeben

  Alt 5. Jun 2007, 15:01
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 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...
  Mit Zitat antworten Zitat
Flax

Registriert seit: 12. Mär 2003
76 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: TreeList, pointer freigeben

  Alt 5. Jun 2007, 15:07
Okay, dann ist´s mir jetzt klar.

Thx Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:23 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