Сценарий таков: у меня есть родительская форма, которая создает дочернюю форму, для связи между ними в родительском объекте создается объект пользовательского типа события.Handel родительской формы передается в качестве параметра в процедуру создания события.
В дочерней форме создается свойство пользовательского типа события того же типа, что и родительская форма, а затем во время созданиядочерняя форма, из родительского объекта родительский объект приравнивается к дочернему свойству, например: propForm.CreateScheduleEvent: = CreateScheduleFormEvent;
В сценарии, в котором используются только родительская форма и соответствующая дочерняя форма,обратный вызов работает без проблем.
В сценарии создания нескольких родительских форм с соответствующими дочерними формами событие распознается только последней созданной родительской формой, независимо от того, какую дочернюю форму выполнило пользовательское событие.Предположительно, если в каждой родительской форме активирован объект типа слушателя (внимательный к вызовам возврата пользовательского события), в момент выполнения пользовательского события должен быть запущен цикл, который прослушивает каждую родительскую форму, что является причинойдля использования переменной handle, но только результат. Он запускается только один раз.
Пользовательское объявление события:
TCreateScheduleEvent = procedure(source: HWND; GroupSchedule: TGroupSchedule) of object;
TNewScheduleFormEvent = class
private
FCreateScheduleForm: TCreateScheduleEvent;
FHandle: Int64;
public
constructor Create(source: HWND);
property OnCreateScheduleForm: TCreateScheduleEvent read FCreateScheduleForm write FCreateScheduleForm;
property Source: Int64 read FHandle write FHandle;
procedure CreateScheduleForm(GroupSchedule: TGroupSchedule);
end;
//TNewScheduleFrmEvent
constructor TNewScheduleFormEvent.Create(source: HWND);
begin
inherited Create;
FHandle:= source;
end;
procedure TNewScheduleFormEvent.CreateScheduleForm(GroupSchedule: TGroupSchedule);
begin
{ Call the registerd event only if there is a listener }
if Assigned(FCreateScheduleForm) then FCreateScheduleForm(FHandle, GroupSchedule);
end;
Родительская реализация:
TFileListener = class
procedure CreateScheduleFormEvent(source: HWND; GroupSchedule: TGroupSchedule);
end;
.........
private
{ Private declarations }
FileListener: TFileListener;
CreateScheduleFormEvent : TNewScheduleFormEvent;
........
procedure TFileListener.CreateScheduleFormEvent(source: HWND; GroupSchedule: TGroupSchedule);
begin
if FormHandle = source then
begin
...............
end;
end;
........
//OnCreate
FileListener := TFileListener.Create();
FormHandle:= Handle;
CreateScheduleFormEvent:= TNewScheduleFormEvent.Create(FormHandle);
CreateScheduleFormEvent.OnCreateScheduleForm:= FileListener.CreateScheduleFormEvent;
//Child form
propForm:= TfrmPropList.Create(Self);
propForm.PopupMode:= pmExplicit;
propForm.Parent:= Parent;
propForm.CreateScheduleEvent:= CreateScheduleFormEvent;
propForm.Show;
Реализация дочерней формы:
private
{ Private declarations }
FCreateScheduleEvent : TNewScheduleFormEvent;
........
public
{ Public declarations }
property CreateScheduleEvent: TNewScheduleFormEvent read FCreateScheduleEvent write FCreateScheduleEvent;
......
//Event Execution
CreateScheduleEvent.OnCreateScheduleForm(CreateScheduleEvent.Source, GroupSchedule);
Вопрос: какова будет правильная или лучшая конфигурация настраиваемого события, чтобы можно было иметь несколько родительских форм с соответствующими дочерними формами и когдаНажмите кнопку, чтобы выполнить пользовательское событие из дочерней формы, это событие будет слышно правильным родителем, даже если родительская форма не имеет активированного фокуса.
Разъяснение проблемы:
Дочерняя форма создается из родительской формы
В ChilВ форме есть кнопка, которая должна иметь возможность отправлять сообщение в родительскую форму, чтобы можно было выполнить любое действие или метод.
- Создается класс типа события для установления связи между родительской формой.и детская форма.В качестве помощи для распознавания родительской формы дочерней формой, для создания класса события родительский дескриптор передается в качестве параметра события create.
Объект типа события слушателя имеет видсоздается в родительской форме и связывается с классом событий для прослушивания дочерней формы.
CreateScheduleFormEvent: = TNewScheduleFormEvent.Create (FormHandle);CreateScheduleFormEvent.OnCreateScheduleForm: = FileListener.CreateScheduleFormEvent;propForm.CreateScheduleEvent: = CreateScheduleFormEvent;
Если есть только одна родительская форма с дочерней формой, событие из дочерней формы правильно воспринимается ее родительской формой.
Если существует несколько родительских форм одного типа, каждая со своим соответствующим дочерним элементом, событие не слышится соответствующими родителями, то есть, если от child1 событие выполняется, оно должно быть услышано родительским элементом1, и еслиэто выполняется от child2, это должно быть услышано от parent2.
В случае нескольких родителей с их соответствующими детьми событие, выполненное любым из детей, child1 ... child10, слышно только отпоследний родитель создал родителя10 ..
Какова правильная конфигурация персонализированных событий между родительскими формами и дочерними формами, когда родители одного типа, а потомки одного типа, оба являются дубликатами двух основныхформы.При выполнении события в дочерней форме оно должно прослушиваться только его соответствующим родителем, а не другим экземпляром той же родительской формы.