Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Adresse eines Objektes (https://www.delphipraxis.net/136533-adresse-eines-objektes.html)

uuulf 2. Jul 2009 11:12


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:
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;
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.
Aber self ist <> ppSystem[0]. Könnt ihr mir helfen?

jaenicke 2. Jul 2009 11:20

Re: Adresse eines Objektes
 
Klassenvariablen sind schon direkt Zeiger. Deshalb brauchst du da gar keine expliziten Pointer. ;-)

Desmulator 2. Jul 2009 11:26

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:
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;
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.

Zitat:

Aber self ist <> ppSystem[0]. Könnt ihr mir helfen?
Das ist ja logisch self ist ein Pointer der auf die Informationen zeigt. Nun ist nach deinem Code ppSystem[0] ein Zeiger auf self. Heißt eine Variable die auf einen Bereich im Speicher zeigt, der den Wert von self hat. Also alles ziemlich doppelt gemoppelt.

Okay jetzt aber zu deinem Problem:

Delphi-Quellcode:
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;
Aber eine Frage habe ich noch, welche Hardware gibt valide Pascal-Objekte zurück, sowas wär mir neu :?

Delphi-Quellcode:
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;
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.

Klaus01 2. Jul 2009 11:32

Re: Adresse eines Objektes
 
.. warum willst Du ein dynamisches Array zum Speichern der
Objecte nutzen, dazu gibt es doch TObjectList.

Grüße
Klaus

uuulf 2. Jul 2009 12:55

Re: Adresse eines Objektes
 
Danke für die schnellen und hilfreichen Antworten.

Zitat:

Aber eine Frage habe ich noch, welche Hardware gibt valide Pascal-Objekte zurück, sowas wär mir neu Confused
Ich habe bei der Übergabe stets auf Pointer gecastet und teils als var-Parameter übergeben.

Zitat:

.. warum willst Du ein dynamisches Array zum Speichern der
Objecte nutzen, dazu gibt es doch TObjectList.
Danke. Langsam komme ich mit der Delphihilfe zurecht, fand ich die JAVA API übersichtlicher.

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