W glownym module zeby nie robic sobie balaganu przenosze funkcje / procedury do zewn modulu .
I nie ma problemu, lecz jezeli chce wywolac np OnKeyPress z automatu program tworzy procedure w glownym.
Czy da sie eventy wywalic do zewnetrznego modulu ?
Tak, w konstruktorze lub OnCreate
:
OnKeyPress:[email protected];
Nie możesz przenieść ciał zdarzeń do osobnego modułu, bo muszą one być zdefiniowane w tym samym module, w którym zadeklarowana jest klasa; Możesz np. przypisać zdarzenie cudzego komponentu;
W każdym razie przypisywane inne zdarzenie musi być procedurą, zawartą w innej klasie; Nie możesz stworzyć sobie zwykłej procedury i ją przypisać, dlatego że potrzebujesz procedury typu TNotifyEvent.
Oczywiście można to obejść, tworząc sobie typ rekordu, zawierającego wskaźnik na metodę oraz wskaźnik na obiekt; Dzięki temu będziesz mógł podpiąć pod zdarzenie dowolną procedurę, egzystującą luzem, a nie wewnątrz innej klasy; Przykład poniżej;
Główny moduł z klasą formularza:
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{...}
uses
Unit2;
type
TMethodPointer = packed record
PMethod: Pointer;
PObject: TObject;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
mpOwnButtonClick: TMethodPointer;
begin
mpOwnButtonClick.PMethod := @Unit2.OwnButtonClick;
mpOwnButtonClick.PObject := nil;
Button1.OnClick := TNotifyEvent(mpOwnButtonClick);
end;
Dodatkowy moduł:
unit Unit2;
interface
uses
Windows;
procedure OwnButtonClick(Sender: TObject);
implementation
uses
Unit1;
procedure OwnButtonClick(Sender: TObject);
begin
MessageBox(Form1.Handle, 'OwnButtonClick works!', 'OwnButtonClick', MB_ICONINFORMATION);
end;
end.
W konstruktorze klasy formularza przypisywana jest do metody zwykła procedura, zawarta w dodatkowym module; Po kliknięciu w przycisk, zostanie wyświetlone okienko z wiadomością.