Закрытие модальной формы

...я думаю проблема еще в том, что обработчик FormActivate вызывается как часть кода, выполняющегося при перемещении фокуса на новую форму, поэтому Delphi подавляет изменения фокуса во время работы данного обработчика. Если вы когда-нибудь пробовали трассировать изменения фокуса с помощью Windows API, то вы знаете, что изменение фокуса во време его смены приводит к его бесконечному зацикливанию в Windows!!!

Решение должно быть простым. Пошлите форме, которую вы хотите закрыть, в конце обработчика OnActivate сообщение WM_CLOSE. Это сработает, поскольку Windows поместит сообщение в очередь только после того, как будет выполнен обработчик OnActivate (и, следовательно, завершится процедура изменения фокуса).

Я испытывал это с простой программой: одна форма с кнопкой, которая активизурует диалог About, после чего он сам немедленно закрывается. Пример не очень полезен, но цель его - показать принцип.

Unit Form1;

.... (обычная чепуха ) ...

implementation

uses

About;

procedure TForm1.Button1Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;


Unit About;

.... (обычная чепуха ) ...

implementation

uses

Messages;

procedure TAboutBox.FormActivate(Sender: TObject);
begin
PostMessage( Handle, WM_CLOSE, 0, 0 );
end;

Я надеюсь, это поможет. Если нет, извините.

 

Лучший способ: Поместите на модальной форме невидимую кнопку, установите ее собственность ModalResult на mrOK, и поместите следующий код в обработчик события OnActivate:

postmessage(Button1.Handle, wm_mousedown,0,0);
postmessage(button1.Handle, wm_mouseup,0,0);

Функция возвращает idOK, поэтому вы всегда можете узнать, была ли нажата кнопка Отмены.

 
« Предыдущая статья   Следующая статья »