ダイアログ・クラシック、モダン、ブラウザについて(VW)
カスタムダイアログには、クラシックとモダンがあります。
最初に扱ったのはクラシックの方でした。
クラシックは互換用に残されているようですが、モダンよりも理解しやすかったためです。
流れは、通常のスクリプトを書く場合と大差なく、モダンのように押さえておく必要のある暗黙ルールも少なく思えます。
リファレンスのGetDialog
とDialogEvent
にあるサンプルで十分に理解でます。
欠点としては、モダンよりできることが少ないことと、位置合わせが面倒なことがありますが、逆にサイズをギリギリまで切り詰めることができ、同じ内容ではモダンより小さく作ることができます。
あらかじめ、ダイアログの配置図を描くと上手く収まります。
簡単な内容では、モダンよりも有利な場合があると思います。
モダンでは、できることが大きく増えますが、「VectorScript Guide」の「ユーザーインターフェイス」を読んだだけでは分からない部分もあります。
VS:Function Reference - Vectorworks Developerが、サンプルも多く参考になりました。
イベント処理関数は、2つのLONGINT型引数をもつ必要があると決まっていて、最初の引数(item
)にイベント時のitemID
が、2つ目(data
)には、アイテムの動作状態が返ります。
プッシュボタンやラジオボタンの場合は必ず「1」、チェックボタンはチェックが入ると「1」、外れると「0」、リスト類は選択されている項目番号となるようです。
data
が利用できるケースとしては、チェックボックス、シングル選択のリストボックスなどで、プルダウンメニューなどは動作判定が確実ではないので怪しくなります。
無理に利用する必要はないようですが、必須の引数となっています。
SetupDialogC
は、ダイアログ開始時に実行され、初期化に使われます。
実際のIDは[2255]で、このような既定のIDがモダンには存在していて、デベロッパーサイトのRunLayoutDialog
やCreateLayout
の項目によれば、終了時には[2256]が実行され、OKが[1]で、Cancelが[2]に加え、[12605]も既定であることが分かります。
また、itemID
は[500]を超えるべきではないことも書かれています。
調べてみると、[501]がヘルプのグループボックス、ヘルプのテキストは[2604]、ダイアログのIDは[502]からはじまり、コンパイル1回につき+1、ダイアログ1回の実行につき+4されていくようです。
これらのルールを押さえておかないと、予期しないエラーに出会うことになります。
一応、コンパイル時にはチェックが入り、イベント関数のCASE文内で既定IDと重なるとエラーとなります。
あと、イベント処理関数内では変数の値が保持されません。
ダイアログ実行中、随時に呼び出されているようで、値を保持する必要のある変数は上位のルーチンで宣言しておく必要があります。
カスタムダイアログの既定の動作として、右上の「閉じるボタン」のクリックと、「Enterキー」による終了があります。
「閉じる」ボタンは、モダン、クラシックともに[2]が発生しますが、モダンではCreateLayout
でCancelが未定義の場合は発生しません。
「Enterキー」では、モダンの場合、OKボタンが定義されていればやはり[1]が発生しますが、未定義の場合は[-1]になるようです。
クラシックでは、[1]の動作の定義に従い、定義されていなければ何も起きなくなります。
モダンでこれらの動作による終了にも対応するためには、場合によっては[2256]で動作を定義する方がうまくいきます。
リストブラウザについても、最初よく分からなかったのですが、デベロッパーサイトのサンプルが参考になりました。InsertLBColumn
で列を挿入、InsertLBItem
で行を挿入までは分かったのですが、あとがよく分かりませんでした。
0列目以降は、SetLBItemInfo
でした。
SetLBControlType
で列のタイプが変更でき、Radio
、Multi State
、Single Instance Icon
(初期値はStatic
)にした場合、InsertLBColumnDataItem
で選択肢となるデータを設定します。
選択肢を選択状態に設定する時に、SetLBItemUsingColumnDataItem
を使用することとなります。
ここで注意しなければいけないこととして、InsertLBColumnDataItem
では同名の選択肢は設定できません。
まともにやるならば、InsertLBColumnDataItem
が-1を返した場合、すでに設定されている選択肢を検索して見つけ出した上で、SetLBItemUsingColumnDataItem
で選択状態に設定してやらなければならないということなります。
しかし、こういったケース(具体的には、Multi State
)でも、SetLBItemInfo
で設定すればそれでいいようです。
SetLBItemUsingColumnDataItem
を使う機会は、限定されていると言えそうです。
InsertLBColumnDataItem
のユーザデータ(itemData
)は、どういった場合に利用できるのか分かりません。
コントロールタイプがRadio
の場合、ON・OFFのイメージが必須となります。
利用できるイメージリソースが分からなかったので、サンプルにあったIP Resources
を使いました。
これ以外に自由に使えるものはないのかもしれません。
リソースの作成についても一読しましたが、容易ではなさそうだったのでやめました。
イベントは、GetLBEventInfo
から処理します。
ケースとしてはeventType
による場合と、columIndex
による場合で分ければいいのですが、ソートされている場合、アイテム行をユニークに特定できる列が必要となります。
0列目に設定しておくのが一般的ではないかと思います。
特定方法としては、0列目をGetLBItemInfo
で取得するか、逆にFindLBColumnItem
で0列目を検索することになります。
具体例は、実際のスクリプトを参照してください。