ダイアログ・クラシック、モダン、ブラウザについて(VW)

カスタムダイアログには、クラシックとモダンがあります。
最初に扱ったのはクラシックの方でした。
クラシックは互換用に残されているようですが、モダンよりも理解しやすかったためです。
流れは、通常のスクリプトを書く場合と大差なく、モダンのように押さえておく必要のある暗黙ルールも少なく思えます。
リファレンスのGetDialogDialogEventにあるサンプルで十分に理解でます。
欠点としては、モダンよりできることが少ないことと、位置合わせが面倒なことがありますが、逆にサイズをギリギリまで切り詰めることができ、同じ内容ではモダンより小さく作ることができます。
あらかじめ、ダイアログの配置図を描くと上手く収まります。
簡単な内容では、モダンよりも有利な場合があると思います。

モダンでは、できることが大きく増えますが、「VectorScript Guide」の「ユーザーインターフェイス」を読んだだけでは分からない部分もあります。
VS:Function Reference - Vectorworks Developerが、サンプルも多く参考になりました。
イベント処理関数は、2つのLONGINT型引数をもつ必要があると決まっていて、最初の引数(item)にイベント時のitemIDが、2つ目(data)には、アイテムの動作状態が返ります。
プッシュボタンやラジオボタンの場合は必ず「1」、チェックボタンはチェックが入ると「1」、外れると「0」、リスト類は選択されている項目番号となるようです。
dataが利用できるケースとしては、チェックボックス、シングル選択のリストボックスなどで、プルダウンメニューなどは動作判定が確実ではないので怪しくなります。
無理に利用する必要はないようですが、必須の引数となっています。

SetupDialogCは、ダイアログ開始時に実行され、初期化に使われます。
実際のIDは[2255]で、このような既定のIDがモダンには存在していて、デベロッパーサイトのRunLayoutDialogCreateLayoutの項目によれば、終了時には[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で列のタイプが変更でき、RadioMulti StateSingle 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列目を検索することになります。
具体例は、実際のスクリプトを参照してください。