Autor Beitrag
mk2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

WIN 2000
D4 Prof
BeitragVerfasst: Fr 25.10.02 14:56 
Hi

Es müßte in Delphi doch eigentlich möglich sein, Zeiger auf Funktionen/Prozeduren zu erstellen, im prinzip sowas wie zum Beispiel TButton.onclick.

Wie kann ich aber sowas selber erstellen? Also konkret will ich eine Variable haben, der ich eine Funktion zuweisen kann und mit einem anderen befehl will ich die funktion, die die variable gerade enthält ausführen.

Ist das möglich, wenn ja wie sieht das syntaktisch aus ?
In meinen Delphi-Büchern und in der online hilfe bin ich nicht fündig geworden.

mfg mk2
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 25.10.02 16:01 
Hi!

Hier mal ein Beispiel für eine Funktion, die einen Integerwert zurückliefert.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

//Deklaration des Funktionstypen
type TIntegerFunktion=function:integer of object;

type TMeinObjekt=class(TObject)
  private
    //Zeiger auf die auszuführende Funktion
    FIntegerFunktion:TIntegerfunktion;
  public
    procedure ZeigeWertVonFunktion;
    property Integerfunktion:TIntegerFunktion read FIntegerFunktion write FIntegerFunktion;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    //Funktion, die ausgeführt wird
    function MeineFunktion:Integer;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMeinObjekt }

procedure TMeinObjekt.ZeigeWertVonFunktion;
begin
  //Ist eine Funktion zugewiesen?
  If Assigned(FIntegerFunktion) then
    ShowMessage(IntToStr(FIntegerFunktion))
  else
    raise Exception.Create('Funktion nicht zugeordnet!');
end;

{ TForm1 }

function TForm1.MeineFunktion: Integer;
begin
  //Eine Zufallszahl ausgeben
  Result:=Random(1000);
end;

procedure TForm1.Button1Click(Sender: TObject);
var MeinObjekt:TMeinObjekt;
begin
  //Objekt erstellen
  MeinObjekt:=TMeinObjekt.Create;
  try
    //In TForm1 implementierte Funktion dem Objekt zuweisen 
    MeinObjekt.Integerfunktion:=MeineFunktion;
    //Funktion über Objekt ausführen lassen
    MeinObjekt.ZeigeWertVonFunktion;
  finally
    MeinObjekt.Free;    
  end;
end;

end.


Cu,
Udontknow
TheLaw
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 25.10.02 21:22 
Alles wunderschön.. ist aber leider nur ein Methodenzeiger :?

mfg
Th3Law
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 25.10.02 22:53 
Ein Methodenzeiger ist eine erweiterte Form von Prozedurtypen, die übrigens mit Turbo Pascal 5.0 eingeführt wurden.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TMyProc = procedure(Param1, Param2: Integer);
var
  MyVar: TMyProc;

procedure MeineProzedur(Param1, Param2: Integer);
begin
  // ...
end;

begin
  MyVar := MeineProzedur;
  MyVar(1, 4);
end;

_________________
Ist Zeit wirklich Geld?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 28.10.02 10:00 
Hi!

Nun, wenn er denn tatsächlich eine reguläre Prozedur einbinden will, muss er ja einfach nur das "of object" wegnehmen. Er sprach allerdings von TButton.Onclick, also wird er wohl eher Methodenzeiger gemeint haben. Auch wenn er Prozedur geschrieben hat.

Cu,
Udontknow
mk2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72

WIN 2000
D4 Prof
BeitragVerfasst: Mo 04.11.02 09:30 
danke,

genau das meinte ich.

mfg mk2