Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Перехват событий дочерних MDI-форм

Delphi , Программа и Интерфейс , MDI приложения

Перехват событий дочерних MDI-форм


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!

Ваш код выглядит хорошо, но я хотел бы добавить несколько комментариев и предложений:

  1. В обработчике события FormCreate, вы настраиваете событие OnActiveFormChange объекта Screen, чтобы вызвать процедуру UpdateObjects, когда изменяется активная форма.
  2. Процедура 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-форм, когда изменяется активное окно приложения, для автоматического включения или отключения доступа к некоторым объектам в зависимости от наличия открытых окон.


Комментарии и вопросы


:: 2015-12-15 18:28:27 :: re:Перехват событий дочерних MDI-форм

пользователь: Un.

Очень благодарен!


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: MDI приложения ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-19 17:53:24
2024-05-19 20:32:37/0.0032398700714111/0