vb 控件属性 数组解决办法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Vb 属性接口数组解决办法
前不久制作Activex 控件,自定义接口成员,本来想通过外界传递数组给控件,但是我没有找到设置接口成员属性为数组的方法(我是个VB初学者,直到目前也没有找到方法)。后来发现vb中字符串长度可以存放多达2亿个字符。想到了将数组转换为字符串然后用字符串转换为数组的方法。
整体思路:在控件外接程序中将数组生成字符串,在控件里面将得到的字符串转换为数组完成数组的传递。举例详细代码如下宿主程序中按钮Command1单击触发以下函数运行:第一个For 循环生成x(0 to 50),y(0 to 50)两个数组。a,b为两个字符串,其第一个字符(数字形式)存放数组元素数目一共从0到50,有51个元素。Str()指令是将数字转换为字符数字,比如将51转换为“51”。第二个For循环将a,b两个字符串不断的添加字符(数字转换为字符形式,采用&连接,中间用逗号隔开)。从而a,b字符串分别是“51,0,1,2,3……,50”和“51,627.5 578.5 531.5 486.5……627.5”
控件的名称为ctr,为其设置了三个属性接口sn(布尔型) snx(字符串)sny(字符串)。其中snx,sny分别用于承接外界传递的字符串,Sn为某个位(与该主题无关,在控件中指示另外某个事件的)Private Sub Command1_Click()
Dim cd As Integer
Dim x() As Double
Dim y() As Double
cd = 50
ReDim x(cd)
ReDim y(cd)
For i = 0 To cd Step 1
x(i) = i
y(i) = (i - 25) ^ 2 + 2.5
Next i
Dim a As String
Dim b As String
a = Str(cd + 1)
b = Str(cd + 1)
For i = 0 To cd Step 1
a = a & "," & Str(x(i))
b = b & "," & Str(y(i)) Next i
ctr.sn = True
ctr.snx = a
ctr.sny = b
End Sub
控件中程序字符串处理代码Private Sub zhunhuan()
Dim xa() As Double
Dim ya() As Double
Dim af2() As String
Dim af3() As String
af2 = Split(m_snx, ",")
af3 = Split(m_sny, ",")
Dim cd As Integer
cd = Int(Val(af2(0))) ReDim ya(cd - 1)
ReDim xa(cd - 1)
For i = 0 To (cd - 1) Step 1 xa(i) = Val(af2(i + 1)) Next i
For i = 0 To (cd - 1) Step 1
ya(i) = Val(af3(i + 1))
Next i
End Sub
上述代码split函数将字符串剥离成一个数组从而af2(),af3()中存放字符即af3()中af3(0)为“51” af3(1)为“627.5” af3(2)为“578.5”For循环中Val(af3(i + 1))将af3(i + 1)中元素由字符转换为数字即af3(1)由“627.5”变换成为627.5 从而完成了整个数组由宿主程序往控件的传递。
附:程序前面自动生成的属性代码(即在属性设置完成向导生成的代码)
Const m_def_snx = "0"
Const m_def_sny = "0"
Const m_def_sn = 0
'属性变量:
Dim m_snx As String
Dim m_sny As String
Dim m_sn As Boolean
附:程序后面生成的属性代码(应该分别有三对get,let函数以及InitProperties(),ReadProperties(PropBag As PropertyBag) ,WriteProperties(PropBag As PropertyBag)等函数因为只有下面的函数要做添加代码,其它的几个都原封不动不做修改)。所作的修改也仅仅是在PropertyChanged "sny"后面添加了一句Call zhuanhuan也就是宿主程序中ctr.sn = True ctr.snx = a ctr.sny = b依次传递完三个属性后在最后一个属性传递完后启动zhuanhuan函数。
Public Property Let sny(ByVal New_sny As String)
m_sny = New_sny
PropertyChanged "sny"
Call zhuanhuan
End Property
作为一个初学者仅仅提出自己在项目中一个问题的解决办法,供大家讨论参考。