procedure TMainForm.FormCreate(Sender: TObject);
begin{ здесь разместите код FormCreate }
Screen.OnActiveFormChange := UpdateObjectss;
{ и здесь тоже, если нужно... }end;
procedure TMainForm.UpdateObjects(Sender: TObject);
begin
<имяобъекта>.Enabled := MDIChildCount > 0;
end;
(MDIChildCount > 0) возвращает true, если открыто _любое_ дочернее окно, и
false в противном случае. Так, вы не должны беспокоиться о количестве открытых
дочерних окон.
Here's the translation:
Вечная погоня за уловлением событий child в приложении MDI!
Ваш код выглядит хорошо, но я хотел бы добавить несколько комментариев и предложений:
В обработчике события FormCreate, вы настраиваете событие OnActiveFormChange объекта Screen, чтобы вызвать процедуру UpdateObjects, когда изменяется активная форма.
Процедура UpdateObjects - это хороший старт, но она только отключает/включает объект (<имяобъекта>) в зависимости от наличия открытых child форм или нет.
Вот альтернативный подход:
Вместо настройки обработчика события OnActiveFormChange, вы можете использовать события OnCreate и OnDestroy child форм, чтобы обновить основную форму. Таким образом, вам не нужно заботиться о том, чтобы отслеживать активную форму.
Вот обновленная реализация:
procedure TMDIChild.FormCreate(Sender: TObject);
begin
// Регистрируйте эту child форму в основной форме
MainForm.RegisterChildForm(Self);
end;
procedure TMDIChild.FormDestroy(Sender: TObject);
begin
// Дeregister this child form in the main form
MainForm.UnregisterChildForm(Self);
end;
В вашей MainForm:
type
TMainForm = class(TForm)
...
private
FChildForms: TList<TMDIChild>;
procedure RegisterChildForm(AChildForm: TMDIChild);
procedure UnregisterChildForm(AChildForm: TMDIChild);
end;
... ...
procedure TMainForm.RegisterChildForm(AChildForm: TMDIChild);
begin
// Добавьте child форму в список зарегистрированных форм
FChildForms.Add(AChildForm);
end;
procedure TMainForm.UnregisterChildForm(AChildForm: TMDIChild);
begin
// Удалите child форму из списка зарегистрированных форм
FChildForms.Remove(AChildForm);
end;
Теперь вы можете обновлять UI основной формы в зависимости от наличия или отсутствия child форм:
procedure TMainForm.UpdateObjects(Sender: TObject);
var
i: Integer;
begin
// Отключайте/включайте объект в зависимости от наличия child форм
for i := 0 to FChildForms.Count - 1 do
(<имяобъекта>).Enabled := FChildForms[i] <> nil;
end;
Этот подход более robust и легче поддерживать, потому что вам не нужно заботиться о том, чтобы отслеживать активную форму или использовать события, которые могут не быть вызваны в всех сценариях.
В статье описывается способ перехвата событий дочерних MDI-форм, когда изменяется активное окно приложения, для автоматического включения или отключения доступа к некоторым объектам в зависимости от наличия открытых окон.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.