Другой подход, который стоит здесь использовать, - это использовать интерфейсы, а не сообщения. Преимущество состоит в том, что интерфейсы более специфичны ... сообщения могут быть случайно использованы повторно, если только вы не очень четко определите, где находятся ваши константы сообщений.
Чтобы использовать эту модель, сначала создайте глобальный модуль (или добавьте к существующему) следующие объявления интерфейса:
type
ISpecificSignal = interface
{type CTRL-SHIFT-G here to generate a new guid}
procedure PerformSignal(Handle:Integer);
end;
Затем измените интерфейс формы MAIN, добавив следующее:
TYPE
TMainForm = Class(TForm,ISpecificSignal)
:
private
Procedure PerformSignal(Handle:Integer);
end;
и при реализации процедуры PerformSignal выглядит следующим образом:
Procedure TMainForm.PerformSignal(Handle:Integer);
var
i: Integer;
Intf : ISpecificSignal;
begin
for i := 0 to Pred(Application.MainForm.MDIChildCount) do begin
if Supports(Application.MainForm.MDIChild[i],ISpecificSignal,Intf) and
(Application.MainForm.MDIChild[i].Handle <> Handle) then
Intf.PerformSignal(Handle);
end;
В вашей дочерней форме, которая в конечном итоге должна обрабатывать сигнал, выполните те же шаги, что и для основной формы, но измените PerformSignal, чтобы вызывать нужный код. Повторите при необходимости.
В форме, которая должна фактически запустить процесс, добавьте следующий код:
procedure DoSomething;
var
Intf : ISpecificSignal;
begin
if Supports(Application.MainForm,ISpecificSignal,Intf) then
Intf.PerformSignal(Handle);
end;
Самым большим преимуществом этого подхода является то, что вы не ограничены тем, какие параметры передаются (интерфейс может иметь любое количество параметров или не имеет параметров), и он работает без необходимости прокачки сообщений.
РЕДАКТИРОВАТЬ Добавлен дескриптор, чтобы избежать ситуации, когда существующая форма также нуждается в таких же уведомлениях от других форм.