Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年01月05日] [更新 2017年03月13日] Delphi サンプルプログラム集
046_フォーム非表示またはフォームを使用しないアプリケーション
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
046_HideOrWithoutForme.zip [1,428 KB] 2017年03月13日版 (EXE 同梱)







フォーム非表示またはフォームを使用しないアプリケーション


フォームを使用しないアプリの作成方法と,フォームは使用するが表示しないアプリの例です.
たとえ,フォームを表示する必要がないアプリケーションでも,場合によってはフォームを使用した方が便利なことがあります.




01_フォームを使用しないアプリケーション


以下のリンクの記事のコンソールアプリの作成手順で作成したコードから,{$APPTYPE CONSOLE} の行を削除すればフォームを使用しないアプリケーションのコードとなります.
コンソールアプリとフォームを持たないアプリの違いは,この {$APPTYPE CONSOLE} 指令があるかないかの違いです.



リスト1
フォームを持たないアプリの新規作成コード
拡張子は .dpr として保存する.このコードの場合は Project1.dpr とする
program Project1;

uses
  SysUtils;

begin
//
end.


フォームを持たないアプリケーションは,以下の手順でも作成できます.
  • (1) 新規に VCL フォームアプリを作成する
  • (2) [プロジェクト] [ソース表示] でプロジェクトのソースコードを表示する
  • (3) [プロジェクト] [プロジェクトから削除] で unit1 を削除する
  • (4) begin end. で囲まれたコードを削除する
  • (5) {$R *.res} (フォームのリソースの意味) の行を削除する

プロジェクトのソースコード内に関数を記述したり,定数,変数を定義する方法は,コンソールアプリケーションの場合と同じです.

下に示すコードは,ダイアログを表示するだけの簡単な例です.
ダイアログを表示する際,テーマに対応したデザインにするには,アプリケーションマニュフェストが必要です.フォームのないプロジェクトでは [プロジェクト] [オプション] のダイアログの [アプリケーション] 項目ではランタイムテーマの設定はできません.



図1
フォームを使用しないアプリケーション
  • アプリケーションマニュフェストを使用しない場合


リスト2
フォームを使用しないアプリケーションの簡単な例
program Project1;

uses
  Forms,
  Windows;

var
  LuType : Cardinal;

begin
  //いろいろな処理
  Sleep(2000);
  LuType := MB_ICONINFORMATION or MB_TOPMOST;
  MessageBox(Application.Handle, '処理が終了しました.', '終了', LuType);
end.




02_フォームを使用するが表示しないアプリケーション


フォームを表示する必要がないアプリでも,フォームを使用した方が便利な場合があります. 例えばコンポーネントを使用する場合です.フォームにコンポーネントを配置すれば,uses 部に必要なユニット名が追加されます.
フォームを使用しないアプリでは,コンポーネントは実行時に生成しなければなりません.しかも,必要なユニットは自分で調べて追加する必要があります.

本サンプルは,フォームを使用しますが,表示しないアプリの例です.上のフォームを使用しないサンプルと同じ動作をします.
メインフォームを非表示にするとタスクバーにもアイコンが表示されなくなります.



図2
フォームもタスクバーのアイコンも非表示

リスト3
フォーム非表示でタスクバーにアイコンを表示しないようにするためのプロジェクトのソース
program Project1;

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

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.ShowMainForm := False;        //追加
  Application.CreateForm(TForm1, Form1);
  Form1.TestProc;
//  Application.Run;                        //削除
end.


Form1 のユニットのコードです. 単にダイアログを表示するだけです.
終了したら確実にダイアログを最前面に表示するために,MessageBox 関数のフラグに MB_TOPMOST を指定しています.こうしておかないと,タスクバーにアイコンを表示していないため,既に他のウィンドウが表示されている場合,それらのウィンドウに隠れてしまいます.ダイアログが表示されても気が付かないことがあります.



リスト4
フォームのユニットの処理コード
フォームを非表示にしているので,OnShow イベントは発生しないので注意
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure TestProc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  このメソッドをプロジェクトのソースコードから実行する
//  このフォームを表示しないでタスクバーにもアイコンを表示しない
//=============================================================================
procedure TForm1.TestProc;
var
  LuType : Cardinal;
begin
  //いろいろな処理
  Sleep(2000);
  LuType := MB_ICONINFORMATION or MB_TOPMOST;
  MessageBox(Handle, '処理が終了しました.', '終了', LuType);
end;

end.




03_条件によってはメインフォームを表示しないでアプリを終了する


ある条件を満たさない時はメインフォームを表示しないでアプリを終了し,条件を満たす時はメインフォームを表示してアプリの実行を継続したい場合,本サンプルのような方法もあります.

条件のチェックは,プロジェクトのソースコードに書いていますが,実際の条件判定は Form1 のメソッド内で実行しています.プロジェクトのソースに処理を書いてもいいのですが,uses 部に必要なユニット類を追加する必要があります.また,判定にコンポーネントのメンバーの値等を利用する場合,コンポーネントはフォームに配置でき便利です.
フォームを表示しない場合でも,フォームの OnCreate イベントは発生します.また,OnDestroy イベントも発生しますが,OnCloseQuery, OnClose イベントは発生しません.

本サンプルは,単にファイルの存在をチェックするだけとしています.



図3
条件を満たさない場合
  • ダイアログを表示してアプリを終了する
  • メインフォームを表示しないままでアプリの終了となる
図4
条件を満たす場合
  • メインフォームが表示される

リスト5
条件によってはフォームを表示しないでアプリを終了する
プロジェクトのソースコード
program Project1;

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

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);

  //条件を満たせばアプリを実行
  if Form1.CheckFile then begin
    Application.Run;
  end;
end.


リスト6
条件によってはフォームを表示しないでアプリを終了する
メインフォームのコード
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    function CheckFile: Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  このメソッドをプロジェクトのソースコードから実行する
//
//  このような処理はプロジェクトのソースコードに書いてもよい
//  プロジェクトのソースコードに書く場合は,usesに必要なユニット名を追加する
//=============================================================================
function TForm1.CheckFile: Boolean;
var
  LFile  : string;
  LuType : Cardinal;

  LText  : string;
begin
  LFile := ExtractFilePath(Application.ExeName) + 'abc.txt';

  Result := FileExists(LFile);
  if not Result then begin
    LuType := MB_ICONINFORMATION or MB_TOPMOST;
    LText  := '必要なファイルが存在しません.' + sLineBreak
            + 'アプリを終了します.';
    MessageBox(Handle, PChar(LText), '終了', LuType);
  end;
end;

end.