高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

Lazarusでコモンダイアログを表示する

このブログはLazarus(FreePascal)アドベントカレンダー7日目の記事です。

qiita.com

7日目はLazarusでファイルを開く・保存ダイアログやメッセージボックスを表示する方法を。

コモンダイアログを表示する

Lazarusは、Delphiと同様、LCLに標準ダイアログを表示することができるクラスが揃っています。いちおうコンポーネント一覧にありますが、フォームに貼り付けて使うのも面倒ですし、普通にクラスを初期化して使うと楽です。

procedure TMainForm.ButtonClick(Sender: TObject);
var
  OFD: TOpenDialog;
begin
  OFD := TOpenDialog.Create(Self);
  try
    OFD.Filter:='EXE File|*.exe';
    if OFD.Execute then Path.Text:=OFD.FileName;
  finally
    OFD.Free;
  end;
end;

なお、「これってなんのダイアログだっけ・・・?」と思ったら、コンポーネントをフォームに貼り付けてダブルクリックすると、ダイアログのテストができます。これはたしかDelphiもおなじでしたね。

TCalcuratorDialog?

なお、コンポーネントパレットを見るとTCalculatorDialogなどという見慣れない名前のダイアログがいくつか見つかります。

f:id:TakamiChie:20211203200731p:plain
TCalculatorDialog

ソースコードを見ている感じWindows APIを呼んでどうにかしている様子はないため、ダイアログを作る際の参考になるかもしれません。

単純なメッセージボックスを表示する

また、単純なメッセージボックス、確認ダイアログなどは、DialogsユニットのMessageDlgまたはQuestionDlg関数を使います。

{ QuestionDlg }
Result:= QuestionDlg('caption', 'message', mtConfirmation, [mrYes, mrNo], 0);
{ MessageDlg }
MessageDlg('caption', 'message', mtInformation, [mbOK], 0);

第三引数Buttonsが要求する値が、QuestionDlgarray of const(mr○○の定数配列)、MessageDlgTMsgDlgButtons(mb○○の定数配列)と微妙に違うので注意。

単純なメッセージボックスを「作る」

なお、ダイアログをただちに表示するわけでなく、TFormオブジェクトとして取得し、いつでも表示できるようにする という方法もあります。

CreateMessageDialogというメソッドを使用します。

lazarus-ccr.sourceforge.io

これを使えば上記MessageDlgと同等のダイアログをオブジェクトとして取得することができます。たとえばおなじダイアログを何度も表示したり、フォントや表示位置を調整したいときには便利です。