ユーザ定義型配列をクラスの外部から使いたい

解決


かんた  2004-03-04 23:58:32  No: 82405  IP: [192.*.*.*]

標準モジュールでユーザ定義型を宣言し、クラスで配列として宣言するActiveXDLLを作成しています。この配列の値をASP等から取得するいい方法を教えて頂きたいのです。
TESTDLL.Class1.UserAry(1).Name などという風には取得出来ないものでしょうか?宜しくお願いします。

===Module1====================
 Type USER_ARY
  Name As String
  Mail As String
 End Type
===Class1=====================
 Private UserAry() As USER_ARY
 Private Sub Class_Initialize()
  Redim UserAry(1)
  UserAry(0).Name = "TEST0"
  UserAry(1).Name = "TEST1"
 End Sub
==============================

編集    削除
魔界の仮面弁士  2004-03-05 10:21:25  No: 82406  IP: [192.*.*.*]

Publicなクラスモジュールで定義されたユーザー定義型であれば、
Variant型に格納することもできるため、VBScriptでも処理できます。

しかし、VBScript自体はユーザー定義型をサポートしていないため、
たとえユーザー定義型の値を受け取れたとしても、それを使用するには
いろいろな制限が付いて回ります。

VBScriptでの使用を考えるのであれば、ユーザー定義型は使用せず、
クラスとして返すように設計する事をお奨めします。

編集    削除
かんた  2004-03-06 01:35:38  No: 82407  IP: [192.*.*.*]

お返事ありがとうございます。
クラスでpublicな配列の宣言ができないため、やはり外部からの
配列の取得方法に苦慮しております。クラス内で作成した配列を外部から
取得したい場合、どのようにすれば良いでしょうか?

--(class1)-----------------------
Private pUserName() As Variant
Public Sub getAry(ByRef Names() As Variant)
    Names = pUserName
End Sub
Private Sub Class_Initialize()
    ReDim pUserName(0)
    pUserName(0) = "hoge0"
End Sub
--(vbscript)---------------------
Set objCls = CreateObject("TESTDLL.Class1")
Call objCls.getAry(Names) <--- 型エラー発生
---------------------------------
配列のコピーで取得を試みましたが、VBscriptからは「型が一致しません」
とエラーなります。。。

編集    削除
魔界の仮面弁士  2004-03-06 06:58:10  No: 82408  IP: [192.*.*.*]

> クラス内で作成した配列を外部から取得したい場合、どのようにすれば良いでしょうか?

==========================
Option Explicit
Private pUserName() As Variant
Public Function getAry() As Variant()
    getAry = pUserName
End Function
Private Sub Class_Initialize()
    ReDim pUserName(0)
    pUserName(0) = "hoge0"
End Sub
==========================
Option Explicit
Dim Names
Names = CreateObject("TESTDLL.Class1").getAry()
MsgBox Names(0)
==========================

編集    削除
魔界の仮面弁士  2004-03-06 07:04:21  No: 82409  IP: [192.*.*.*]

元のソースを活かすなら、こうかな。

==============================
Option Explicit
Private pUserName() As Variant
Public Function getAry(ByRef Names As Variant)
    Names = pUserName
End Function
Private Sub Class_Initialize()
    ReDim pUserName(0)
    pUserName(0) = "hoge0"
End Sub
==============================
Option Explicit
Dim Names, objCls   'Dim Names()でもOKかも
Set objCls = CreateObject("TESTDLL.Class1")
Call objCls.getAry(Names)
Call MsgBox(Names(0))
==============================

編集    削除
かんた  2004-03-08 22:50:04  No: 82410  IP: [192.*.*.*]

魔界の仮面弁士さん、どうもありがとうございます!
ソースの間違いまでご指摘頂き、お恥ずかしいばかりです。
重ね重ねお礼申し上げます。

編集    削除