Как показать окончательную форму при выходе в Delphi? - PullRequest
2 голосов
/ 18 ноября 2009

Это должно быть просто для кого-то. Я просто не могу понять, как это сделать.

После выхода из моей программы я хочу скрыть основную форму и сделать так, чтобы окончательная форма «Спасибо» появилась сама по себе, например:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := false;
  ThankYouForm.Show;
  MainForm.Close;
end;

Но когда я это делаю, я получаю исключение:

Операция EInvalid: невозможно изменить видимость в OnShow или OnHide

Так как мне показать окончательную форму, скрывая при этом основную форму при выходе из программы в Delphi?


Заключение: Мги подтвердил, что то, что я пытался, было правильным и должно было сработать. Это указывало на то, что где-то в моих процедурах выхода и закрытия из моих форм была ошибка, которая вызвала это исключение.

Теперь, когда я это знаю, мне не понадобится много времени, чтобы найти и исправить проблему.


Обнаружил проблему: я закрывал основную форму изнутри ThankYouForm, и это каким-то образом вернулось обратно в ExitExecute, и, в общем, все скопировалось.

Но все снова хорошо. MainForm.Hide до ThankYouForm.ShowModal работает отлично.

Еще раз спасибо, ребята.

Ответы [ 4 ]

12 голосов
/ 18 ноября 2009

Вместо того, чтобы пытаться вставить что-то в основную форму, перейдите к месту, где вы знаете , все остальное закончено: точка, где возвращается Application.Run. Создайте новую процедуру, которая создаст, покажет и уничтожит вашу форму прощания, а затем вызовите ее в файле DPR следующим образом:

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  TThankYouForm.Execute;
end.

Функция отображения может быть такой же, как у , что продемонстрировал ответ Мги :

class procedure TThankYouForm.Execute;
begin
  with Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
end;
4 голосов
/ 18 ноября 2009

Вы можете сделать это в обработчике OnClose основной формы. Обязательно ShowModal другая форма, потому что в противном случае она будет закрыта сразу, когда закрытие основной формы завершит приложение:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
  Action := caFree;
end;

или даже

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(Application) do
    ShowModal;
  Action := caFree;
end;

И обязательно сделайте поведение необязательным - когда пользователь закрывает приложение, с ним покончено, и не все довольны программами, которые так неохотно уходят.

Edit:

Хорошо, показ такой формы в конце пробного периода действительно имеет смысл. И хотя я не могу точно сказать, почему ваш код вызывает исключение, вы должны быть в состоянии выяснить это путем компиляции с отладочными DCU, установки точки останова на строке, которая вызывает исключение, и изучения трассировки стека. Я предполагаю, что некоторая комбинация свойств формы и вашего кода приводит к другому изменению свойства Visible выше стека, и вам нужно выяснить, что это такое, и исправить это. Код выше должен действительно работать.

0 голосов
/ 20 ноября 2009

Это может быть вызвано разницей между порядком вызовов методов и порядком обработки обработчика сообщений. После того, как ваш метод завершен, в очереди операционной системы все еще есть сообщения, и они отправляются и обрабатываются VCL.

0 голосов
/ 18 ноября 2009

Я бы поместил (попробовал) любой код, представленный выше, в событие OnCloseQuery основной формы. Убедитесь, что можете закрыть: = false, пока не будете готовы закрыть основную форму.

...