![]() |
Adresse eines Objektes
Delphi-Quellcode:
unit A;
interface uses unit B; var ppSystem: array of ^TSystem; res: Integer; begin [ppSystem wird von Hardware mit Adressen gefüllt] //Die Adressen sollen auf die Instanzen von TSystem zeigen, hier als Beispiel nur eine Instanz ppSystem[0]^ := TSystem.Create(); //Methode der Instanz wird aufgerufen, möchte vermeiden hier den Zeiger auf die Instanz mitzugeben res:= ppSystem[0]^.open; end;
Delphi-Quellcode:
Ich benötige in der Instanz von TSystem einen Zeiger auf sich selbst. Ich gehe davon aus, dass self eben genau auf seine Instanz zeigt, sowie in ppSystem[0] ebenso der Zeiger auf diese Instanz enthalten ist.
unit B;
type TSystem = class(TObject) private function open(): Integer; implementation function TSystem.open: Integer; begin //Hier benötige ich den Zeiger auf die Instanz //Self ist hier wohl der falsche Ansatz. result := System_open(self); //self <> ppSystem[0] end; Aber self ist <> ppSystem[0]. Könnt ihr mir helfen? |
Re: Adresse eines Objektes
Klassenvariablen sind schon direkt Zeiger. Deshalb brauchst du da gar keine expliziten Pointer. ;-)
|
Re: Adresse eines Objektes
Hallo :hi:
also Objekte sind bereits Pointer. Ein Objektpointer zeigt auf Daten im Arbeitsspeicher die dieses beschreiben. Vielleicht hilft die folgendes Beispiel das zu verstehen:
Delphi-Quellcode:
Wie gesagt Objekte sind nur Pointer da MyObject ein Pointer ist, der auf Informationen einen Objektes zeigt, verschiede ich nun den Pointer auch in YourObject. Jetzt zeigen beide auf das gleiche Objekt. Wenn man ein Objekt kopieren will, dann muss man es klonen.
var
MyObject : TMyObject; YourObject : TMyObject; begin MyObject := TMyObject.Create; // Erzeugen einer neuen Instanz YourObject := MyObject; // Nun gebe ich YourObject den selben Wert wir MyObject MyObject.XYZ := 12; // Ich setze die fikive Eigenschaft XYZ einfach mal auf 12 if YourObject.XYZ = 12 then ShowMessage('So siehts aus!'); // Ja auch YourObject ist jetzt XYZ = 12 end; Zitat:
Okay jetzt aber zu deinem Problem:
Delphi-Quellcode:
Aber eine Frage habe ich noch, welche Hardware gibt valide Pascal-Objekte zurück, sowas wär mir neu :?
unit A;
interface uses B; var ppSystem: array of TSystem; // Wieso einen Pointer auf einen Pointer, unnötige Rechenaufwand ( ^TSystem, TSystem ist ein Objekt -> auch ein Pointer ) res: Integer; begin [ppSystem wird von Hardware mit Adressen gefüllt] //Die Adressen sollen auf die Instanzen von TSystem zeigen, hier als Beispiel nur eine Instanz ppSystem[0] := TSystem.Create(); // <<-- brauchen wir nicht mehr weil //Methode der Instanz wird aufgerufen, möchte vermeiden hier den Zeiger auf die Instanz mitzugeben res := ppSystem[0].open; // Hier brauchen wir auch kein ^ end;
Delphi-Quellcode:
Keine Ahnung ob das jetzt das ist was du willst. Aber es ist irgendwie komisch das Hardware hier was mit Objekten zu tun hat. Allerhöchsten wenn du mit DirectX oder sowas arbeitest, allerdings sind es dort COM-Interfaces.
unit B;
type TSystem = class(TObject) public function open(): Integer; end; implementation function TSystem.open: Integer; begin //Hier benötige ich den Zeiger auf die Instanz //Self ist hier wohl der falsche Ansatz. result := Integer(self); //self <> ppSystem[0] end; |
Re: Adresse eines Objektes
.. warum willst Du ein dynamisches Array zum Speichern der
Objecte nutzen, dazu gibt es doch TObjectList. Grüße Klaus |
Re: Adresse eines Objektes
Danke für die schnellen und hilfreichen Antworten.
Zitat:
Zitat:
Zur Erklärung meines Problems. Ich habe den C-Code ersetzt, da waren es Doppelpointer auf structs, daher ging ich davon aus, dass ich hier auch einen Doppelpointer auf eine Klasse benötige....bin nun um einiges schlauer. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz