AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Object aus TreeView auslesen

Ein Thema von Chemiker · begonnen am 30. Mär 2007 · letzter Beitrag vom 30. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#1

Object aus TreeView auslesen

  Alt 30. Mär 2007, 10:16
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
TreeView1.Selected.Text wird der richtige Text vom angeklickten Knoten zurückgegeben!


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 10:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 11:48
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 11:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 12:52
Hallo Jelly,

und wie kann ich das ändern?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 14:44
Indem Du dir klar machst, was ein Pointer ist

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.
  Mit Zitat antworten Zitat
Muehle

Registriert seit: 24. Nov 2006
Ort: 92331 Parsberg
24 Beiträge
 
Delphi 2005 Architect
 
#7

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 15:23
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 ???
G.M.
  Mit Zitat antworten Zitat
Muehle

Registriert seit: 24. Nov 2006
Ort: 92331 Parsberg
24 Beiträge
 
Delphi 2005 Architect
 
#8

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 15:27
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 ????
G.M.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 19:03
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.
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Object aus TreeView auslesen

  Alt 30. Mär 2007, 19:05
Hallo,

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

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:56 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