|
ダイアログを表示させる方法は2つあります。
1つは、全部で10種類ある定型ダイアログを表示させる方法です。
手続きを呼ぶだけなので、数値や座標を入力するだけならばこの方法が簡単です。
もう一つは、カスタムダイアログを定義する方法です。
入力欄の他に、チェックボックスやボタンを配置できるので、凝ったレイアウトを作ることができます。
PROCEDURE TEST;
VAR
x1,y1,x2,y2:REAL;
BEGIN
GetRect(x1,y1,x2,y2);
BeginXtrd(0,50);
Rect(x1,y1,x2,y2);
EndXtrd;
END;
Run(TEST);
上記のプログラムに、実数用のダイアログを表示する手続き(RealDialog)を追加して、
柱状体の高さをダイアログで指定できるように書き換えてみます。
PROCEDURE TEST; | | VAR | | x1,y1,x2,y2,height:REAL; | | BEGIN | | GetRect(x1,y1,x2,y2); | | height:=RealDialog('高さを入力して下さい','50'); | 手続き「RealDialog」を使って実数を入力する為のダイアログを表示します。 ダイアログを閉じると値が変数「height」に格納されます。 | IF NOT DidCancel THEN | 関数「DidCancel」を使ってダイアログ上で「Cancel」ボタンが押されたかどうか判定します。 もし「Cancel」ボタンが押されたら柱状体を作成せずにプログラムを終了します。 | BEGIN | | BeginXtrd(0,height); | 手続き「BeginXtrd」にダイアログで入力した高さ(変数height)をパラメータとして与えます。 | Rect(x1,y1,x2,y2); | 柱状体の底面の形を書きます。 | EndXtrd; | 柱状体の作成が終わったらかならず「EndXtrd」を呼んでください。 | END; | | END; | | Run(TEST); | |
実行結果
PROCEDURE TEST;
VAR
x1,y1,x2,y2,height:REAL;
BEGIN
GetRect(x1,y1,x2,y2);
height:=RealDialog('高さを入力して下さい','50');
IF NOT DidCancel THEN
BEGIN
BeginXtrd(0,height);
Rect(x1,y1,x2,y2);
EndXtrd;
END;
END;
Run(TEST);
少しプログラムは長くなりますが、ボタンやチェックボックスを自由に配置できます。
自由度は高いですが、いくつかの処理を自分で制御しなければなりません。
以下のプログラムを実行するとカスタムダイアログを表示します。
「OK」ボタンか「Cancel」ボタンを押すと、ダイアログが閉じてプログラムを終了します。
1 | PROCEDURE TEST; | | 2 | CONST | | 3 | kDialogWidth=200; | ダイアログの横幅を定数で宣言しています。 | 4 | kDialogHeight=320; | ダイアログの縦幅を定数で宣言しています。 | 5 | VAR | | 6 | item,dx1,dx2,dy1,dy2,i:INTEGER; | | 7 | | | 8 | PROCEDURE centerBounds(VAR x1,y1,x2,y2:INTEGER); | ダイアログの表示座標を割り出すサブルーチンです。 画面の中央に表示されるように計算し、座標を返します。 | 9 | VAR | | 10 | sx1,sx2,sy1,sy2:INTEGER; | | 11 | BEGIN | | 12 | GetScreen(sx1,sy1,sx2,sy2); | 手続き「GetScreen」を使って画面の大きさを取得します。 | 13 | x1:=(sx1+sx2)/2-kDialogWidth/2; | ダイアログの左上のX座標を計算します。 | 14 | y1:=(sy1+sy2)/2-kDialogHeight/2; | ダイアログの左上のY座標を計算します。 | 15 | x2:=(sx1+sx2)/2+kDialogWidth/2; | ダイアログの左下のX座標を計算します。 | 16 | y2:=(sy1+sy2)/2+kDialogHeight/2; | ダイアログの左下のY座標を計算します。 | 17 | END; | | 18 | | | 19 | Begin | | 20 | CenterBounds(dx1,dy1,dx2,dy2); | 12行目のサブルーチン(CenterBounds)を呼んでいます。 | 21 | BeginDialog(1,1,dx1,dy1,dx2,dy2); | カスタムダイアログの定義を開始します。 最初のパラメータはダイアログの番号です。1〜20までの任意の番号を与えます。 2番目はダイアログの種類ですが、現在は1しか与えられません。 3番目以降はダイアログの座標ですがこれは「CenterBounds」で取得した座標をそのまま与えています。 | 22 | AddButton('OK',1,1,120,290,190,310); | 「OK」ボタンを作成します。最初のパラメータはボタンの名前です。 2番目はアイテム番号です。重複しないように各アイテムは1〜50までの番号を与えます。尚、プッシュボタンに1番を与えるとデフォルトボタン(二重枠のボタン)になります。 3番目はボタンの種類です。プッシュボタンなので1を与えます。 4番目以降はボタンの座標です。 | 23 | AddButton('Cancel',2,1,40,290,110,310); | 22行目と同じように「Cancel」ボタンを与えます。 | 24 | AddField('編集ボックス1',3,2,10,10,190,30); | 編集可能なフィールドを作成します。 最初のパラメータはフィールドの初期値で、2番目はアイテム番号です。 3番目はフィールドの種類(2=編集不可能)です。 4番目以降はフィールドの座標です。 | 25 | AddField('編集ボックス2',4,2,10,40,190,60); | 24行目と同じように編集可能なフィールドを作成します。 | 26 | AddField('テキスト1',5,1,10,70,190,90); | 編集不可能なフィールドを作成します。 最初のパラメータはフィールドの初期値で2番目はアイテム番号です。 3番目はフィールドの種類(1=編集不可能)です。 4番目以降はフィールドの座標です。 | 27 | AddField('テキスト2',6,1,10,100,190,120); | 26行目と同じように、編集不可能なフィールドを作成します。 | 28 | AddField('チェックボックス1',7,2,10,130,190,210); | チェックボックスを作成します。 最初のパラメータはボタンの名前で、2番目はアイテム番号です。 3番目はボタンの種類(3=ラジオボタン)です。 4番目以降はフィールドの座標です。 | 29 | AddField('チェックボックス2',8,2,10,160,190,240); | 28行目と同じようにチェックボックスを作成します。 | 30 | AddField('ラジオボタン1',9,3,10,190,190,210); | ラジオボタンを作成します。 最初のパラメータはボタンの名前で、2番目はアイテム番号です。 3番目はボタンの種類(3=ラジオボタン)です。 4番目以降はフィールドの座標です。 | 31 | AddField('ラジオボタン2',10,3,10,220,190,240); | 30行目と同じようにラジオボタンを作成します。 | 32 | AddField('ラジオボタン3',11,3,10,250,190,270); | これも同じくラジオボタンを作成します。 | 33 | EndDialog; | ダイアログの定義を終了します。 | 34 | GetDialog(1); | 定義したダイアログを表示します。パラメータはダイアログの番号です。 | 35 | SetItem(9,TRUE); | 手続き「SetItem」を使って9番のアイテム(ラジオボタン1)をオンにします。 | 36 | REPEAT | 「REPEAT UNTIL」文の開始です。 | 37 | DialogEvent(item); | ダイアログ上のいずれかのアイテムがクリックされるまで待機します。 クリックされたらそのアイテム番号を返します。 | 38 | IF (item=7) OR (item=8)THEN | チェックボックスが押されたときに、ボタンの状態を反転させる処理です。 チェックボックスが押されたら、現在の状態を手続き「ItemSet」で取得し、その値をNOTで反転させてから手続き「SetItem」に渡します。 | 39 | SetItem(item,NOT ItemSel(item)); | 同上 | 40 | IF (item>=9)AND(item<=11)THEN | ラジオボタンが押されたら、現在のボタンをオフにしてクリックしたボタンをオンにする処理です。 実際には一度全てのラジオボタンをオフにして、クリックされたら時をボタンをオンにしています。 | 41 | BEGIN | 同上 | 42 | FOR i:=9 TO 11 DO | 同上 | 43 | Setitem(i,FLASE); | 同上 | 44 | Setitem(item,TRUE); | 同上 | 45 | END; | 同上 | 46 | UNTIL(item=1)OR (item=2); | 「OK」ボタンか「Cancel」ボタンが押されたら、ループを抜けます。 | 47 | ClrDialog; | 手続き「ClrDialog」を呼んで、表示されているダイアログを消去します。 | 48 | END; | | 49 | Run(TEST); | |
残念ながら、上記のスクリプトは
エラーになってしまう。
|