Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zeiger auf Funktionen/Prozeduren
mk2 - Fr 25.10.02 14:56
Titel: Zeiger auf Funktionen/Prozeduren
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 - Fr 25.10.02 16:01
Hi!
Hier mal ein Beispiel für eine Funktion, die einen Integerwert zurückliefert.
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 - Fr 25.10.02 21:22
Alles wunderschön.. ist aber leider nur ein Methodenzeiger :?
mfg
Th3Law
AndyB - Fr 25.10.02 22:53
Ein Methodenzeiger ist eine erweiterte Form von Prozedurtypen, die übrigens mit Turbo Pascal 5.0 eingeführt wurden.
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; |
Udontknow - 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 - Mo 04.11.02 09:30
danke,
genau das meinte ich.
mfg mk2
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!