Событие 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.