Полный ответ на проект хороший.Но это альтернативный ответ, показывающий, как делать то, что вы хотите, в уже имеющейся форме.
Перейдите в форму и перейдите в раздел интерфейса, в области типов, вне определения класса вашей формы идобавьте тип:
interface
type
TMyEvent = procedure(Sender:TObject;Param1,Param2,Param3:Integer) of object;
TMyForm = class(TForm)
....
Традиционно, но не обязательно, чтобы первым элементом в вашем событии был объект, отправляющий его, но использовался базовый класс TObject вместо фактического типа класса вашей формы.
Другие параметры, приведенные выше, совсем не обязательны, но показывают, как вы можете объявить свои собственные дополнительные данные.если они вам не нужны, просто используйте Sender: TObject.И в этом случае вам вообще не нужно определять TMyEvent, просто используйте тип TNotifyEvent.
Теперь объявите поле, которое использует этот тип, в вашей форме:
TMyForm = class(TForm)
private
FMyEvent : TMyEvent;
...
Теперь объявите свойство, которое обращается к этому полю, в разделе свойств вашей формы:
// this goes inside the class definition just before the final closing end
property MyEvent:TMyEvent read FMyEvent write FMyEvent
Теперь перейдите туда, где вы хотите, чтобы это событие «сработало» (вызывалось, если оно установлено), и напишите это:
// this goes inside a procedure or function, where you need to "fire" the event.
procedure TMyForm.DoSomething;
begin
...
if Assigned(FMyEvent) then FMyEvent(Self,Param1,Param2,Param3);
end;