お世話になっております。
Delphi2007,XPです。
Formが複数あります。
条件によって、すべてのFormのCreateFormが終わる前にプログラムを終了させたいのですが、
すべてのFormのCreateFormが終わる前に
Application.Terminate;
を実行すると、
プログラムが終了しません。
Halt;
だと終了しますが、ネットで調べると、あまりHalt;はよろしくないと言う意見が多いです。
どうしたらよろしいでしょうか?
よろしくお願いします。
プロジェクトファイルのところで、
Application.Run; の前で EXIT; を書けばいいです。
でもそれは何が目的でしょうか?
もし条件を判別して、アプリを実行させるかどうかをやるんであれば、
理解できますが.....
同じスレッドを2つ作ってしまってすみません。
にゃさんの言うように、最初に判定して、それからFormを生成しようとして、Form1に
Application.Terminate;
を入れたのですが、その後に
Application.CreateForm(TForm2, Form2);
が実行されてしまいました。
にゃさんの言うとおりにしたいと思っていたのですが、しきれなかったです。
小豚丸さんの言うとおりに、
Application.Run; の前で EXIT; を書くと、必ずソフトがエラーを出して終了してしまうので、条件によってはソフトが動くようにしたいです。
目的を具体的に書くと、
Form1でインターネットを通してサーバに接続し、データをダウンロードします。
ダウンロードした値がOKならば、Form2をCreateFormし、そのままソフトを起動します。
ダウンロードした値がNGならば、Form2をCreateFormせずに、そのままソフトを終了します。
ということがしたいです。
(サーバと通信するところには問題がないので、単純にソフトを終了する方法が知りたいです)
よろしくお願いします。
>ダウンロードした値がNGならば、Form2をCreateFormせずに、そのままソフトを終了します。
>ということがしたいです。
Form2を「自動生成の対象」から「選択可能なフォーム」に移して、
ダウンロードした値がOKならば、Form2をコードで生成すればいいんじゃない?
ところで、
>Form1でインターネットを通してサーバに接続し、データをダウンロードします。
これはどこで実行してるの?
(かなり省略していますが、こんな感じです。)
---------------------------------------------------
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をコードで生成すればいいんじゃない?』
ができれば、解決しますか?
(「選択可能なフォーム」に移して、が、よく分かりません)
よろしくお願いします。
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.
KHE00221さん
ありがとうございます。
開発画面の右上のファイルのProject1.exe上で右クリックしてソース表示してProject1が開いたときに、上記の通りにすればよいんですよね?
この部分は、触ったらいけないと思っていました。この部分も自由に編集していいんですね。
結局、プログラムを起動しても、
Application.Run;
をしなければ、自動的にプログラムは終了してしまう。と考えていいということですかね?
ありがとうございました。
なぜ、
Halt;
がいけないかという理由が知りたいなと思いましたが、解決にします。
ありがとうございました。
大昔のOSは強制終了するとメモリリークが起きた
今のOSはどう終了しても解放してないメモリはOSが解放してくれるので問題ない
ファイルハンドル等のリソースも同じようにOSが責任を持つからOK
編集 削除ありがとうございます。
メモリリークの件は、自分でも少し調べてみました。
だいじょうぶな感じがしました。
情報ありがとうございました。