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