自作ダイアログボックスのすすめ

岡本 安晴

アップデート版
対応内容:
Delphi5から,*.dpr,*.pas,*.dfmの3つのファイルの組み合わせで開くと「リソースファイルがない」というメッセージが表示される.また,MediaPlayerコンポーネントもDeviceTypeプロパティの設定がdtAutoSelectでないと再生できない.

● はじめに
 Delphiでは,ShowMessage手続きやInputBox関数を用いると,手続き・関数の実行中に文字列の表示や入力を行うことができます.このようなダイアログボックスによる入出力用の関数・手続きなどがDelphiにはいくつか用意されています.
 しかし,実際に使用するときにはダイアログボックスのサイズのより大きいものを使いたい,ボタンをほかのものにしたい,あるいは増やしたいなど,さまざまな要求が生じてきます.
 ここでは,ダイアログボックスを自作する方法について,サンプルを交えながら解説します.

ダイアログボックスの作成手順

 ダイアログボックスの作成は,次のように簡単にできます.

(1) ダイアログボックス用のフォームの生成
(2) クリックなどのイベント待ち
(3) ダイアログボックスを閉じる

 (1)の操作は,例えばダイアログボックスの型がTDialogFormであれば,
  DialogForm:=TDialogForm.Create(Application);
とすると,TDialogForm型のフォームがApplicationを親として生成され,DialogFormによって指し示されます.Applicationは,Delphiプロジェクトでは最初の親オブジェクトとして生成されます.メインのフォームは,Applicationの子フォームになっています.
 メインのフォームが,たとえばForm1であれば,

  DialogForm:=TDialogForm.Create(Form1);

として,Form1の子フォームとしてダイアログボックスのフォームDialogFormを生成することもできます.
 フォームDialogFormの内容は,ソースコードのみによって作成することもできますが,「ファイル|フォームの新規作成」でフォームを表示してビジュアルに設計するほうが楽です.
 Createメソッドで作成したフォームは,VisibleプロパティをTrueに設定すると表示されます.
 ダイアログボックス用のフォームを表示後,OKボタンのクリックなどを待ちますが,これは,たとえば変数ckをFalseに設定しておいてからckがTrueになるのを待つという方法でできます.すなわち,

  ck:=False; repeat ; until ck;

という具合です.
 上の場合,例えばボタンのクリックでckがTrueに設定されるようにしておくと,(2)の「クリック待ち」の操作が実現できるはずなのですが,このままではボタンのクリックが受け付けられません.そのため,repeat内の繰り返しにおいて常にクリックなどのイベントの生起がチェックされるようにします.すなわち,

  ck:=False;
  repeat Application.ProcessMessages; until ck;

とします.
 メソッドProcessMessagesの実行によってイベントの生起がチェックされます.
 変数ckは,ボタンのクリックなど複数のイベントハンドラによって値が設定できるようにするためグローバル変数として宣言します.
 クリックなどによって変数ckがTrueに設定されて,(2)のステップが終了すると,(3)のダイアログボックスを閉じる操作を行ってダイアログボックスの表示を終了します.ダイアログボックスは,

  DialogForm.Close;

で閉じることができます.
 このようにダイアログボックスは,基本的に(1)〜(3)の手順を使って簡単に自作できます.

MediaPlayerコンポーネントで味付け

 実際のダイアログボックスでは,用途や好みに応じていろいろと味付けをすることになります.ここでは味付けの一例としてダイアログボックスの表示時に*.wavファイルの音を鳴らしてみます.*.wavファイルの音はMediaPlayerコンポーネントを用いると簡単に再生できます.
 マルチメディアデバイスを制御するためのコンポーネントであるMediaPlayerコンポーネントはコンポーネントパレットのSystemページに用意されています(図1).MediaPlayerコンポーネントによる*.wavファイルの音の再生は次の手順でできます.

<図1>MediaPlayer コンポーネント.コンポーネントパレットのSystemページに用意されている

Dboxg1.jpg (13382 バイト)

  with MediaPlayer do
   begin
    FileName:={ *.wavファイル名の設定 };
    Devicetype:=dtWaveAudio;
    Open; Play; Close;
  end;

 再生する*.wavファイルの名前をFileNameプロパティに,dtWaveAudioをDeviceTypeプロパティに設定します.Openメソッドでオープン後,Playメソッドで*.wavファイルの音を再生します.再生後,Closeメソッドでマルチメディアデバイスを閉じます.再生終了までアプリケーションに制御を返さないときは,WaitプロパティをTrueに設定しておきます.

文字列表示用ダイアログボックスの例

 文字列を表示するためのダイアログボックスの例をリスト1に示します.ダイアログボックスとして表示するフォームは図2のように用意しました.

<図2>文字列表示用ダイアログボックス(UMyDialog)のフォーム

Dboxg2.jpg (18332 バイト)

 ユニットなどの新規作成をプロジェクトと独立して行うときは,プロジェクトを閉じた状態で新規作成を行います.新規作成後は,そのユニットを使用するプロジェクトを開いた状態でユニットやフォームの編集を行うことができます(2).
 図2のフォームでは,文字列を表示するためのラベルコンポーネントLabel1,表示の確認のためのボタンコンポーネントOKButtonのほかに,キャンセルを受け付けるためのボタンCancelButton,表示時にチャイムを鳴らすためのメディアプレイヤコンポーネントMediaPlayer1が貼り付けられています.表示文字もFontプロパティの設定によって好みに合わせて設定できます.フォームのCaptionも設計時,あるいは実行時に適当なものに設定できます.このフォームは関数CheckMsg(リスト1,30,33行目)の実行によって表示されます.
 関数CheckMsgはOverLoad指令を付けてオーバーロードしてあります.オーバーロードするためには次のように,

  手続き・関数ヘッダー; overload;

手続き・関数のヘッダーにoverload指令を付けます.オーバーロードされた手続き・関数は同じ識別子をもちますが,パラメータの違いによって区別されます.
 リスト1のCheckMsgの場合は,呼び出し時の第2パラメータの有無によって実行される関数が選択されます.第2パラメータをもたない呼び出しのときは30行目のCheckMsgが呼び出されます.第2パラメータをもつ呼び出しのときは33行目のCheckMsgが呼び出され,第2パラメータで渡されたオブジェクトを親としてダイアログボックス用フォームが生成されます(199行目).この場合,親のUpDateメソッドが実行される(205行目)ので,第2パラメータは呼び出し元のフォームを実パラメータとしておくと親フォームの再描画が行われます.これはSelfを実パラメータとするということです.親フォームのUpDateの実行により,ダイアログボックスの表示のために親フォームの画面表示が崩れた場合でも,その再描画によってもとの画面になります.
なお,第2パラメータcはCreateメソッドの実パラメータとして使用するのでTComponent型としてありますが,UpDateメソッドはクラス型TFormのメソッドとして使用するので,第2パラメータcの型をas演算子によってTForm型としてUpDateメソッドを呼び出しています.

以下略.


copyright 1999 岡本 安晴