インスタンス SafeArrayWrapper は、ユーザによる作成が可能で、SAFEARRAY 値を返す OLE メソッドによって返されます。3ds Max 8 以降 で使用可能です。
コンストラクタ:
SafeArrayWrapper () SafeArrayWrapper <data array> SafeArrayWrapper <data array> <lBounds array>
プロパティ:
<SafeArrayWrapper>.dataArray
データ配列。「undefined」の可能性があります。dataArray はネストされた配列のセットです。dataArray は「二乗」でなくてはなりません。つまり、所定の次元における dataArray 内の要素の数は一定です。たとえば、
dataArray[i].count は i = 1 であれば一定で dataArray.count となり、dataArray[i][j].count は j = 1 であれば一定で dataArray[2].count になります。
dataArray に二乗でない配列が設定された場合、ランタイム エラーが発生します。配列の深さは、配列の次元になります。次元 2 の配列では、dataArray[i][j] は配列ではないデータ値になります。dataArray を設定すると、これに一致するように lBoundsArray 内の要素の数が変更され、値が 0 の要素が追加されます。
<SafeArrayWrapper>.lBoundsArray
下方境界の配列です。「undefined」の可能性があります。サイズ次元の配列で、ここでは各要素に配列の一次元の下方境界が格納されます。この配列は、SafeArrayWrapper から OLE SAFEARRAY 値を作成するために使用されます。lBoundsArray を設定する場合、サイズは「次元」でなくてはなりません。それ以外ではエラーが発生します。
<SafeArrayWrapper>.dimensions
データと境界配列における次元の数。読み込み専用。
メソッド:
copy <SafeArrayWrapper>
新しい SafeArrayWrapper を返します。データおよび境界配列上でディープ コピーが実行されます。
注:
SafeArrayWrapper の値は OLE メソッドに引数として渡すことができるので、ActiveX コントロール メソッドとやり取りすることができます。OLE または ActiveX メソッドに渡された配列は、中間の SafeArrayWrapper 値に自動的に変換されます。
OLE オブジェクトによって返される値の追加のバリアント タイプで、MAXScript 値に変換することができるものは次のとおりです。VT_UI2、VT_UI4、VT_INT、VT_NULL、VT_VOID
カラー値は、OLE オブジェクトに渡されると VT_I4 バリアント値に変換されます。
例:
次の例は、GetRows メソッドを使用して SQL データベースからデータを取得する方法を示しています。
-- open sql database and get rows DogConn = createOLEObject "ADODB.Connection" DogConn.Open "driver={SQL Server}; server=dsqedb01.autodesk.com; database=MXSTest" recordSet = createOLEObject "ADODB.Recordset" recordSet.Open "SELECT * from TestTable" DogConn a = recordSet.GetRows() -- display data properties a.dataArray a.lBoundsArray a.dimensions
-- create a new SafeArrayWrapper using data array and lbounds array b = SafeArrayWrapper #(#(1, 1.2345, "One point two three four five", undefined, undefined, undefined), #(2, undefined, "Float is null", undefined, undefined, undefined), #(3, 0.0, " ", undefined, undefined, undefined), #(4, 123.4, undefined, undefined, undefined, undefined)) #(0, 0) b.dataArray b.lBoundsArray b.dimensions
-- create a new SafeArrayWrapper using data array d = SafeArrayWrapper a.dataArray d.dataArray d.lBoundsArray d.dimensions
-- create a new SafeArrayWrapper via copy, show it is a deep copy f = copy a f.dataArray f.lBoundsArray f.dimensions f.dataArray[1][1] = 999999 f.dataArray a.dataArray
次の例では、SQL データベースを更新します。ここでの更新メソッドは、渡された配列または SafeArrayWrapper 値です。
DogConn=createOLEObject "ADODB.Connection" DogConn.Open "driver={SQL Server}; server=dsqedb01.autodesk.com; database=MXSTest" recordSet = createOLEObject "ADODB.Recordset" recordSet.Open "SELECT * from TestTable" DogConn 1 3 -- adOpenKeyset adLockOptimistic fields=recordSet.Fields -- print out column names count = fields.count for i = 1 to count do (local item = fields.item (i-1); print item.name) recordSet.GetRows() -- display current contents recordSet.AddNew #("arbitraryFloat", "arbitraryChar", "boolean", "arbitraryInt") #(pi,"Hello World",true,42) -- add via array recordSet.AddNew (SafeArrayWrapper #("arbitraryFloat", "arbitraryChar", "arbitraryInt")) (SafeArrayWrapper #(e/pi,"Merry xmas!", 54321)) -- add via SafeArrayWrapper recordSet.close() recordSet.Open "SELECT * from TestTable" DogConn recordSet.GetRows() -- display current contents
次の例では、SafeArrayWrapper を使用して ActiveX コントロールのプロパティを取得/設定します。
rollout controlR86 "Microsoft Chart Control 6.0 (SP4) (OLEDB)" ( activeXControl ax "{3A2B370C-BA0A-11D1-B137-0000F8753F5D}" height:200 width:300 align:#left setupEvents:false ) createdialog ControlR86 height:250 width:350 data = ControlR86.ax.chartdata -- returns SafeArrayWrapper ControlR86.ax.chartdata = SafeArrayWrapper #(#(undefined, "R1", "R2", "R3", "R4", "R5"), #("C1", 1, 2, 3, 4, 5), #("C2", 1, 2, 3, 4, 5), #("C3", 5, 4, 3, 2, 1), #("C4", -1, 2, 3, 2, 1))
OLE -> MAXScript:
VT_EMPTY VT_NULL |
undefined |
VT_VOID |
OK |
VT_UI1 VT_UI2 VT_UI4 VT_I2 VT_I4 VT_INT |
Integer |
VT_R4 VT_R8 VT_CY |
Float |
VT_BSTR |
String |
VT_BOOL |
Boolean |
VT_DISPATCH |
OLEObject |
VT_ARRAY | VT_VARIANT |
SafeArrayWrapper |
MAXScript -> OLE:
SafeArrayWrapper Array |
VT_ARRAY | VT_VARIANT |
Integer |
VT_I4 |
Float |
VT_R4 |
Boolean |
VT_BOOL |
Color |
VT_I4 |
String |
VT_BSTR |
Undefined |
VT_EMPTY |
OLEObject |
VT_DISPATCH |
次の情報は、MSDN にあるドキュメント「Accessing Data with ADO」(ms-help://MS.MSDNQTR.2003OCT.1033/iisref/htm/AccessingDatawithADO.htm)から取得できます。
次の表は、いくつかの一般的なデータ ソース用の OLE DB 接続文字列を示しています。
データ ソース |
OLE DB 接続文字列 |
Microsoft Access |
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.mdb ファイルへの物理パス |
Microsoft SQL Server |
Provider=SQLOLEDB.1;Data Source= サーバ上のデータベースへのパス |
Oracle |
Provider=MSDAORA.1;Data Source= サーバ上のデータベースへのパス |
Microsoft Indexing Service |
Provider=MSIDXS.1;Data Source= ファイルへのパス |
後方互換性を提供するために、OLE DB Provider for ODBC は ODBC 接続文字列の構文をサポートしています。次の表は、一般的に使用される ODBC 接続文字列を示したものです。
データ ソース ドライバ |
ODBC 接続文字列 |
Microsoft Access |
Driver={Microsoft Access Driver (*.mdb)};DBQ=.mdb ファイルへの物理パス |
SQL Server |
DRIVER={SQL Server};SERVER= サーバへのパス |
Oracle |
DRIVER={Microsoft ODBC for Oracle};SERVER= サーバへのパス |
Microsoft Excel |
Driver={Microsoft Excel Driver (*.xls)};DBQ=xls ファイルへの物理パス; DriverID=278 |
Microsoft Excel 97 |
Driver={Microsoft Excel Driver (*.xls)};DBQ=.xls ファイルへの物理パス;DriverID=790 |
Paradox |
Driver={Microsoft Paradox Driver (*.db)};DBQ=.db ファイルへの物理パス;DriverID=26 |
Text |
Driver={Microsoft Text Driver (*.txt;*.csv)};DBQ=.txt ファイルへの物理パス |
Microsoft Visual FoxPro (データベース コンテナ付き) |
Driver= {MicrosoftVisualFoxProDriver};SourceType=DBC;SourceDb=.dbc ファイルへの物理パス |
Microsoft Visual FoxPro (データベース コンテナなし) |
Driver= {MicrosoftVisualFoxProDriver};SourceType=DBF;SourceDb=.dbf ファイルへの物理パス |