![]() |
Suchen einer Methode
Hallo,
ist es möglich eine Methode zu finden? Ich habe den Namen der Methode aus einer Datei. Und diese Methode möchte ich einen Button zuweisen. Name aus Datei: ShowFiles Methode: procedure TPrgFiles.ShowFiles(Sender: TObject); MFG Christian18 |
Re: Suchen einer Methode
Hi,
Das dürfte so funktionieren:
Delphi-Quellcode:
EDIT: Alles neu gemacht :mrgreen:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Sieben(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var x: TMethod; begin x.Data := Button1; // Der zukünftige Besitzer der Methode x.Code := TForm1.MethodAddress('Sieben'); // Pointer zur Methode selbst Button1.OnClick := TNotifyEvent(x); end; procedure TForm1.Sieben(Sender: TObject); begin ShowMessage('Sieben!'); end; end. Gruß Neutral General |
Re: Suchen einer Methode
Hallo,
kann man irgendwie auch die Methode direkt aufrufen?
Delphi-Quellcode:
MFG Christian18
procedure TForm1.Button1Click(Sender: TObject);
var x: TMethod; begin x.Data := Button1; // Der zukünftige Besitzer der Methode x.Code := TForm1.MethodAddress('Sieben'); // Pointer zur Methode selbst TNotifyEvent(x); // gefundene Methode direkt hier ausführen ???? geht das?!?!? (so funktioniert es leider nicht) end; |
Re: Suchen einer Methode
Hallo,
ich habe es gerade selber herrausgefunden. Ich habe es so gemacht:
Delphi-Quellcode:
MFG Christian18
procedure TForm1.Neu(Sender: TObject); // Diese Methode soll gefunden werden.
begin ShowMessage('Neu'); end; procedure TForm1.Button1Click(Sender: TObject); begin TProcedure(Form1.MethodAddress('Neu')); // Methode finden und ausführen end; |
Re: Suchen einer Methode
Böse! So kannst du in der Methode weder auf Sender noch auf Self und damit auch nicht auf Felder der Instanz zugreifen.
|
Re: Suchen einer Methode
Hallo,
wie kann man es denn besser machen? MFG Christian18 |
Re: Suchen einer Methode
Hi,
versuchs mal so:
Delphi-Quellcode:
TDeineMethode = procedure (lala: Integer) of object;
var x: TMethod; y: TDeineMethode; begin x.Data := Button1; x.Code := TForm1.MethodAddress('Sieben'); y := TDeineMethode(x); y(5); end; |
Re: Suchen einer Methode
Ok, danke funktioniert.
|
Re: Suchen einer Methode
Ich bins nochmal.
Meinst du so?
Delphi-Quellcode:
So funktioniert es doch nicht so wirklich.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit3, Unit2; type TMeine = procedure (Sender: TObject) of object; type TForm1 = class(TForm) Button1: TButton; Frame21: TFrame2; Frame31: TFrame3; procedure Button1Click(Sender: TObject); procedure Sieben(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Sieben(Sender: TObject); begin Frame21.Visible:=False; Frame31.Visible:=False; end; procedure TForm1.Button1Click(Sender: TObject); var x: TMethod; y: TMeine; begin x.Data:=Button1; x.Code:=TForm1.MethodAddress('Sieben'); y:=TMeine(x); y(Sender); end; end. |
Re: Suchen einer Methode
Delphi-Quellcode:
wel es ja procedure TForm1.Sieben heißt.
x.Data=TForm1
|
Re: Suchen einer Methode
Zitat:
Delphi-Quellcode:
dann klappts auch ;)
x.Data=Form1
Gruß Frank |
Re: Suchen einer Methode
Hallo,
ich bekomme das irgendwie nicht hin. Kann mir jemad mal die Komplette Unit posten? MFG Christian18 |
Re: Suchen einer Methode
bei mir funktioniert es so:
Delphi-Quellcode:
Gruß Frank
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; |
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 !! |
Re: Suchen einer Methode
wenn man das so betrachtet müsste es auch
Delphi-Quellcode:
heisen...wer sagt denn, dass die aktuelle Formular-Klasse TForm1 heist :D
x.Code:=self.MethodAddress('Sieben');
Gruß Frank |
Re: Suchen einer Methode
Zitat:
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 17:17 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