Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Probleme mit Objektinstanzpointer (https://www.delphipraxis.net/163028-probleme-mit-objektinstanzpointer.html)

sott1981 13. Sep 2011 13:07

Probleme mit Objektinstanzpointer
 
Hallo!

Habe ein großes Problem und finde einfach nicht die richtige Lösung.


Ich habe 2 verschachtelte TLists.

DeviceList->ItemList


Dabei Nutze ich TItem.OnDataChanged als Multicastsender.

-> procedure OnDataChanged(Sender:TObject;Value:Double);

Jetzt muss ich leider herausbekommen welcher Item OnDataChanged auslöst.


In meiner Itemlist habe ich Items $159ADD8,$159B120 und 159B198.
Aber @Sender entspricht niemals meinen Items.

if Item[I] = Sender then
if @Item[i] = @Sender usw.

Wollte selbst forschen aber wenn ich folgendes Konstrukt mehrfach anwende.

neuesItem := TItem.Create;
DeviceList.ItemList.Add(neuesItem);
neuesItem.Text = IntToHex(integer(@neuesItem),8);

dann haben alle meine Items den gleichen Namen.


Was übersehe ich die ganze Zeit. Bin lamgsam voll verwirrt.

Habt Dank für jeden Hinweis.

DeddyH 13. Sep 2011 13:24

AW: Probleme mit Objektinstanzpointer
 
Hallo und Willkommen in der DP :dp:,

ich habe Dein Konstrukt noch nicht so ganz durchblickt. Sind beide Listen vom Typ TList? Und ItemList ist eine Property von DeviceList? Oder doch eher eine jedes Devices in der DeviceList? Erklär doch noch einmal die Struktur im Detail.

sott1981 13. Sep 2011 13:35

AW: Probleme mit Objektinstanzpointer
 
Hoffe das ist eher verständlich.
Habe eine Liste mit Devices und jedes Device hat ne Liste Items.

Dabei representiert Item einen Messwert-Event. Diesen muss ich gleichzeitig an verschiedene Grafische Darstellungen weiterleiten(Deswegen Multicast).

Type TFormMain = class(TForm)

DeviceList : TList<TDevice>;
end;

type TDevice = class

ItemList : TList<Item>;
end;

type TItem = class

public Text : String;
end;

procedure TFormMain.Create()
var d:TDevice;
i:Titem;
begin



DeviceList := TList<TDevice>.Create;

d := TDevice.create;

DeviceList.Add(d);


i:=TItem.Create;
i.Text = IntToHex(integer(@i),8);
d.ItemList.add(i);


end;

Type TFormMain = class(TForm)

DeviceList : TList<TDevice>;
end;

type TDevice = class

ItemList : TList<Item>;
end;

type TItem = class

public Text : String;
end;

procedure TFormMain.Create()
var d:TDevice;
i:Titem;
begin



DeviceList := TList<TDevice>.Create;

d := TDevice.create;

DeviceList.Add(d);


i:=TItem.Create;
i.Text = IntToHex(integer(@i),8);
d.ItemList.add(i);


end;

DeddyH 13. Sep 2011 13:46

AW: Probleme mit Objektinstanzpointer
 
Irgendwie ist der Code wohl versehentlich doppelt vorhanden. Und benutze bitte Delphi-Tags (entweder über die "Helm"-Schaltfläche im Editor oder händisch mittels [ delphi] und [ /delphi] ohne die Leerzeichen). Gut, Du hast also 2 generische TLists, die Hierarchie ist dann DeviceList -> TDevice -> TItemList -> TItem, habe ich das soweit richtig gelesen? Und ist das per C&P eingefügter Code, oder hast Du den händisch abgeschrieben?

Blup 13. Sep 2011 13:47

AW: Probleme mit Objektinstanzpointer
 
Zitat:

Zitat von sott1981 (Beitrag 1123985)
i:=TItem.Create;
i.Text = IntToHex(integer(@i),8);
d.ItemList.add(i);

Objekt-Variablen sind bereits Pointer die auf das Objekt verweisen, deshalb ermittelt @i die lokale Adresse der Variablen i, nicht wie gewünscht die Adresse des Objekt im Speicher.

Delphi-Quellcode:
 i.Text = IntToHex(Integer(Pointer(i)), 8);

sott1981 13. Sep 2011 13:56

AW: Probleme mit Objektinstanzpointer
 
Ok langsem lerne ich.
Danke schon mal Blup. Ihc wußte das Instanzen Objekte darstellen und wollte das mach um die Adresse vergleichen zu können.

Schließlich ist mein problem folgendes im EventHandler.
Der Vergleich mit dem ich Quelle meines Events erwischen will passt nicht.
Habe auch schon @I = @E probiert bringt nichts.

Langsam habe ich den verdacht das mir die TList den Ärger bereitet.

Delphi-Quellcode:
procedure TFormChart(Sender:TObject; Value:Double)
var I:Integer;
begin
   for I := 0 to FItemLineSeries.Count - 1 do
   begin
      if FDeviceList[I].Item = TSpsItem(Sender) then
      begin
            FItemLineSeries[I].Data.Add(data); // Wert anfügen;
            break;
      end;
   end;
end;


Hier nochmal das Grundgerüst

Delphi-Quellcode:
Type TFormMain = class(TForm)

   DeviceList : TList<TDevice>;
end;

type TDevice = class

   ItemList : TList<Item>;
end;

type TItem = class

   public Text : String;
end;

procedure TFormMain.Create()
var   d:TDevice;
   i:Titem;
begin


   
   DeviceList := TList<TDevice>.Create;
   
   d := TDevice.create;
   
   DeviceList.Add(d);
   
   
   i:=TItem.Create;
   i.Text = IntToHex(integer(@i),8);
   d.ItemList.add(i);
   

end;

DeddyH 13. Sep 2011 13:58

AW: Probleme mit Objektinstanzpointer
 
Müsste es nicht

Delphi-Quellcode:
ItemList : TList<TItem>;
heißen? Und ich bin etwas erstaunt, dass der Compiler wegen der fehlenden Forward-Deklarationen nicht meckert. Allerdings bin ich ehrlich gesagt immer noch Newbee, was Generics angeht, vielleicht ist das da ja etwas anders.

sott1981 13. Sep 2011 14:03

AW: Probleme mit Objektinstanzpointer
 
Gut bin selber erst seit ner Woche mit Delphi drann.

Aber ItemList stellt doch noch nur den Bezeichner dar ?

Also Name : GenericType<DatenType>


Ach je ich will zurück an mein C# das war vorhin das 394356mal das ich

var Integer:I; geschrieben hab.

DeddyH 13. Sep 2011 14:09

AW: Probleme mit Objektinstanzpointer
 
Was ich meinte: statt TList<Item> TList<TItem>, es soll ja eine Liste der Instanzen der Klasse TItem sein.

sott1981 13. Sep 2011 14:14

AW: Probleme mit Objektinstanzpointer
 
ach jetzt ne TItem stimmt schon :oops:


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