Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Object aus TreeView auslesen (https://www.delphipraxis.net/89378-object-aus-treeview-auslesen.html)

Chemiker 30. Mär 2007 10:16


Object aus TreeView auslesen
 
Hallo,

ich habe ein Problem beim Anklicken eines Knoten in einem TreeView möchte ich das Object was an TreeView.Data hängt wieder auslesen. Nun ist es egal welchen Konten ich anklicke, es wird immer im Data das letzte Object zurückgegeben. Woran kann es liegen, was machen ich falsch?

Delphi-Quellcode:
procedure TForm1.TreeView1Click(Sender: TObject);
var MSBez3: TMSV1;
    strTest: string;
    Index: integer;
begin
  MSBez3:= TMSV1.Create;
  MSBez3:= TMSV1(TreeView1.Selected.Data); // <---- Es wird immer das letzte Object zurückgegeben?!

  If msBez3 <> NIL then
  begin
    ShowMessage(MSBez3.MaNr+MSBez3.MSNr+MSBez3.MaInhalt+TreeView1.Selected.Text);
  end;


end;
Die Adresse in Data ist immer die gleiche.
Mit
Delphi-Quellcode:
TreeView1.Selected.Text
wird der richtige Text vom angeklickten Knoten zurückgegeben!


Bis bald Chemiker

marabu 30. Mär 2007 10:49

Re: Object aus TreeView auslesen
 
Hallo,

abgesehen davon, dass TMSV1.Create im gezeigten Code ein Speicherloch produziert, vermute ich die Fehlerursache eher dort, wo du die property Data initialisierst. Vielleicht solltest du erstmal überprüfen, ob die in Data abgelegten Zeiger sich wirklich unterscheiden.

Freundliche Grüße

Chemiker 30. Mär 2007 11:48

Re: Object aus TreeView auslesen
 
Hallo marabu,

Die in 'Daten' abgespeicherten Daten unterscheiden sich.
So werden die Objecte im TreeView gespeichert.

Delphi-Quellcode:
for I := 1 to Anzahl do
  begin
    MSBez.MSLesen:= i;
    For z:=0 to TreeView1.Items.Count -1 do
    begin
      if (TreeView1.Items[z].Text = MSBez.MaBez) then
      begin
        if (NOT (IsDuplicateEintrag(m_Ebene4, MSBez.MaNr+MSBez.MSNr,TRUE))) then
        begin
          Daten:= TMSV1.Create;
          Daten:= MSBez;
          m_Ebene4:= TreeView1.Items.AddChildObject(TreeView1.Items[z],
                                         MSBez.MaNr+MSBez.MSNr, Daten);
         {m_Ebene4.StateIndex:=3; }  // MS nicht aktiv
          if MSBez.MSAktiv then
          begin
            m_Ebene4.StateIndex:= 4;
          end
           else
           begin
             m_Ebene4.StateIndex:= 3;
           end;
          If MSBez.DarstellungsArt= 2 then
          begin
            m_Ebene4.ImageIndex := 2;
          end
          else
          begin
            m_Ebene4.ImageIndex:= 1;
          end;
        end;
      end;
    end;
Der Zeiger beim Anklicken der Knoten von Data ist immer gleich.


Bis bals Chemiker

Jelly 30. Mär 2007 11:54

Re: Object aus TreeView auslesen
 
Zeile 10+11:
Delphi-Quellcode:
Daten:= TMSV1.Create;
Daten:= MSBez;
verursacht, dass für jeden Knoten das gleiche Objekt angehängt wird. Dabei wird ja nur der Pointer gesetzt, d.h. wenn du in der Instanz des Objektes ein Attribut änderst, so wird das in allen Knoten eben genauso wiedergespiegelt.

Chemiker 30. Mär 2007 12:52

Re: Object aus TreeView auslesen
 
Hallo Jelly,

und wie kann ich das ändern?

Bis bald Chemiker

Jelly 30. Mär 2007 14:44

Re: Object aus TreeView auslesen
 
Indem Du dir klar machst, was ein Pointer ist :wink:

Ein Objekt, zumindest so wie es in Delphi angesprochen, ist ein 4 Byte grosser Speicherbereich, der lediglich auf den Speicherplatz verweist, wo deine Objektdaten abgelegt sind. Jetzt kannst Du natürlich 2 Variablen anlegen, die auf ein und die gleiche Objektinstanz verweisen. Das Ändern von Attributen bewirkt dann natürlich das Ändern in der gleichen Instanz, egal über welche Variable du zugreifst. Beispiel:

Delphi-Quellcode:
type
  TTest = class
  public
     AnyText : string ;
  end ;

implementation

procedure TForm1.foo ;
var
  T1, T2 : TTest ;
begin
     T1 := TTest.Create ;
     T2 := T1 ;
     T1.AnyText := 'Jelly' ;
     showmessage (T2.AnyText) ;  // Gibt Jelly aus
end ;

end.
Ich das das sollte als Hinweis genug sein, damit Du dein Problem in den Griff kriegst. Du musst eben dafür Sorgen, dass Du unterschiedliche Objekte in den Data-Pointer reinpackst.

Muehle 30. Mär 2007 15:23

Re: Object aus TreeView auslesen
 
Den Create kannst du dir schon mal sparen.
Das Objekt ist ja in Data vorhanden !!!

Bist du dir sicher das die Objekte zu diesen Zeitpunkt noch da sind ???
Wo erzeugst du sie ???

Muehle 30. Mär 2007 15:27

Re: Object aus TreeView auslesen
 
Hab gerade nochmal was nachgelesen :

Daten:= TMSV1.Create; // (1)
Daten:= MSBez;

Zeile (1) kannst du dir wirklich sparen. Du erzeugst ein Objekt Daten
und dann setzt du Daten auf MsBez.

Wie willst du jemals wieder auf das mit TMSV1.Create
erzeugte Objekt zugreifen ????

Chemiker 30. Mär 2007 19:03

Re: Object aus TreeView auslesen
 
Hallo,

jetzt funktioniert es, ich habe beim ersten Versuch übersehen das nur ein Zeiger übergeben wird und so wurden nur vom letzten Object die Daten angezeigt.

Delphi-Quellcode:
for I := 1 to Anzahl do
  begin
    MSBez.MSLesen:= i;
    For z:=0 to TreeView1.Items.Count -1 do
    begin
      if (TreeView1.Items[z].Text = MSBez.MaBez) then
      begin
        if (NOT (IsDuplicateEintrag(m_Ebene4, MSBez.MaNr+MSBez.MSNr,TRUE))) then
        begin
          Daten:= TMSV1.Create;
          // Daten von MSBez in Daten übertragen.
          with MSBez do
          begin
            Daten.MSDateiName:= MSDateiName;
            Daten.MaInhalt:= MaInhalt;
            Daten.MaInhaltDichte:= MaInhaltDichte;
            Daten.MSMECode:= MSMECode;
            Daten.MSBeschr:= MSBeschr;
            Daten.MaBez:= MaBez;
            Daten.MSMessBereichMin:= MSMessBereichMin;
            Daten.MSMessBereichMax:= MSMessBereichMax;
            Daten.MSMessMaxAenderung:= MSMessMaxAenderung;
            Daten.MSMessMinAenderung:= MSMessMinAenderung;
            Daten.MaGruppe1:= MaGruppe1;
            Daten.MaGruppe2:= MaGruppe2;
            Daten.DarstellungsArt:= DarstellungsArt;
            Daten.MaNr:= MaNr;
            Daten.MSNr:= MSNr;
          {  Daten.MSId:= MSId; }
            Daten.MSAktiv:= MSAktiv;
            Daten.MSGeloescht:= MSGeloescht;
          end;
          m_Ebene4:= TreeView1.Items.AddChildObject(TreeView1.Items[z],
                                         MSBez.MaNr+MSBez.MSNr, Daten);

          if MSBez.MSAktiv then
          begin
            m_Ebene4.StateIndex:= 4;
          end
           else
           begin
             m_Ebene4.StateIndex:= 3;
           end;
          If MSBez.DarstellungsArt= 2 then
          begin
            m_Ebene4.ImageIndex := 2;
          end
          else
          begin
            m_Ebene4.ImageIndex:= 1;
          end;
        end;
      end;
    end;
Um die Daten anzuzeigen gehe ich nun so vor:

Delphi-Quellcode:
procedure TForm1.TreeView1Click(Sender: TObject);
var MSBez3: TMSV1;
    strTest: string;
    Index: integer;
begin
  MSBez3:= TMSV1.Create();
  MSBez3:= TreeView1.Selected.Data;
  if MSBez3 <> NIL then
  begin
    MSBez:= MSBez3;
    Button2Click (self);
   end;
end;

Jetzt habe ich noch eine Frage bezüglich der Freigabe des Speichers der Daten von Data von TreeView, geschieht dies automatisch?

Und wie kann man feststellen, dass man Speicherlöscher produziert oder nicht.

marabu 30. Mär 2007 19:05

Re: Object aus TreeView auslesen
 
Hallo,

im Ereignis OnDeletion() der TreeView kannst du deine Objekte wieder freigeben.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.
Seite 1 von 2  1 2      

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