ActiveX ListView コントロールの DotNet ListView コントロールへの変換

ListView コントロールは、3ds Max のスクリプト ツールの中で最も広く使用されている ActiveX コントロールです。ActiveX の ListView コントロールを使用したスクリプトを DotNet の ListView コントロールを使用するように変換するプロセスは、比較的単純です。

ここでは、チュートリアル - ListView ActiveX コントロールを使用した選択オブジェクト検査プログラムの開発 - 第 1 部のトピックで紹介されている単純なスクリプトを変換の一例として取り上げてみましょう。

次のスクリプトは、元の ActiveX コードをコメント アウトして緑色のフォントで示し、新たにコメント付きの DotNet コードを追加したものです。2 つのコードを比較してみましょう。

スクリプトの変換

    macroScript SceneListView category:"DotNet"
    (
    rollout listview_rollout "ListView Selected"
    (
    /* ActiveX Version:
    fn initListView lv =
    (
    lv.gridLines = true
    lv.View = #lvwReport
    lv.fullRowSelect = true
    layout_def = #("Object Name", "Object Class", "Verts", "Faces", "Material")
    for i in layout_def do
    (
    column = lv.ColumnHeaders.add()
    column.text = I
    )
    )
    */

    fn initListView lv =
    (
    lv.gridLines = true --same as in ActiveX
    --The following controls the display of details. We use defaults:
    lv.View = (dotNetClass "System.Windows.Forms.View").Details
    lv.fullRowSelect = true --same as in ActiveX
    layout_def = #("Object Name", "Object Class", "Verts", "Faces", "Material")
    for i in layout_def do
    lv.Columns.add i 96 --add column with name and optional width
    )
    /* ActiveX Version:
    fn fillInSpreadSheet lv =
    (
    for o in selection do
    (
    li = lv.ListItems.add()
    li.text = o.name
    sub_li = li.ListSubItems.add()
    sub_li.text = (classof o) as string
    sub_li = li.ListSubItems.add()
    sub_li.text = try((o.mesh.numverts) as string)catch("--")
    sub_li = li.ListSubItems.add()
    sub_li.text = try((o.mesh.numfaces) as string)catch("--")
    sub_li = li.ListSubItems.add()
    sub_li.text = (o.material) as string
    )
    )
    */

    fn fillInSpreadSheet lv =
    (
    theRange = #() --array to collect the list items
    for o in selection do
    (
    --First we create a ListViewItem objectwith the object's name:
    li = dotNetObject "System.Windows.Forms.ListViewItem" o.name
    --Then we add all the sub-itemswith the desired string values:
    sub_li = li.SubItems.add ((classof o) as string)
    sub_li = li.SubItems.add (try((o.mesh.numverts) as string)catch("--"))
    sub_li = li.SubItems.add (try((o.mesh.numfaces) as string)catch("--"))
    sub_li = li.SubItems.add ((o.material) as string)
    append theRange li--we add the list item to the array
    )
    lv.Items.AddRange theRange--when done, we populate the ListView
    )
    /* ActiveX Version:
    activeXControl lv_objects "MSComctlLib.ListViewCtrl" width:490 height:190 align:#center
    */

    dotNetControl lv_objects "System.Windows.Forms.ListView" width:490 height:190 align:#center
    on listview_rollout open do
    (
    initListView lv_objects
    fillInSpreadSheet lv_objects
    )
    )
    try(destroyDialog listview_rollout)catch()
    createDialog listview_rollout 500 200
    )