疑問に思ったので質問します。
同じ処理を実行する、コンソール型プログラムと、フォーム表示型プログラムを1つの実行ファイルにまとめることはできますか?
つまり、視覚的に、わかりやすいフォームで、設定パラメータを指定して、メイン処理を実行(途中経過もフォームに表示)したい場合と、
フォーム表示で処理の流れを停止しないで、コマンドラインで引数で設定パラメータを指定して、いっきにメイン処理を実行(途中経過も標準出力)して、終わったら自動終了させたい場合、
の2通りの使い方ができるプログラムを作りたいのですが、
dllにメイン関数をおいて、それをよびだすCUI,GUI用のプログラムを別々に、計3つ作るしかないのでしょうか?
ファイル数を少なくシンプルな形にする良い方法はありませんか?
(Delphi 7, Win xp)
オプションでコンソールEXEを作成するってのがある時点で無理ぽいですが
>フォーム表示で処理の流れを停止しないで、コマンドラインで引数で設定パ>ラメータを指定して、いっきにメイン処理を実行(途中経過も標準出力)し>て、終わったら自動終了させたい場合、
ならば
標準出力ではないですが、
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
if ParamStr(1) = '/WIN' then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Form2 := TForm2.Create(nil);
Form2.Show;
Form2.Memo1.Lines.Add ('処理開始');
//処理
Form2.Memo1.Lines.Add ('処理終了');
Form2.Release;
end;
end.
みたいにすれば
処理が終了したらプログラム自体を終了させる事は可能です
(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが
たぶんマルチスレッドアプリケーションのことだと思います。
調べてみてください。
半端な知識で挑むとバグだらけになりますがね。
>フォーム表示で処理の流れを停止しないで、...
●「処理の流れを停止するようなフォーム」を表示しないで、代わりに標準出力を...
●「あえてフォームを表示するが」処理の流れは停止しないで、標準出力も...
ううん、どっちかな...
>フォーム表示で処理の流れを停止しないで
KHE000221 さんのような方法も始め考えましたが、
コンソール型プログラム(標準出力)にするのは、
自動で処理して終了させたいというのと、
他のプログラムから呼び出した場合にその出力を得たいという理由もあるので、
あいまい表現 さんへの返答は
●「処理の流れを停止するようなフォーム」を表示しないで、代わりに標準出力を...
のほうです。
KHE000221さんのソースを若干修正してTThreadを使ったスレッド形式にすれば
可能ではないかと思いますが、どうでしょうか?
スレッドを使うと、可能なのですか?
検索してもまったく手がかりがつかめなかったので、何か参考になるようなものはないでしょうか?
関係ないかもしれませんが、VLC media player に、Console のインターフェースを追加表示できる機能があるのを思い出しました。
つまり、基本はConsole型で作って、フォーム型にしたいときはConsole型からフォームを生成して、自身のConsoleの窓を閉じる、ということでしょうか?
(できるのか?)
どうもコンソール型にしないと標準出力ができないみたいなので
>他のプログラムから呼び出した場合にその出力を得たいという理由もあるので、
を考えるとコンソール型にするのは確定ぽいです
あとはコンソール画面をどう表示させないかという事ですが・・・
以下のようにすれば起動直後にコンソール画面は表示されてしまいますが
消す事は可能です
var
I : Integer;
begin
if ParamStr(1) = 'CON' then
begin
WriteLn('Hello');
end
else
if ParamStr(1) = 'GUI' then
begin
//コンソールウィンドウを隠す
I := FindWindow(0,PChar(ParamStr(0)));
if I<>0 then
begin
ShowWindow(I,SW_HIDE);
end;
//
MessageBox(0,'Hello','',0);
end;
end.
>(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
> されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが
以下の様に,コンソールとフォームを同一プロセスで起動すれば,どちらが
終了しても終了します(コンソールもフォームも閉じる).
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_Console2.htm
質問と関係ないレスでゴメンなさい.
本来の質問の方は,動作仕様が理解できないのでパスさせて頂きます.
>(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
> されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが
これの意味は
コンソールアプリで作成するとどうしてコンソールが起動時に表示されてしまうわけで
フォームアプリとして起動したいときにこのコンソールが邪魔なわけで
どうにかしてコンソール画面を表示させずにコンソールアプリを起動できれば
いいなと
起動後にフォーム名からウィンドウ探して消す事はできますが・・・・
ちょっと的ハズレなレスでしたね. (^_^;)
失礼しました.
KHE00221 さんのコードで、ほぼ目的とする動作ができました。
ありがとうございます。
ただ、KHE00221 さん自身も書いてますが、フォームを表示するとき一瞬コンソール画面が表示されてしまうのはどうにかならないものでしょうか?
スレッドという言葉がでていましたが、もう関係ないのでしょうか
作成したEXEのショットカットを作成してレイアウトでウィンドウの位置を
画面外にすればコンソール画面は表示されません・・・
ツイート | ![]() |