多項目のリストを作りたくて
無理矢理普通のコンボボックスを
名前なんかの創意工夫で、なんちゃって多項目リスト化しようとしてたけど。
無理。
これじゃ、ちょっと面倒な上
醜いので、多項目のリストをActiveXで作るものを試してみた。
これは、スクリプトリファレンスの方が詳しくのっているが。
肝心なアクション部分がない。
補足と、勉強もかねてここに残しておこう。
まずは、このキーワードで調べれば、マニュアルから出てくると思う。
ListView ActiveX コントロール
一連の流れは、こんな感じかな。
・リストを作成するファンクションを作っておく。
↓
・ツールのロールアウト内で
ActiveXの”MSComctlLib.ListViewCtrl”を作成する
↓
・ロールアウトが開いた時にリストを作るファンクションを実行
これで、レイアウト的にはActiveXのリストビューが出来た。
詳しいソースは・・・こんな感じだろうか。
見よう見まねで作ったので、スクリプトリファレンスのコピーといってもいい!
あっはっはっは
macroScript listViewTest category: “Test”
(/*お決まりのロールアウトあれ*/
global listviewtest_rol
try(destroyDialog listviewtest_rol)catch()rollout listviewtest_rol “アレとか”
(/*
アクティブxでリストを作るopen時にこのファンクションを実行
*/
fn makeListView list =
(
/*グリッドラインの有無*/
list.gridLines = false;
/*上のヘッドラインを表示するか?*/
list.View = #lvwReport;
/*選択時に行全体を選択するかの有無*/
list.fullRowSelect = true;–リストの背景色
list.backColor = color 255 255 255;
–チェックボックスを有効にする
list.checkboxes = true;
–リストのヘッダーと幅、リストは多次元配列
layout_def = #(#(“A”,120), #(“B”,120), #(“C”,120))for i in layout_def do
(
column = list.ColumnHeaders.add()
column.text = i[1]
)/*
ユーザー変数を2種作成、アドレスと、列の幅
windowsHandleに送るidが含まれている
windowsのActiveXコントロールのプログラミングなので、詳しくはWindowsActiveXを参照する
*/
LV_FIRST = 0x1000;
LV_SETCOLUMNWIDTH = (LV_FIRST + 30);
/*MaxScriptの配列Indexが1で始まるのに対し、ActiveX側が0で始まる不都合を取り除く*/
for i = 0 to layout_def.count-1 do windows.sendMessage list.hwnd LV_SETCOLUMNWIDTH i layout_def[1+i][2];
);–fn endfn addList list =
(
/*リストをすべてくりあ*/
list.ListItems.clear()
/*1から順にリストに追加、サブリストに文字を追加*/
Local li = list.ListItems.add();
li.checked = true;
li.text = “AA”;
sub_li = li.ListSubItems.add();
sub_li.text = “This”;sub_li = li.ListSubItems.add();
sub_li.text = “ActiveX List”;–sub_li = li.ListSubItems.add();
);–fn endactiveXControl listViewMain “MSComctlLib.ListViewCtrl” width:490 height:190 align:#center
–////////////////////////////////////////////////
–リストをクリックしたときに呼び出される
–////////////////////////////////////////////////
on listViewMain Click do
(
print listViewMain.SelectedItem;
print listViewMain.SelectedItem.index;
print listViewMain.SelectedItem.text;
print listViewMain.ListItems;
);–end/*
クリックしたアイテムのIndexとか選択状態とか
ただし、checkboxesの値がtrueの場合
*/
on listViewMain ItemCheck item do
(
print item.index;
print item.checked;
messageBox(“Test”)title:”Test”;
);–end–////////////////////////////////////////////////
–クリックしたときにリネーム可能にする
/*
大体の場合 3dsMaxのキーボードアクセレーターを無効にする必要がある
*/
–////////////////////////////////////////////////
on listViewMain BeforeLabelEdit Index do
(
–アクセレーターを無効にする、Indexは項目のIndex値
enableAccelerators = false;
);–end
on listViewMain AfterLabelEdit Index Str do
(
–アクセレーターを有効にする、Indexは項目のIndex値
enableAccelerators = true;
–Strは、入力後の文字列
);–end/*オープン時にリストを作成する*/
on listviewtest_rol open do
(
makeListView listViewMain;
addList listViewMain;
););–end rollout
try(destroyDialog listviewtest_rol)catch()
createDialog listviewtest_rol 500 200);–end Script
こんな感じ
まずは、listを作るファンクション
次に、本体のイベントなど
最後に、ロールアウトが作成されたときにリストも作成する。
イベントには、他にも、ドロップアンドドラッグなどがあるので。
なんだか、ワクワクする。
一部、AvtiveX既習者でしか分からないところがあたが、
リファレンスの説明では、
MaicroSoftWindowsのActiveXを参照せよ
と、windowsに丸投げ状態で、分からなかった。
なので、サンプル通りに記述しておいてねだってさ・・・。
なんて奴らだ・・・。
このリスト、まだいじりきってないが。
アイディア次第で、夢が広がる。
オリジナルのシステムをレイヤー化して管理するのも楽しそうだけど。
手っ取り早いのは、オブジェクトの名称かユーザープロパティに、
独自の管理ルールを作って、この機能でそれらをリスト化すると中々使えるものになるかも。
今はひとまず、モデリング時のポリゴンの簡易管理に使う。
あとで、色々アイディアを出してみよう。
たとえば・・・。
オリジナルのウェイトテーブルとか。