お世話になります。
XE〜D10.2を利用しているのですが、「 {$APPTYPE CONSOLE}」を
条件付で追加したりする事ができないでしょうか?
現在は、コンパイル前に追加・削除等していますがコンパイル後でも
例えば、iniに設定しておき必要な時だけ表示させる等させたいと思っております。
プログラム中にif 〜then 等で{$APPTYPE CONSOLE}がONになるように
する事もわからないためご教授いただけましたらと幸いです。
以上、よろしくお願い致します。
Application の種類(Delphi) - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Rio/ja/Application_%E3%81%AE%E7%A8%AE%E9%A1%9E%EF%BC%88Delphi%EF%BC%89
にあるとおり、このコンパイラ指令はコンパイルオプションと等価のものなので、実行時に切り替えられる性質のものではありません。
何をしたいのかが提示されていないのでアレですが、たとえば同一のプロジェクトグループにGUIアプリケーションとコンソールアプリケーションを用意して、どちらかを実行する、とか、GUIアプリケーションとして作っておいてコンソールで動作させたいときはプロジェクトソースの Application.* の行を実行させずに(バイパスさせて)コンソールアプリケーションとしての動作をさせるとか、そんなのはどうでしょう?
通りすがり様
ご回答いただきありがとうございます。
切り替えられるものではないのですね。
コンソール画面はデバッグ時に使用しております。
エンドユーザーとデバッグ時の切り替えが面倒といいますか
そのまま残してしまうとユーザー側に表示されてしまい
デバッグ時に出ていないとWritelnでエラーを出す。
といった事が起きるので、環境が変わった場合に自動的に出ないようにできないものかと考えておりました。
先程、調べていてShowWindow(GetConsoleWindow, SW_HIDE) が利用できそうかとも
思ったのですが、一瞬窓が出てしまうためユーザーからは「何か黒い画面が一瞬出るんですけど?」みたいな問い合わせがありそうで
起動時から、これが隠せていたら良いのですがもう少し複雑な事しないと無理でしょうか。
もしくは、この画面と通常のコンソール画面の違いを理解していないのですが
起動後、DOS画面等を立ち上げそちらに投げるといった事でも考えるしかないかもですね。
ただ、そうなるとコンソール画面を立ち上げるまでのデバッグ情報を出力できないという事になりますね。
そういう用途であればOutputDebugString関数を使うのはどうですか?
https://docs.microsoft.com/en-us/windows/desktop/api/debugapi/nf-debugapi-outputdebugstringa
DelphiのIDEとか、SysInternalsのDebugView
https://docs.microsoft.com/en-us/sysinternals/downloads/debugview
とかで出力結果を捕まえることができます。
DEKOさんの
https://qiita.com/ht_deko/items/da87afa82181782b181e#debugview
この記事あたりも参考にしてください。
(個人的にはログは常にファイルに出力しちゃいますけどね…いまどきストレージは無限に近くありますから
{$IFDEF DEBUG}
{$APPTYPE CONSOLE}
{$ENDIF}
通りすがりさん、AAAさん
ありがとうございます。
どちらにも共通して、{$IFDEF DEBUG} {$ENDIF}の記載もありますね。
ありがとうございます。
これはコンパイルされたものでは出力されないという事ですよね。
ただIDEからのデバッグ時には利用できるという事で助かります。
これまでも簡単の追いきれないデバッグ等もあったので通りすがりさんの
リンク等も参考に勉強します。
イベントログに出力されるのもいいですよね。
教えていただいた中からいろいろ試して自分に合った方法を探してみます。
ありがとうございました。
> どちらにも共通して、{$IFDEF DEBUG} {$ENDIF}の記載もありますね。
> ありがとうございます。
> これはコンパイルされたものでは出力されないという事ですよね。
> ただIDEからのデバッグ時には利用できるという事で助かります。
勘違いをされているようですが、{$IF DEBUG}..{$ENDIF}はビルドの種類(デバッグ、リリース)による判定です。
デバッグビルドをするとこの部分がコンパイル対象になり、リリースビルドをするとコンパイル対象外になります。
どちらであってもOutputDebugString関数は使えます。
{$IFDEF DEBUG} デバッグ版の判定
{$IFDEF RELEASE} リリース版の判定
ですね.
IDE での実行の判定には,例えば DebugHook 関数が利用できます.
if DebugHook <> 0 then begin
// コンソール画面を起動
AllocConsole;
end;
ツイート | ![]() |