1

問題は、最初の実行可能ステートメントとして、データベースから読み取れるかどうかを確認したいということです。できない場合は、電話MessageDlgしてその旨を説明し、Halt;.

ただし、ダイアログを閉じた後も、tak マネージャーにアプリケーションが表示されます (アプリケーションを停止して再実行すると、同じことが起こります)。

私が間違っていることは何ですか?


Global.ADQuery1 は、AnyDac データベース アクセス コンポーネントです。IP アドレスで d/b にアクセスします。PC のアドレスを d/b アドレスに設定すると、コードは正常に動作し、IP アドレスを変更すると報告された問題が発生します (したがって、d/b にアクセスできず、例外がスローされます)。

procedure TMainForm.FormCreate(Sender: TObject);
begin
   try
      Global.ADQuery1.Open('SHOW DATABASES');

   except
      On E: Exception do
      begin
         MessageDlg('Database access problem', mtError, [mbOK], 0);
         Halt;
      end;
   end;

[更新] IDEで実行すると、キャッチした後

(EMySQLNativeException) : "[AnyDAC][Phys][MySQL] Can't connect to MySQL server on '10.21.18.211' (10060)"

-をキャッチしEIdWinSockStubError either the program has not called wsastartup or wsastartup failedますが、それがどのようにスローされるかはわかりません...Application.Terminate呼び出しはメインフォームの可能性があると思いますがFormClose、これは私のIndyコンポーネントでは何もしませんが、親フォームが破棄されると、その子はあまりにも。


【追加更新】

私のTMainForm.FormCreate今だけ言う

Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);

そして、すべてのコードを、それを処理する関数の stat に移動しました。その時にすべてが生まれるのではないでしょうか?では、なぜ私の Indy コンポーネントが例外をスローするのでしょうか?

PostMessage()たぶん、[application].pasの後に を入れる必要がありApplication.Run();ますか?

(余談:1)他の人は一般的にどのようにアプリケーションの開始をこの方法で処理しますか? 2) アプリケーションのスケルトンを持っている人はいますか? システムトレイへの最小化を処理するオプション、1つのインスタンスのみを許可するオプション、最近のファイルメニューなどを作成することを考えていました-ただし、別の質問としては良いかもしれません

4

1 に答える 1

8

このHalt手順は、私たちが時々間違えることがある即時のプロセスキラーではありません。プログラムのすべてのユニットのユニット終了セクションを呼び出すため、プログラムはそれらのいずれかでスタックする可能性があり、おそらくフォームに何かが起こるのを待っていますが、OnCreateハンドラーがまだ返されていないため発生しません。

デバッガーを使用して、プログラムが何を行っているか、何を待っているかを調べることができます。

できるだけ早くプログラムから抜け出すには、スキップHaltして に直行してExitProcessください。それが最後のHalt呼び出しです。

Application.Terminate実際には単なるアドバイスコマンドであるため、実際の終了が発生するポイントからははるかに離れています。アプリケーションは、メッセージ ループに到達するまで終了しません。

いっそのこと、プログラムを終了するためのより適切な方法を見つけてください。たとえば、フォームを作成する前にデータベースをテストして、作成途中のフォームが不要になったという厄介な状況に陥らないようにします。

于 2012-08-30T03:46:29.497 に答える