| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1832 人关注过本帖
标题:VB自定义数据类型的数组调用内部变量,如何做入子程序
只看楼主 加入收藏
donholy
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-27
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:17 
VB自定义数据类型的数组调用内部变量,如何做入子程序
参见原程序:
    For i = 1 To RecNum
        Data(i) = OutStatus(i).H_Value     'H
    Next i
    Call Test(Data(), Result1, Result2)
    Report = Report & vbCrLf & "H_Value:" & vbTab & Result1 & vbTab & Result2
   
    For i = 1 To RecNum
        Data(i) = OutStatus(i).I_Value     'I
    Next i
    Call Test(Data(), Result1, Result2)
    Report = Report & vbCrLf & "I_Value:" & vbTab & Result1 & vbTab & Result2
   
    ......

    For i = 1 To RecNum
        Data(i) = OutStatus(i).Z_Value     'Z
    Next i
    Call Test(Data(), Result1, Result2)
    Report = Report & vbCrLf & "Z_Value:" & vbTab & Result1 & vbTab & Result2

能不能做一个子程序调用如 TestAll(Value),所有都直接调用如:
 TestAll(H_Value)
 TestAll(I_Value)
 ......
 TestAll(Z_Value)

在线等,谢谢!
搜索更多相关主题的帖子: 子程序 如何 
2015-05-27 10:50
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:20 
能不能做一个子程序调用如 TestAll(Value),所有都直接调用如:
可以,但 OutStatus 需要定义为 类 ,而不能定义为结构。

类 Class1 代码:
程序代码:
Option Explicit

Public A_Value As Long
Public B_Value As Long
Public C_Value As Long
Public D_Value As Long
Public E_Value As Long
Public F_Value As Long
Public G_Value As Long
Public H_Value As Long
Public I_Value As Long
Public J_Value As Long
Public K_Value As Long
Public L_Value As Long
Public M_Value As Long
Public N_Value As Long
Public O_Value As Long
Public P_Value As Long
Public Q_Value As Long
Public R_Value As Long
Public S_Value As Long
Public T_Value As Long
Public U_Value As Long
Public V_Value As Long
Public W_Value As Long
Public X_Value As Long
Public Y_Value As Long
Public Z_Value As Long


引入 模块文件,以便定义全局的 RecNum 和 Outstatus
代码如下:
程序代码:
Option Explicit

Public Const RecNum = 10
Public Outstatus(RecNum) As New Class1


最后 窗体 上的函数
程序代码:
Public Sub RVALUE(cs As String)
Dim i As Long
    For i = 1 To RecNum
        data(i) = CallByName(Outstatus(i), cs, VbGet)
    Next i
    Call Test(data(), Result1, Result2)
    Report = Report & vbCrLf & "I_Value:" & vbTab & Result1 & vbTab & Result2
End Sub

因为这行 Call Test(data(), Result1, Result2) 无法测试,所以只测试了循环不报错。

调用方式:
Call RVALUE("Z_Value")
属性名是 字符串类型。

授人于鱼,不如授人于渔
早已停用QQ了
2015-05-27 16:45
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
如果你 RecNum  是动态的,也可以使用 动态数组的方式进行
Public Outstatus() As New Class1

使用前,
redim Outstatus(RecNum)

授人于鱼,不如授人于渔
早已停用QQ了
2015-05-27 16:46
donholy
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-27
收藏
得分:0 
十分感谢版主!这段程序近20年前设计的,有近百个子模块,现在改成类模块工程太浩大了,所以在寻找不改变自定义变量结构的方法。
版主还有别的办法吗?
2015-05-28 08:15
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
如果结构体中各变量是按顺序定义的,可以用一个函数完成,该函数定义为“fun xxx(结构体内变量字符串 as string,结构体变量 as rec,要赋值的变量 as integer) as string,返回的字串即report。

能编个毛线衣吗?
2015-05-28 09:24
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
回4楼
你看到我的代码不?
如果你在运行过程中,不需要重定义 数组 元素,那就完全就可以直接改成类,就是修改一下定义而以。
或者重定义数组元素大小,但不要求保留数据(保留数据我没测试过,不知道适用于类否) 都可以使用这种方式。

原来是使用 type 定义的,
现在使用 Class 来定义而以。

Class 是 TYPE 的升级。
结构:按一定规律组织的数据。
  类:按一定规定组织的数据和方法。

授人于鱼,不如授人于渔
早已停用QQ了
2015-05-28 09:29
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
回复 楼主 donholy
自定义结构体是有一定的存储规则,结构体中各变量的地址是相对固定的。可以使用VB的内部函数VarPtr得到各变量的地址,再用CopyMemory得到数据。
写了一个简单的例子。
程序代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Type student
  BH As Integer
  BW As Integer
  AGE As Integer
End Type

Dim Stu(5) As student

Private Sub Form_Load()
  Dim i As Integer, j As Integer
  Dim test As Integer
  For i = 0 To 5
    Stu(i).BH = Int((160 - 120 + 1) * Rnd + 120)
    Stu(i).BW = Int((60 - 40 + 1) * Rnd + 40)
    Stu(i).AGE = Int((12 - 9 + 1) * Rnd + 9)
  Next

 Form1.Caption = Hex(VarPtr(Stu(0))) & Hex(VarPtr(Stu(1)))
Call CopyMemory(ByVal VarPtr(test), ByVal VarPtr(Stu(0).BH), 2)
Text1.Text = test

End Sub



大开眼界
2015-05-28 10:33
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 7楼 lianyicq
想法一样。

能编个毛线衣吗?
2015-05-28 10:57
donholy
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-27
收藏
得分:0 
谢谢wmf2014版主和lianyicq版主,这样好像还是不能直接用变量名字符串调用啊?(如用你们例子中的"BH"作为变量)
2015-06-01 13:49
donholy
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-27
收藏
得分:0 
回复 6楼 风吹过b
您这个方法应该很好,我会把他作为下一个版本的标准。谢谢您!

我现在暂时在找不改动数据结构方法,怕存储数据读不出来了
2015-06-01 13:53
快速回复:VB自定义数据类型的数组调用内部变量,如何做入子程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034936 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved