Jak zamienić Pointer procedury na TNotifyEvent

0

Witam.

Ktoś podpowie jak w przykładnie:
Rzutowanie metod

type
  TProcedureType = Procedure of Object;

ProcRelay : TProcedureType; przepisać do Event: TNotifyEvent ?

Event ?:= ProcRelay;
2

Coś w ten deseń:

procedure CallMe;
begin
  ShowMessage('CallMe');
end;

procedure TForm1.CallMe2;
begin
  ShowMessage('CallMe2');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Button1Click');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ProcRelay: TProcedureType;
  Event: TNotifyEvent;
begin
  @ProcRelay:= @CallMe; //lub jak nizej
  //@ProcRelay:= @TForm1.CallMe2;
  //@ProcRelay:=  MethodAddress('Button1Click');
  Event:= TNotifyEvent(ProcRelay);
  Button2.OnClick:= Event;
end;

Tylko nie rozumiem po co to?

0

@kAzek jesteś pewny, ze to zadziała? Na pewno się skompiluje ale przecież TNotifyEvent ma parametr a TProcedureType już nie.

0

Dzięki stokrotne.
Ten pierwszy przykład też załapałem ale to się przyda dla innych. Szukałem po necie ale wszędzie twierdzą że takie procedury do wywołania po nazwie muszą być w sekcji published. A jak nie jest to się kompiluje tylko nie działa. To tak dla innych "szukających".

Po co?
Tworzę listę akcji różnych klas, jako ze klasy i część komponentów jest tworzone dynamicznie więc i obsługę chcę trochę zautomatyzować.

Więc w tej chwili:

  1. mam jedną klasę ze zdarzeniami zebranymi z innych klas
  2. dynamiczną listę rekordów ( z AProceduraNazwa: string; AEvent: TNotifyEvent );
  3. teraz dzięki uprzejmości jest procedura, która pozwala zapakować procedurę jako TNotifyEvent do listy
  4. Jeśli mam Menu, Tray to w pętli sprawdzam nazwy TMenuItem (z listy) i w tej samej pętli doklejam TNotifyEvent;

Zamiast dwóch procedur dla Menu i Tray (plus inne) pomnożone przez ilość zdarzeń.. mam dwie linijki w pętli w jednej procedurze które z listy podpinają zdarzenia do np. TMenuItem.OnClick komponentów tworzonych dynamicznie na podstawie tej samej dynamicznej listy zdarzeń, na postawie stringów.
Brak ikonek na razie przeboleję.
Zastanawiam się nad wprowadzeniem do rekordu pozycji nazwa klasy i pobieranie bezpośrednio z jednej klasy a nie ściąganie do jednej z akcjami ale to już makijaż.
Można było zrobić Tliste ale wydaje mi się ze ta lista będzie zajmować mniej miejsca. Wszelkie sugestie mile widziane.

Niestety mam Delphi 2007 a dostałem info że dopiero od 2010 można pobierać listę procedur dla danej klasy w postaci stringów. Więc ten temat muszę odpuścić bo już by było całkiem z automatu.

edit:
Działa, działa.

function  TkExProc.ProcMethod(const MethodName: string): TNotifyEvent;
var
  ProcRelay : TProcedureType;
  Method: TMethod;
begin
  @ProcRelay:= MethodAddress(MethodName);
  Method.Data:= nil;
  Method.Code:= @ProcRelay;
  Result:= TNotifyEvent(Method);
end;

edit:
był Warning ale już dodałem ProcRelay:= nil; i gra.

1 użytkowników online, w tym zalogowanych: 0, gości: 1