Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа событий форм в TPageControl: причалывание, отчалывание и использование события OnShow для TForm.ManualDock

Delphi , Компоненты и Классы , Свойства и События

Событие OnShow для формы в среде Delphi используется для выполнения действий, когда форма становится видимой. Однако, когда речь заходит о причалывании формы к TPageControl и последующем отчалывании, возникает вопрос о том, следует ли вызывать обработчик события OnShow вручную при использовании TForm.ManualDock.

Проблема

Пользователь столкнулся с проблемой, что причалывание формы к TPageControl и последующее отчалывание вызывают событие FormShow, что подразумевает выполнение связанного с этим событием кода. Это происходит как при создании формы, так и при выполнении TForm.ManualDock. Автор вопроса предполагает, что форма "сбрасывается" при таких операциях, что и является причиной вызова FormShow.

Альтернативный ответ

Предложено, что если текущее поведение является стандартным, то код, который не должен выполняться во время причалывания/отчалывания, следует перенести в обработчик события OnCreate.

Подтвержденный ответ

Согласно документации, событие OnShow формы вызывается при выполнении сообщения CM_DOCKCLIENT, которое используется функцией ManualDock. Это сообщение, в свою очередь, вызывает CM_SHOWINGCHANGED, что и приводит к запуску события OnShow. В примере кода показано, что причалывание формы к TPageControl действительно вызывает OnShow.

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  DockObject: TDragDockObject;
begin
  DockObject := TDragDockObject.Create(Form2);
  try
    PageControl1.Perform(CM_DOCKCLIENT, WPARAM(DockObject), LPARAM(SmallPoint(0, 0)));
  finally
    DockObject.Free;
  end;
end;

Форма Form2 содержит обработчик события OnShow:

procedure TForm2.FormShow(Sender: TObject);
begin
  ShowMessage('FormShow');
end;

Один из способов избежать нежелательного вызова OnShow при причалывании — это не выполнять ManualDock из этого события, а сделать это в событии FormShow вызывающей формы.

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
  Form2.ManualDock(PageControl1);
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  // Здесь не выполняем причалывание, так как это будет сделано в вызывающей форме
end;

Комментарий к ответу

Автор вопроса также отмечает, что FormShow будет вызван после скрытия и последующего показа формы, что может быть нежелательным, если код в FormShow должен выполняться только один раз. В этом случае целесообразнее использовать OnCreate.

Вывод

При использовании TForm.ManualDock важно понимать, что событие OnShow будет вызвано автоматически. Если необходимо избежать выполнения кода в этот момент, следует перенести его в OnCreate. Это позволит избежать нежелательных вызовов и обеспечит более предсказуемое поведение программы.

Создано по материалам из источника по ссылке.

Вопрос связан с использованием событий форм в `TPageControl` в Delphi, в частности, причалыванием, отчалыванием и применением события `OnShow` для `TForm` в контексте `TForm.ManualDock`, и обсуждаются проблемы с вызовом события `FormS


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Свойства и События ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:48:23/0.0035550594329834/0