...я думаю проблема еще в том, что обработчик 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, поэтому вы всегда можете узнать, была ли нажата кнопка Отмены. [001729]