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.