ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

Dialog Examples/ja

Deutsch · English · Español · Français · Polski · Slovenčina · Suomi · Русский · 中文(中国) · 日本語

便利なダイアログ

ここでは、コンポーネントパレットにはない、便利なダイアログを紹介します:

どのコンポーネントも、幾つかの情報とユーザのレスポンスを求める小さなポップアップを表示します: ボタンを押すか何かテキストを入力するか、もしくはその両方の種類があります。プログラマーはフォーマットやサイズ、ポップアップの場所をある程度制御することが出来ます。また、テキストの内容を変更することもできます。
このように幾つかのとてもよく似た選択がある理由は、コンポーネントの呼び出し方や、procedure や function から返されたデータの受け取りに異なる手法できるようにするためです。

メッセージダイアログ

メッセージダイアログは、メッセージを表示したり、キー入力やマウスクリックを待つといった際に使用します。

ShowMessage

pascal
Procedure ShowMessage (const Msg: string);

{ Defined in Dialogs.pp }

もっともシンプルなメッセージダイアログです: シンプルな文字をパラメータとして指定し、所定の形状のダイアログを表示します。ランタイムやプログラムから呼び出され、マウスクリックもしくは Enter キーが押されるまで待機します。
これは呼び出しの例です。ダイアログを表示し、フォーカスを受け取ります。なお、OK ボタンをクリックされるまでフォーカスを放棄しません。

例:

pascal
Program LazMessage;
Uses Dialogs;
begin
  ShowMessage ('これは Lazarus からのメッセージです')
end.

MessageBox

pascal
Function Application.MessageBox (Text, Caption: PChar; Flags: longint) : Integer;

{ Forms.pp 内の TApplication で定義されています; よって Application.Messagebox () と記述するか、 'with Application do ...end'  の中でコールする必要があります}

パラメータは次の通りです。

この関数は押されたボタンに応じて整数値を返します。この数値は[IDOK..IDHELP] といった定数値を参照して値が決定されます。

これは procedure コールのように呼び出すこともできます(ただ'MessageBox()'という記述よりも'Variable := MessageBox()' というファンクションコールで使用します - 下の例を見て下さい)

例

pascal
Uses Forms, Dialogs, LCLType;

Procedure DisplayMessageBox;
  var reply, boxstyle: integer;
  begin
    with application do begin
      boxstyle :=  MB_ICONQUESTION + MB_YESNO;
      reply :=  MessageBox ('Press either button', 'MessageBoxDemo', boxstyle);
      if reply = IDYES then MessageBox ('Yes       ', 'Reply',MB_ICONINFORMATION)
      else MessageBox ('No         ', 'Reply', MB_ICONHAND)
  end;

この例での 'Yes' と 'No' の文字列ですが、後ろに空白文字を追加して文字長を長くしています。というのも、キャプションをちゃんと表示するのに十分な幅にならない為です。

http://lazarus-ccr.sourceforge.net/kbdata/MessageBoxDemo.png http://lazarus-ccr.sourceforge.net/kbdata/ReplyYes.png

MessageDLG

pascal
function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; 
                   Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; 
                   Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;

この関数には二つのバージョンがあります。最初のキャプション(Caption)パラメータが任意です。もし省略した場合、キャプションは表示されません。

MessageDLGは、メッセージダイアログの中で最も完全で詳細なもので、プログラマーは様々なこれを使って様々なダイアログボックスを作成できます。 ボックスやアイコンの種類を定義するパラメータは整数の定数値よりも、むしろ定義の方を使用します。ボタンで言えば [mbRetry, mbIgnore, mbAbort,mbCancel] といったコの字括弧を使って定義されています。 HelpCtx パラメータは現在使われておらず、0 をセットしておく必要があります。 関数から返された値は、押されたボタンの識別番号であり、Integer 型の扱いになります。(下に述べる[mrNone..mrAll]を参照して下さい)

例

pascal
Uses forms, dialogs, lcltype, controls;

procedure TryMessageDlg;
begin
  if MessageDlg ('Question', 'Do you wish to Execute?', mtConfirmation, 
                 [mbYes, mbNo, mbIgnore],0) = mrYes
  then { Execute rest of Program };
 end;

http://lazarus-ccr.sourceforge.net/kbdata/Question.png

文字入力ダイアログ

InputBox

テキスト入力ダイアログ: ダイアログを表示し、ユーザにテキスト入力を促します。

pascal
Function InputBox(const ACaption, APrompt, ADefault : String) : String;

タイトルとプロンプトのある四角いフォームを表示して、ユーザーにテキストボックスに入力を促します。オプションとしてデフォルトの文字列を表示させることができます。ユーザーが入力したり、あるいはデフォルトのままの文字列が関数の戻り値として返されます。

例

pascal
Uses forms, lcltype, dialogs, controls;

procedure TryInputBox;
var userstring: string;
begin
  userstring := InputBox ('Get some text input', 
                         'Please type in some   information', 'Some sample text');
  ShowMessage (userstring)
end;

InputQuery

pascal
Function InputQuery(const ACaption, APrompt : String;
                    MaskInput : Boolean; var Value : String) : Boolean;
Function InputQuery(const ACaption, APrompt : String;
                    var Value : String) : Boolean;

