Console型とForm型プログラムを1つの実行ファイルに共存させるには?

解決


なば  2007-12-02 16:33:40  No: 28784

疑問に思ったので質問します。

同じ処理を実行する、コンソール型プログラムと、フォーム表示型プログラムを1つの実行ファイルにまとめることはできますか?

つまり、視覚的に、わかりやすいフォームで、設定パラメータを指定して、メイン処理を実行(途中経過もフォームに表示)したい場合と、
フォーム表示で処理の流れを停止しないで、コマンドラインで引数で設定パラメータを指定して、いっきにメイン処理を実行(途中経過も標準出力)して、終わったら自動終了させたい場合、
の2通りの使い方ができるプログラムを作りたいのですが、
dllにメイン関数をおいて、それをよびだすCUI,GUI用のプログラムを別々に、計3つ作るしかないのでしょうか?

ファイル数を少なくシンプルな形にする良い方法はありませんか?

(Delphi 7, Win xp)


KHE000221  2007-12-02 22:09:36  No: 28785

オプションでコンソール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.

みたいにすれば

処理が終了したらプログラム自体を終了させる事は可能です

(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
    されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが


もにゃ  2007-12-03 12:09:09  No: 28786

たぶんマルチスレッドアプリケーションのことだと思います。
調べてみてください。
半端な知識で挑むとバグだらけになりますがね。


あいまい表現  2007-12-03 18:49:06  No: 28787

>フォーム表示で処理の流れを停止しないで、...
●「処理の流れを停止するようなフォーム」を表示しないで、代わりに標準出力を...
●「あえてフォームを表示するが」処理の流れは停止しないで、標準出力も...

ううん、どっちかな...


なば  2007-12-03 22:50:34  No: 28788

>フォーム表示で処理の流れを停止しないで

KHE000221 さんのような方法も始め考えましたが、
コンソール型プログラム(標準出力)にするのは、
自動で処理して終了させたいというのと、
他のプログラムから呼び出した場合にその出力を得たいという理由もあるので、

あいまい表現 さんへの返答は
●「処理の流れを停止するようなフォーム」を表示しないで、代わりに標準出力を...
のほうです。


むく  2007-12-03 23:17:04  No: 28789

KHE000221さんのソースを若干修正してTThreadを使ったスレッド形式にすれば
可能ではないかと思いますが、どうでしょうか?


なば  2007-12-04 02:38:35  No: 28790

スレッドを使うと、可能なのですか?
検索してもまったく手がかりがつかめなかったので、何か参考になるようなものはないでしょうか?

関係ないかもしれませんが、VLC media player に、Console のインターフェースを追加表示できる機能があるのを思い出しました。
つまり、基本はConsole型で作って、フォーム型にしたいときはConsole型からフォームを生成して、自身のConsoleの窓を閉じる、ということでしょうか?
(できるのか?)


KHE00221  2007-12-04 05:08:57  No: 28791

どうもコンソール型にしないと標準出力ができないみたいなので

>他のプログラムから呼び出した場合にその出力を得たいという理由もあるので、

を考えるとコンソール型にするのは確定ぽいです

あとはコンソール画面をどう表示させないかという事ですが・・・

以下のようにすれば起動直後にコンソール画面は表示されてしまいますが
消す事は可能です

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.


Mr.XRAY  URL  2007-12-04 06:07:37  No: 28792

>(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
>    されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが

以下の様に,コンソールとフォームを同一プロセスで起動すれば,どちらが
終了しても終了します(コンソールもフォームも閉じる).

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_Console2.htm

質問と関係ないレスでゴメンなさい.
本来の質問の方は,動作仕様が理解できないのでパスさせて頂きます.


KHE00221  2007-12-04 07:41:36  No: 28793

>(*) コンソールアプリでもフォームを表示する事は可能なので自動表示
>    されるコンソール画面をアプリ側から消す事ことが出来れば可能ですが

これの意味は 

コンソールアプリで作成するとどうしてコンソールが起動時に表示されてしまうわけで

フォームアプリとして起動したいときにこのコンソールが邪魔なわけで

どうにかしてコンソール画面を表示させずにコンソールアプリを起動できれば

いいなと

起動後にフォーム名からウィンドウ探して消す事はできますが・・・・


Mr.XRAY  URL  2007-12-04 08:40:45  No: 28794

ちょっと的ハズレなレスでしたね. (^_^;)
失礼しました.


なば  2007-12-04 18:41:05  No: 28795

KHE00221 さんのコードで、ほぼ目的とする動作ができました。
ありがとうございます。

ただ、KHE00221 さん自身も書いてますが、フォームを表示するとき一瞬コンソール画面が表示されてしまうのはどうにかならないものでしょうか?

スレッドという言葉がでていましたが、もう関係ないのでしょうか


KHE00221  2007-12-04 20:49:59  No: 28796

作成したEXEのショットカットを作成してレイアウトでウィンドウの位置を
画面外にすればコンソール画面は表示されません・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加