リストビューをActiveXで


多項目のリストを作りたくて
無理矢理普通のコンボボックスを
名前なんかの創意工夫で、なんちゃって多項目リスト化しようとしてたけど。

無理。

これじゃ、ちょっと面倒な上
醜いので、多項目のリストを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 end

fn 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 end

activeXControl 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に丸投げ状態で、分からなかった。
なので、サンプル通りに記述しておいてねだってさ・・・。

なんて奴らだ・・・。

このリスト、まだいじりきってないが。
アイディア次第で、夢が広がる。
オリジナルのシステムをレイヤー化して管理するのも楽しそうだけど。
手っ取り早いのは、オブジェクトの名称かユーザープロパティに、
独自の管理ルールを作って、この機能でそれらをリスト化すると中々使えるものになるかも。

今はひとまず、モデリング時のポリゴンの簡易管理に使う。

あとで、色々アイディアを出してみよう。
たとえば・・・。

オリジナルのウェイトテーブルとか。

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください