Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suchen einer Methode (https://www.delphipraxis.net/109175-suchen-einer-methode.html)

_frank_ 11. Apr 2008 10:07

Re: Suchen einer Methode
 
Zitat:

Zitat von sirius
Delphi-Quellcode:
x.Data=TForm1
wel es ja procedure TForm1.Sieben heißt.

nicht die klsse in Data sondern die Instanz...also
Delphi-Quellcode:
x.Data=Form1
dann klappts auch ;)

Gruß Frank

Christian18 11. Apr 2008 13:22

Re: Suchen einer Methode
 
Hallo,

ich bekomme das irgendwie nicht hin. Kann mir jemad mal die Komplette Unit posten?

MFG Christian18

_frank_ 11. Apr 2008 14:01

Re: Suchen einer Methode
 
bei mir funktioniert es so:

Delphi-Quellcode:
type
  TMeine = procedure (Sender: TObject) of object;
...
procedure TForm1.Sieben(Sender: TObject);
begin
  Panel1.Visible:=False;
  Panel2.Visible:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var x: TMethod;
      y: TMeine;
begin
  x.Data:=Form1;
  x.Code:=TForm1.MethodAddress('Sieben');
  y:=TMeine(x);

  y(Sender);
end;
Gruß Frank

shmia 11. Apr 2008 14:05

Re: Suchen einer Methode
 
Delphi-Quellcode:
x.Data := TForm1; // Falsch
x.Data := Form1;  // Schlecht: wer sagt denn dass die aktuelle Instanz in der Variablen "Form1" gespeichert ist

x.Data := self;   // Richtig !!

_frank_ 11. Apr 2008 14:11

Re: Suchen einer Methode
 
wenn man das so betrachtet müsste es auch

Delphi-Quellcode:
x.Code:=self.MethodAddress('Sieben');
heisen...wer sagt denn, dass die aktuelle Formular-Klasse TForm1 heist :D

Gruß Frank

shmia 11. Apr 2008 14:56

Re: Suchen einer Methode
 
Zitat:

Zitat von _frank_
wenn man das so betrachtet müsste es auch
Delphi-Quellcode:
x.Code:=self.MethodAddress('Sieben');
heisen...wer sagt denn, dass die aktuelle Formular-Klasse TForm1 heist :D

Nein, das kann man so nicht sehen.
Also in .Data wird der versteckte self-Pointer (32 Bit) transportiert. Also ist es wichtig, dass dieser auf das richtige Objekt zeigt.

In .Code wird die (32 Bit) Adresse des Programmcodes übermittelt.
MethodAddress() ist eine Klassenmethode; d.h. es gibt 2 mögliche Aufrufarten:
A.) objekt.KlassenMethode() oder B.) Klasse.KlassenMethode().

Die Variante B.) ist schneller und auch sicherer.
Variante A.) ist indirekt und ergibt eine Zugriffsverletzung, falls "objekt" = nil sein sollte.
Deshalb ist es empfehlenswert, Klassenmethoden über die Variante B.) aufzurufen.
Als Programmierer zeigt man dem Leser, dass eine Klassenmethode aufgerufen wird und verbessert so die Klarheit des Sourcecode.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
Seite 2 von 2     12   

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