Delphi-PRAXiS

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)

Christian18 25. Feb 2008 18:26


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

Neutral General 25. Feb 2008 18:29

Re: Suchen einer Methode
 
Hi,

Das dürfte so funktionieren:

Delphi-Quellcode:
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.
EDIT: Alles neu gemacht :mrgreen:

Gruß
Neutral General

Christian18 10. Apr 2008 18:41

Re: Suchen einer Methode
 
Hallo,

kann man irgendwie auch die Methode direkt aufrufen?
Delphi-Quellcode:
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;
MFG Christian18

Christian18 10. Apr 2008 19:11

Re: Suchen einer Methode
 
Hallo,

ich habe es gerade selber herrausgefunden.

Ich habe es so gemacht:

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

Apollonius 10. Apr 2008 19:30

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.

Christian18 10. Apr 2008 20:32

Re: Suchen einer Methode
 
Hallo,

wie kann man es denn besser machen?

MFG Christian18

Neutral General 10. Apr 2008 20:41

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;

Christian18 10. Apr 2008 20:43

Re: Suchen einer Methode
 
Ok, danke funktioniert.

Christian18 10. Apr 2008 20:57

Re: Suchen einer Methode
 
Ich bins nochmal.

Meinst du so?

Delphi-Quellcode:
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.
So funktioniert es doch nicht so wirklich.

sirius 11. Apr 2008 08:02

Re: Suchen einer Methode
 
Delphi-Quellcode:
x.Data=TForm1
wel es ja procedure TForm1.Sieben heißt.

_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 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