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.
|