2014-01-21 2 views
1

У меня есть основная форма и другая, «вторичная» форма. Если я сначала закрываю вторичный, вызывается его обработчик OnClose. К сожалению, если я сначала закрываю основную форму, приложение завершается, а OnClose вторичного вызова не вызывается. Это проблема, потому что я хочу сохранить позицию и размер каждой формы до того, как они будут закрыты. Как я могу это решить?Delphi - обработчик OnClose вторичной формы не называется

ответ

3

Удобное место для обработки это будет OnCloseQuery событие основной формы.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
var i : integer; 
begin 
    CanClose := true; 
    if Application.MainForm = self then begin 
    CanClose := MessageDlg('Close the application?', mtConfirmation, 
              [mbYes, mbNo], 0) = mrYes; 
    if CanClose then 
     for i := 0 to Screen.FormCount - 1 do 
     if Screen.Forms[i] <> self then Screen.Forms[i].Close; 
    end; 
end; 

Первая проверка, предложенная выше, полезна только в том случае, если у вас есть несколько экземпляров используемой основной формы. Вторая проверка для self необходима для предотвращения повторного входа.

+0

Спасибо, я выбрал этот подход, потому что мне нужно также сохранить свойство 'Visible'. Это всегда' False' в 'OnDestroy', но оно имеет правильное значение, когда вызывается обработчик 'OnCloseQuery' основной формы. – kol

+0

Нет гарантии, что OnCloseQuery будет вызываться. Подробности: https://groups.google.com/forum/#!msg/borland.public.delphi. objectpascal/82AG0_kHonU/ft53lAjxWRMJ – Ampere

+0

@NAZCA Нет, он не будет вызываться, если программа вызывает 'Application.Terminate' - предположительно, если вы это делаете, это потому, что вы действительно хотите, чтобы приложение немедленно прекратилось. Работа с принудительным завершением во время окон остановка - это другой вопрос в целом, и их следует обрабатывать отдельно. См. Http://stackoverflow.com/q/10745151/327083 –

3

Вы можете использовать OnDestroy вместо OnClose, чтобы сохранить это. И вы, вероятно, следует уничтожить вторичную форму после того, как он будет закрыт (создание перед открытием):

Form2 := TForm2.Create(Application); 
Form2.Open; 

И в Form2.OnClose:

Action := caFree; 

Вы также хотите, чтобы удалить строки в .dpr который автоматически создает вторичные формы:

Application.CreateForm(TForm2, Form2); 

И, возможно, отключите это автообнаружение. В D7: Инструменты >> Параметры среды >> Дизайнер >> Отключить «Автосоздание ...»

Выполнение всего этого позволит вам сохранить некоторую память. Также рассмотрите возможность использования ShowModal вместо Show, когда вы ожидаете, что пользователь закроет вашу вторичную форму, прежде чем вернуться к основному.

+0

Спасибо, 'OnDestroy' всегда вызывается. Единственная проблема заключается в том, что я хочу также сохранить видимость, но 'Visible' всегда' False' в 'OnDestroy' :( – kol

+0

Невозможно вызывать OnDestroy. Подробности: https://groups.google.com/forum /#!msg/borland.public.delphi.objectpascal/82AG0_kHonU/ft53lAjxWRMJ – Ampere

Смежные вопросы