DrDialogを使ってみよう

(第3回)

 さて今回からは、項目別のテクニックを紹介していきます。ただし、使ったことがないコントロール(タートル等)は、割愛します。



コントロールの配置

 今回のBMIドックター/2でのビルボードの位置は、下記の様にinit欄に指定しています。

 rc=BASE.C107.position(10 42 100 100)

position(10 42 100 100)の10 42と言うのがダイアログ(BASE)内の位置です。10=横軸(x軸)、42=縦軸(y軸)となります。ここで、確認しておきたい事は、DrDialogというよりOS/2でソフトを作る場合に(0 0)座標は、画面左下になるということです(*)。
次に、100 100と言うのは、コントロールのサイズです。100=幅(dx軸)、100=高さ(dy軸)となりますので、対応する画像サイズも100*100です。
 では、ソフトのダイアログ(BASE)の指定はといいますと、下記の様に指定しています。

 rc=BASE.position(x y 305 305)

今回は、x y がWPS上のソフトの位置ということです。ちなみに、悪名高き白ダイアラーは、この x y が0 0と手抜きな訳です。
では、この x y の数値の取得は、下記の通りします。ただし、返ってくるのは x y dx dy なので注意して下さい。

 po=base.Position()

以上の指定を各種コントロールでしていくわけです。
面倒ですが、これをしておくと他の環境でフォントサイズが変わってもコントロールの位置やサイズがぐだぐだに変わってしまうってこともありません。
あと、サイズ固定のソフトを作るのならダイアログのポップアップメニューのStylesで、BorderをSizingからDialogに変更しておきましょう(Sizingのままですと位置指定をしてもずれることがあります。)。

(*) 他の開発環境は別としてDrDialogでは、手作業で指定しますのでこれが本当に手間です。郵便番号検索/2の様にサイズ変更を可能にするとコントロールの位置やサイズを逆算して指定する数が増えて大変なんです。Windowsの様に画面左上だったらと泣きたくなります。一応理由はありますがソフトを作る方としては、糞仕様としか思えません。(汚い言葉、ご免なさい)



製品情報(メッセージ・ボックス)

 ヘルプから製品情報を出す一番簡単な方法は、RxMessageBox関数を使うことです。構文は、下記の通り。詳しくは、OS/2プロシージャー言語 2/REXX(オンラインヘルプ)をご覧下さい。
尚、この関数は、PMアプリからしか呼び出せませんので、第1回で書いたようなRexxで書いてとはいきません。PMREXXかダイアログにプッシュボタンを置いてそこから試して下さい。

 action = RxMessageBox(text, [title], [button], [icon])



リストボックス

 リストボックスへの表示は、下記のようにADD関数を使ってします。

 OldList.0=5
 OldList.1='OS/2 v.1.01'
 (省略)
 OldList.5='OS/2 Warp5'
 do i = 1 to OldList.0
  rc=BASE.C101.ADD(OldList.i)
 end
 
 次に、表示されたリストをクリックしてデータを取得するには、下記の様にSelect欄に記載します。

 z=BASE.C101.select() /*リストの何番目か*/
 NewList=BASE.C101.item(z,) /*リストのz番目の情報の取得*/

 ところで、クリックされた場合に該当部分が強調されますね。これが灰色です。悪くはないけど陰気くさいので、Windowsみたいに格好良くしましょう
下記の通りinit欄に記載します。色は、自分の好きなのにして下さい。下記の数値は、私のソフトが使っている色の数値ですので、開発する時に合わせて頂くと統一感が出て良いと思います。

 oldcal=BASE.C101.color('H-',51 87 145)  /*選択強調の色指定*/



プッシュボタンにフォーカスを当てる

 プッシュボタンにフォーカスを当てることによって、Enterキーを押すだけでプログラムを実行するようにするには次のようにします。
  1. 目的のプッシュボタンをマウスで右クリックし、メニューのstylesを選択します。
  2. stylesのdefaultにチェックを入れて下さい。



コンボボックス

 コンボボックスの項目の表示はリストボックスと同じようにADD関数を使います。
では、拙作の郵便番号検索/2の様に前回選択された項目(県)にフォーカスを当てるには、上記の表示命令に続いて下記の様にText関数を使って命令します(kennameがコンボボックスに割り当てられた名前です。)。

 oldtext=base.kenname.text(FKen)  /*FKenが前回終了時の県*/

次に、選択した項目(県名)の取得はと言いますと、select関数ではなくText関数を使いchanged欄に下記の様に記載します。

 FKen=Base.kenname.text( )



フォント情報の取得

 コントロールのフォントを変更できるように作った場合に、終了時にフォントの種類とサイズを取得するように作りますがその場合にNUL文字がついて来てしまいます。そうしますと、保存する度に10.Helv Combined^@^@^@^@^@^@^@^@^@^@^@^@の様に「^@」が増えていくという事態に陥ります。
これは、フォント取得後にNUL文字を削除するようにすればいいわけで、下記の様にします。
尚、この部分は「Rexx使いの卵」こと織さんの命令を使わせてもらっています(私が書いたのは5行もかかる命令でして。5倍(^_^;))

 newfont=base.C101.font()  /*フォント情報を取得*/
 newfont=STRIP(newfont,'T','00'x)  /*NUL文字抽出*/



 ソフトを綺麗に起動させる

 古いPCや仮想環境といった遅い環境で、作ったソフトを起動させると、指定した位置に各コントロールが再配置されているのが目にはいることがあります。
これを避けて、綺麗に起動させるには、ソフトを作る時に一番最初に出てきたダイアログC100(私は、baseって名前を付けています)を右クリックし、Style...を選択しVisibleのチェックを外す。
OPENタブに、rc=base.Visible(1) を加える。
これで、不可視状態で起動し、再配置された状態で可視になるため、各コントロールがバタバタと再配置するのを見られなく出来るはずです。

(2016.8.27)

(第1回)
(第2回)
 

戻る