すべてのFormのCreateFormが終わる前にプログラムを終了させるには?

解決


かんとく  2010-04-06 18:54:07  No: 38207  IP: [192.*.*.*]

お世話になっております。

Delphi2007,XPです。

Formが複数あります。
条件によって、すべてのFormのCreateFormが終わる前にプログラムを終了させたいのですが、
すべてのFormのCreateFormが終わる前に
Application.Terminate;
を実行すると、
プログラムが終了しません。
Halt;
だと終了しますが、ネットで調べると、あまりHalt;はよろしくないと言う意見が多いです。

どうしたらよろしいでしょうか?

よろしくお願いします。

編集 削除
小豚丸  2010-04-07 00:28:41  No: 38208  IP: [192.*.*.*]

プロジェクトファイルのところで、

Application.Run;    の前で  EXIT;  を書けばいいです。

でもそれは何が目的でしょうか?
もし条件を判別して、アプリを実行させるかどうかをやるんであれば、
理解できますが.....

編集 削除
かんとく  2010-04-07 14:54:37  No: 38209  IP: [192.*.*.*]

同じスレッドを2つ作ってしまってすみません。

にゃさんの言うように、最初に判定して、それからFormを生成しようとして、Form1に
Application.Terminate;
を入れたのですが、その後に
Application.CreateForm(TForm2, Form2);
が実行されてしまいました。

にゃさんの言うとおりにしたいと思っていたのですが、しきれなかったです。

小豚丸さんの言うとおりに、
Application.Run;    の前で  EXIT;  を書くと、必ずソフトがエラーを出して終了してしまうので、条件によってはソフトが動くようにしたいです。

目的を具体的に書くと、
Form1でインターネットを通してサーバに接続し、データをダウンロードします。
ダウンロードした値がOKならば、Form2をCreateFormし、そのままソフトを起動します。
ダウンロードした値がNGならば、Form2をCreateFormせずに、そのままソフトを終了します。
ということがしたいです。
(サーバと通信するところには問題がないので、単純にソフトを終了する方法が知りたいです)

よろしくお願いします。

編集 削除
それなら  2010-04-07 15:55:45  No: 38210  IP: [192.*.*.*]

>ダウンロードした値がNGならば、Form2をCreateFormせずに、そのままソフトを終了します。
>ということがしたいです。

Form2を「自動生成の対象」から「選択可能なフォーム」に移して、
ダウンロードした値がOKならば、Form2をコードで生成すればいいんじゃない?

ところで、
>Form1でインターネットを通してサーバに接続し、データをダウンロードします。
これはどこで実行してるの?

編集 削除
かんとく  2010-04-07 16:44:54  No: 38211  IP: [192.*.*.*]

(かなり省略していますが、こんな感じです。)

---------------------------------------------------

procedure TForm1.FormCreate(Sender: TObject);
Begin

  if Dounload='OK' then

  else if Dounload='NG' then
  begin

    Application.MessageBox(pchar('ログインできません。'), pchar('softwarename'), MB_OK  );
    
    Application.Terminate;

    //halt  //haltなら、ここでプログラムが終了します。;
  End;

End;

function tForm1.Download:string;
Begin

  result:=WinInetのInternetReadFile()でリクエスト※ID,パスワードなどをGetで送信するので、アドレスなどここで詳しくかけません。すみません。とにかく、OK か NGが帰ってきます;

End;

-------------------------------------------------

とにかく、NGが帰ってきたら、Formをまったく出さずに、忠告のダイアログだけを出して、すぐにプログラムを終了したいです。

『Form2を「自動生成の対象」から「選択可能なフォーム」に移して、
ダウンロードした値がOKならば、Form2をコードで生成すればいいんじゃない?』
ができれば、解決しますか?
(「選択可能なフォーム」に移して、が、よく分かりません)

よろしくお願いします。

編集 削除
KHE00221  2010-04-07 18:23:10  No: 38212  IP: [192.*.*.*]

program Project1;

uses
  Windows, Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  if Form1.Download = 'OK' then
  begin
    Application.Run;
  end
  else
  begin
    Application.MessageBox(pchar('ログインできません。'), pchar('softwarename'), MB_OK  );
  end;
end.

編集 削除
かんとく  2010-04-08 10:39:01  No: 38213  IP: [192.*.*.*]

KHE00221さん

ありがとうございます。

開発画面の右上のファイルのProject1.exe上で右クリックしてソース表示してProject1が開いたときに、上記の通りにすればよいんですよね?

この部分は、触ったらいけないと思っていました。この部分も自由に編集していいんですね。


結局、プログラムを起動しても、
Application.Run;
をしなければ、自動的にプログラムは終了してしまう。と考えていいということですかね?

ありがとうございました。

編集 削除
かんとく  2010-04-08 10:44:01  No: 38214  IP: [192.*.*.*]

なぜ、
Halt;
がいけないかという理由が知りたいなと思いましたが、解決にします。

ありがとうございました。

編集 削除
Haltで問題ない  2010-04-10 16:50:01  No: 38215  IP: [192.*.*.*]

大昔のOSは強制終了するとメモリリークが起きた
今のOSはどう終了しても解放してないメモリはOSが解放してくれるので問題ない

編集 削除
Haltで問題ない  2010-04-10 16:51:01  No: 38216  IP: [192.*.*.*]

ファイルハンドル等のリソースも同じようにOSが責任を持つからOK

編集 削除
かんとく  2010-04-12 18:47:34  No: 38217  IP: [192.*.*.*]

ありがとうございます。

メモリリークの件は、自分でも少し調べてみました。

だいじょうぶな感じがしました。

情報ありがとうございました。

編集 削除