この関数には、2つのバージョンがあり、どちらもプロンプトを表示して、ユーザーにテキストデータの入力をもとめます。最初のものは、MascInputという論理値のパラメータがあり、ユーザーの入力が、(パスワード入力中のように)入力ボックス内でアスタリスクでマスクされるかどうかを決めることができます。2番目のものは、このプロパティはありません。ユーザーが入力したテキストは、'Value'という変数パラメータで返されます。この関数の戻り値は、'OK'が押されたときはTRUEを、その他の方法(たとえば、タイトルバーの'閉じる'アイコンをクリックされたときなど)で入力フォームが閉じられたときは、FALSEを返します。MaskInputパラメータを省略することは、MaskInputパラメータにFALSEを指定することと同じです。

例:

pascal
Uses forms, lcltype, dialogs, controls;

procedure TryInputQuery;
var QueryResult: boolean;
  userstring: string;
begin
  if InputQuery ('Question', 'Type in some data', TRUE, userstring)
  then ShowMessage (userstring)
  else 
  begin
    InputQuery ('Don''t be silly', 'Please try again', userstring);
    ShowMessage (userstring)
  end
end;

http://lazarus-ccr.sourceforge.net/kbdata/MessageDlgQuestion.png

http://lazarus-ccr.sourceforge.net/kbdata/DontBeSillly.png

PasswordBox

pascal
Function PasswordBox(const ACaption, APrompt : String) : String;

MaskInput を TRUE にした状態の InputQuery 関数とよく似た動作です。違いは、関数(InputBox のように)の返し値にパスワードがセットされる点です。

メッセージダイアログで使用される定数値と型

幾つかのメッセージダイアログで使用される定数値と型は LCL ライブラリの中で予め定義されています:

const { Defined in LCLType.pp }

メッセージボックスの外観にあるアイコンとボタンの型を定義する定数値

text
MB_OK = $00000000;
MB_OKCANCEL = $00000001;
MB_ABORTRETRYIGNORE = $00000002;
MB_YESNOCANCEL = $00000003;
MB_YESNO = $00000004;
MB_RETRYCANCEL = $00000005;

MB_ICONHAND = $00000010;
MB_ICONQUESTION = $00000020;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERICK = $00000040;
MB_ICONWARNING = MB_ICONEXCLAMATION;
MB_ICONERROR = MB_ICONHAND;
MB_ICONINFORMATION = MB_ICONASTERICK;

ボタンが押された時に、MessageBox から送られる一致するボタンの種類の定数値

text
IDOK = 1;   ID_OK = IDOK;
IDCANCEL = 2;   ID_CANCEL = IDCANCEL;
IDABORT = 3;    ID_ABORT = IDABORT;
IDRETRY = 4;    ID_RETRY = IDRETRY;
IDIGNORE = 5;   ID_IGNORE = IDIGNORE;
IDYES = 6;  ID_YES = IDYES;
IDNO = 7;   ID_NO = IDNO;
IDCLOSE = 8;    ID_CLOSE = IDCLOSE;
IDHELP = 9; ID_HELP = IDHELP;

1番目のボタン、2番目のボタン、3番目のボタン...のどれがデフォルトかを定義します。

text
MB_DEFBUTTON1 = $00000000;
MB_DEFBUTTON2 = $00000100;
MB_DEFBUTTON3 = $00000200;
MB_DEFBUTTON4 = $00000300;

MessageBoxのFlagsパラメータは、ボタン定数を加えることで指定します。 [MB_OK..MB_RETRYCANCEL], オプションとしてアイコン定数があります。 [MB_ICONHAND..MB_ICONINFORMATION] さらにオプションとして、デフォルトボタン定数があります。 [MB_DEFBUTTON1..MB_DEFBUTTON3]

MessageDlgを使う型は、次のようなパラメータを必要とします。 TMsgDlgTypeのAType, TMsgDlgButtonsのAButtons

pascal
{ Defined in Dialogs.pp }
type
 TMsgDlgType    = (mtWarning, mtError, mtInformation,  mtConfirmation,
                   mtCustom);
 TMsgDlgBtn     = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
                  mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
 TMsgDlgButtons = set of TMsgDlgBtn;
 

const
 mbYesNoCancel = [mbYes, mbNo, mbCancel];
 mbOKCancel = [mbOK, mbCancel];
 mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
 

 MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (
  bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,
   bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose
  );

 BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (
   mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,
   mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll
   );

{ Defined in Controls.pp }
const
 mrNone = 0;
 mrOK = mrNone + 1;
 mrCancel = mrNone + 2;
 mrAbort = mrNone + 3;
 mrRetry = mrNone + 4;
 mrIgnore = mrNone + 5;
 mrYes = mrNone + 6;
 mrNo = mrNone + 7;
 mrAll = mrNone + 8;
 mrNoToAll = mrNone + 9;
 mrYesToAll = mrNone + 10;
 mrLast = mrYesToAll;

このページはepikwiki バージョンからインポートされました。


From the Free Pascal wiki, page "Dialog Examples/ja", as it stood on 2006-10-28 after a change by Saeka-jp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

第3版、最終更新:WikiArchive 。