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 同梱) |
| フォーム非表示またはフォームを使用しないアプリケーション |
フォームを使用しないアプリの作成方法と、フォームは使用するが表示しないアプリの例です。
たとえ、フォームを表示する必要がないアプリケーションでも、場合によってはフォームを使用した方が便利なことがあります。 |
以下のリンクの記事のコンソールアプリの作成手順で作成したコードから、{$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.
|