Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie ermittelt man die Adresse der Instanz einer Komponente? (https://www.delphipraxis.net/214104-wie-ermittelt-man-die-adresse-der-instanz-einer-komponente.html)

BRobby 16. Nov 2023 17:44

Delphi-Version: 11 Alexandria

Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Hallo zusammen,

ich bräuchte in einer Komponente die konkrete Adresse der Instanz dieser Komponente.
Also z. Bsp.
Delphi-Quellcode:
 
type
   abc = class(tComponent)
     private
       p: Pointer;
       ...
     procedure P1;
   end;

IMPLEMENTATION

procedure abc.P1;
begin
  p:=@self;
  ...
end;
@self funktioniert nicht.

Wie geht es auf anderem Weg?

Dalai 16. Nov 2023 17:50

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
abc ist die Klasse, du willst aber die Instanz bzw. dessen Adresse und für eine solche braucht man eine Variable der entsprechenden Klasse.

Delphi-Quellcode:
type
   abc = class(tComponent)
     private
       i: Integer;
       ...
   end;

procedure A;
var
  Labc: abc;
begin
  DoSomething(@Labc);
end;
Grüße
Dalai

dummzeuch 16. Nov 2023 18:01

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Zitat:

Zitat von BRobby (Beitrag 1529778)
ich bräuchte in einer Komponente die konkrete Adresse der Instanz dieser Komponente.

@self funktioniert nicht.

Wie geht es auf anderem Weg?

Self ein Pointer und der zeigt auf die Instanz, also genau das, was Du suchst, wenn ich das richtig verstanden habe.

Delphi-Quellcode:
procedure abc.P1;
begin
  p:=self;
  ...
end;

BRobby 16. Nov 2023 18:02

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Genau auch meine Überlegung!
Aber es funktioniert nicht !!!
Das ist mein Problem!

himitsu 16. Nov 2023 18:05

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
@Self geht,
wobei das natürlich schwachsinn ist, da du "SO" nur die Adresse der Variable bekommst, in welcher das Self aktuell gespeichert ist.

Normal ist das aber eigentlich keine Speicheradresse, sondern das EAX-Register, beim Start der Methode, wobei es dann oft in den Stack geschoben wird
und du dann den Zeiger auf eine Stelle im Stack bekommst. Und diese Adresse wird nach Ende der Methode selbstverständlich ungültig. :stupid:




Warum ein besch**** Zeiger, anstatt einer Variable vom Instanztyp direkt?

Objekte sind bereits "Zeiger", welche "intern" auf ihren eigenen Speicher zeigen.



Hmmmmm:
Abgesehn davon hat es irgendwie keinen verständlichen Sinn, innerhalb des eigenen Objektes einen Zeiger auf sich selbst zu haben, wo man doch sowieso direkt auf sich selbst zugreifen kann.

Wozu soll das Ganze also eigentlich dienen?

Andreas13 16. Nov 2023 20:21

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Vielleicht hilft es Dir hier weiter: https://www.delphi-treff.de/object-p...ethodenzeiger/

Du brauchst keinen einfachen Pointer, sondern einen Methoden-Pointer = "eine Referenz auf eine Methode einer Instanz einer Klasse". Und das ist ein Record aus u. a. 2 Pointern:
Delphi-Quellcode:
TMethod = record
    Code, Data: Pointer;
  public
   ...
  end;

jaenicke 16. Nov 2023 20:50

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Zitat:

Zitat von BRobby (Beitrag 1529782)
Aber es funktioniert nicht !!!
Das ist mein Problem!

Was heißt, dass es nicht funktioniert? Wie sieht denn der Quelltext aus, der nicht funktioniert?

Kas Ob. 17. Nov 2023 13:21

AW: Wie ermittelt man die Adresse der Instanz einer Komponente?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Simpler ideas:

Code:
procedure TForm10.FormCreate(Sender: TObject);
var
  P: Pointer;
  T: TForm10 absolute P;
begin
  P := Addr(Self);
  P := PPointer(P)^;
end;
Anhang 56454


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