Hallo,
alle Events in Delphi sind von der form "TSomeEvent = procedure(param: TXYZ) of object;".
TNotifyEvent ist das, womit alle OnClick-Ereignisse verarbeitet werden. der ist als "procedure(sender: TObject) of object;" definiert.
Indem du nun den out-Parameter (out heißt, er wird vom Callee zugewiesen) "OnCLickEvent" zuweist, gibst du dem caller diese referenz, die er dann aufrufen kann. z.B. so:
Delphi-Quellcode:
//implementation der funktion in der dll
function GetOption(NOption: Integer;
out OnClickEvent: TNotifyEvent): PChar;
begin
Result := PChar(TEventDispatcherSingleton.GetInstance.MenuCaptions[NOption]);
OnClickEvent := TEventDispatcherSingleton.GetInstance.MenuEvents[NOption]);
end;
//aufruf
with TMenuItem.Create(Mainmenu1)
do
begin
Parent := TopItem;
Caption := GetOption(5, OnClickEvent);
//onclickevent muss als variable deklariert worden sein
OnClick := OnClickEvent;
end;
Wie ich mit meinem "TEventDispatcherSingleton" oben schon angedeutet habe, müssen diese Events dann auch auf einen richtigen Event , also die Implementation des Events als Klassenmethode, zugewiesen werden. (Man kann das auch auf freie prozeduren zuweisen, aber das wird dann tricky)
Das TEventDispatcherSingleton sieht dann vielleicht so aus:
Delphi-Quellcode:
type
TEventDispatcherSingleton = class
private
Instance: TEventDispatcherSingleton;
constructor Create;
public
MenuCaptions: array of string;
MenuEvents: array of TNotifyEvent;
procedure OnMenuItemXClick(Sender: TObject); //das muss man dann implementieren
class function GetInstance: TEventDispatcherSingleton; // dort wird geschaut, ob instance belegt ist, wenn ja zurückgegeben, wenn nicht zuerst erzeugt