Delphi-PRAXiS

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:

Medium 13. Sep 2011 14:23

AW: Probleme mit Objektinstanzpointer
 
Dennoch ist Blups Einwand sehr wichtig! Der @-Operator gibt dir die Adresse der folgenden Variablen. In deinem Fall dort also die Adresse auf dem Stack, an der "i" liegt, aber du willst den Inhalt von "i" - der ist nämlich die Adresse auf dem Heap, an der deine Instanz liegt. Lass einfach das @ mal komplett weg, überall. Das braucht man i.A. höchstens mal bei Records und Arrays, und auch dann nur, wenn man mit C-like APIs arbeitet, die gerne mal Pointer auf ein erstes Element erwarten. Zusammen mit Objektinstanzen und nur innerhalb Delphi ist @ eigentlich nie wirklich sinnvoll einsetzbar. (Ausser bei so manch fiesem Hack, aber du bewegst dich ja noch weit innerhalb der Abstraktion des OOP-Kissens :) )

DeddyH 13. Sep 2011 14:41

AW: Probleme mit Objektinstanzpointer
 
Nachdem ich mir die ursprüngliche Intention noch einmal durchgelesen habe, denke ich, das Bei Google suchenObserver Pattern könnte hier hilfreich sein.


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