2

これは誰かにとって単純なものでなければなりません。どうすればいいのかわからない。

プログラムを終了したら、メインフォームを非表示にして、次のように最終的な「ありがとう」フォームを単独で表示したいと思います。

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

しかし、それを行うと、例外が発生します。

E無効な操作:OnShowまたはOnHideでVisibleを変更することはできません

では、Delphiでプログラムを終了するときにメインフォームを非表示にしながら、最終的なフォームを表示するにはどうすればよいですか?


結論:Mghieは、私が試みていたことが正しく、機能するはずだったことを確認しました。これは、フォームを終了および終了する手順のどこかに、この例外を引き起こすバグがあったことを示しています。

それがわかったので、問題を見つけて修正するのにそれほど時間はかかりません。


問題が見つかりました:ThankYouForm内からメインフォームを閉じていたところ、どういうわけかExitExecuteにループバックし、すべてがまとまってしまいました。

しかし、すべてが再び順調です。ThankYouForm.ShowModalが完全に機能する前のMainForm.Hide。

みんなありがとう。

4

4 に答える 4

12

何かをメインフォームに靴べらしようとする代わりに、他のすべてが実行を終了したことがわかっApplication.Runている場所、つまり戻るポイントに移動します。別れのフォームを作成、表示、破棄する新しいプロシージャを作成し、次のようにDPRファイルで呼び出します。

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

表示機能は、Mghieの回答が示したものに沿ったものにすることができます。

class procedure TThankYouForm.Execute;
begin
  with Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
end;
于 2009-11-18T06:39:09.317 に答える
4

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;

また、動作をオプションにするようにしてください。ユーザーがアプリを閉じると、アプリは終了します。誰もが、離れたがらないプログラムに満足しているわけではありません。

編集:

OK、試用期間の終わりにそのようなフォームを表示することは確かに理にかなっています。コードで例外が発生する理由はわかりませんが、デバッグDCUを使用してコンパイルし、例外を発生させる行にブレークポイントを設定して、スタックトレースを調べることで確認できるはずです。フォームプロパティとコードの組み合わせによってVisible、スタックの上位にあるプロパティが別の変更につながると思います。それが何であるかを調べて修正する必要があります。上記のコードは実際に機能するはずです。

于 2009-11-18T05:58:43.673 に答える
0

上記で提供されたコードのいずれかをメインフォームのOnCloseQueryイベントに配置(試行)します。メインフォームを閉じる準備ができるまで、:=falseを閉じることができることを確認してください。

于 2009-11-18T14:34:41.573 に答える
0

これは、メソッド呼び出しの順序とメッセージハンドラー処理の順序の違いが原因である可能性があります。メソッドが完了した後も、オペレーティングシステムのキューにメッセージがあり、それらはVCLによってディスパッチおよび処理されています。

于 2009-11-20T03:47:47.753 に答える