收录日期:2019/04/18 21:07:18 时间:2016/06/01 15:43:48 标签:VB基础类
结构体是dll中的个函数所需的一个参数

结构体在vc是这样定义的:
typedef struct{
int x;
int y;
}Line
typedef Line* PLine

typedef struct{
...
PLine *line;
}Block
typedef Block* PBlock

typedef struct{
...
PBlock *block;
}Form
typedef Form* PForm
在Form里有指向Block数组的指针,Block里有指向Line数组的指针,也就是Form包含了多个Block的信息,而Block中包含多个Line的信息.

Block,Line的信息从XML中读出,生成Form结构.


现在用VB编程,我定义了一个用动态数组block_array,Form只要指向block_array(0)的地址.每从XML读到一个Block是,block_array增大一个.接下来读该Block的Line信息.dim temp_line() as line,数据放入该数组中.递归完后发现所有的Block指向的Line都是一样的. 显然错了.

请问在VB中如何,动态地生成一个变量.就象C中的new一样.

我用dim temp_line() as new line编译报错
dim temp_line() as line  ???

这样创建出来是line控件数组吧。。。。
是啊,一个block对应一个line数组,多个block就应该对应多个不同的line数组了,但我程序所有的block对应到了同一个line数组
前几个星期刚干过类似的事情,也是从XML文件中读取数据,结果放到一个复杂的自定义结构体当中。可以给你参考一下。

XML文档格式类似下面:
  <?xml version="1.0" encoding="GB2312" ?> 
- <Pages Count="2">
- <Page id="0" PageAddress="35.38.3.0" AreasCount="1">
- <UserArea Name="sign" LinesCount="1">
- <Line id="0" CharsCount="2">
- <Char id="0" Content="1" PossibleCharsCount="2" StrokesCount="1" Left="1" Top="1" Height="49" Width="49">
  <PossibleChars>一,7,</PossibleChars> 
- <PenStroke id="0" Color="0" LineWidth="1">
  <X>10,20,30,40,</X> 
  <Y>20,20,20,20,</Y> 
  <DeltaTime>0,100,100,100,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
  </Char>
- <Char id="1" Content="2" PossibleCharsCount="3" StrokesCount="2" Left="51" Top="1" Height="49" Width="49">
  <PossibleChars>十,t,4,</PossibleChars> 
- <PenStroke id="0" Color="0" LineWidth="1">
  <X>60,70,80,90,</X> 
  <Y>20,20,20,20,</Y> 
  <DeltaTime>0,100,100,100,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
- <PenStroke id="1" Color="0" LineWidth="1">
  <X>70,70,70,70,</X> 
  <Y>10,20,30,40,</Y> 
  <DeltaTime>0,50,50,50,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
  </Char>
  </Line>
  </UserArea>
  </Page>
- <Page id="1" PageAddress="35.38.3.1" AreasCount="1">
- <UserArea Name="sign" LinesCount="1">
- <Line id="0" CharsCount="2">
- <Char id="0" Content="1" PossibleCharsCount="2" StrokesCount="1" Left="1" Top="1" Height="49" Width="49">
  <PossibleChars>一,7,</PossibleChars> 
- <PenStroke id="0" Color="0" LineWidth="1">
  <X>10,20,30,40,</X> 
  <Y>20,20,20,20,</Y> 
  <DeltaTime>0,100,100,100,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
  </Char>
- <Char id="1" Content="2" PossibleCharsCount="3" StrokesCount="2" Left="51" Top="1" Height="49" Width="49">
  <PossibleChars>十,t,4,</PossibleChars> 
- <PenStroke id="0" Color="0" LineWidth="1">
  <X>60,70,80,90,</X> 
  <Y>20,20,20,20,</Y> 
  <DeltaTime>0,100,100,100,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
- <PenStroke id="1" Color="0" LineWidth="1">
  <X>70,70,70,70,</X> 
  <Y>10,20,30,40,</Y> 
  <DeltaTime>0,50,50,50,</DeltaTime> 
  <Force>100,100,100,100,</Force> 
  </PenStroke>
  </Char>
  </Line>
  </UserArea>
  </Page>
  </Pages>


代码如下:
'*********************以下定义一些自己的数据类型,用于信息存放*********************
'定义笔划
Public Type UsysStroke
    ID As Long          '笔划编号
    Color As Long       '笔划颜色
    LineWidth As Long   '笔划宽度
    x() As Single       '横坐标数组
    y() As Single       '纵坐标数组
    Force() As Byte     '压力数组
    DeltaTime() As Long '时间间隔数组
End Type
'定义字符
Public Type UsysChar
    ID As Long                 '字符编号
    Content As String          '识别结果
    PossibleCharsCount As Long '识别后返回相近字符的个数
    StrokesCount As Long       '该字符中笔划的数目
    Left As Single             '字符笔划集合的左边界
    Top As Single              '字符笔划集合的上边界
    Height As Single           '字符笔划集合的高度
    Width As Single            '字符笔划集合的宽度
    PossibleChars() As String  '返回的相近字符数组
    PenStroke() As UsysStroke  '笔划数组
End Type
'定义行
Public Type UsysLine
    ID As Long         '行编号
    CharsCount As Long '行中字的个数
    Char() As UsysChar '行中所包含的字数组
End Type
'定义Area
Public Type UsysArea
    Name As String      'UserArea名称
    LinesCount As Long  'Area中书写的行数
    Uline() As UsysLine '行数组**注意由于关键字的影响,此处的命名和XML文件中不同
End Type
'定义Page页
Public Type UsysPage
    ID As Long '页编号
    PageAddress As String  '页地址
    AreasCount As Long     '页中包含的UserArea数目
    UserArea() As UsysArea 'Area数组
End Type
'定义Request
Public Type UsysRequest
    Count As Long      '所包含页的数目
    Page() As UsysPage '页数组
End Type

Public Function ReadXML(FileName As String) As UsysRequest
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'本函数读取用于校验的XML文档,并将其中的数据存储成自己定义的数据结构UsysRequest
'参数FileName为校验组件输入XML文档的路径及文件名
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '下面定义一些用于循环控制的整型变量
    Dim i As Long '用于控制循环
    Dim j As Long '用于控制循环
    Dim h As Long '用于控制循环
    Dim l As Long '用于控制循环
    Dim m As Long '用于控制循环
    i = 0 '赋初值
    j = 0 '赋初值
    h = 0 '赋初值
    l = 0 '赋初值
    m = 0 '赋初值
    
    '下面定义一些用于操作XML元素的变量
    Dim objXML As New DOMDocument       '声明并实例化
    Dim PagesNode As IXMLDOMElement     '根元素
    Dim PageNode As IXMLDOMElement      'Page元素
    Dim UserAreaNode As IXMLDOMElement  'UserArea元素
    Dim ULineNode As IXMLDOMElement     'Line元素,注意名称和XML文档中不同
    Dim CharNode As IXMLDOMElement      'Char元素
    Dim PenStrokeNode As IXMLDOMElement 'PenStroke元素
    
    '以下是用层层嵌套的循环读取出XML文档中的内容,并转存成UsysRequest结构
    objXML.Load FileName '打开XML文档
    If objXML.documentElement Is Nothing Then '如果指定的XML文件不存在
        MsgBox " 指定的XML文件不存在!", vbOKOnly, "提示:"
        Exit Function
    End If
    Set PagesNode = objXML.documentElement '获取根元素
    Dim Request As UsysRequest '自己定义的UsysRequest结构
    Request.Count = CLng(PagesNode.getAttribute("Count"))
    Dim Page() As UsysPage
    For Each PageNode In PagesNode.selectNodes("./Page")
        ReDim Preserve Page(i)
        Page(i).ID = CLng(PageNode.getAttribute("id"))
        Page(i).PageAddress = Trim(PageNode.getAttribute("PageAddress"))
        Page(i).AreasCount = CLng(PageNode.getAttribute("AreasCount"))
        Dim UserArea() As UsysArea
        j = 0 '注意在下一个Page的循环过程前归零
        ReDim UserArea(j) '清空
        For Each UserAreaNode In PageNode.selectNodes("./UserArea")
            ReDim Preserve UserArea(j)
            UserArea(j).Name = Trim(UserAreaNode.getAttribute("Name"))
            UserArea(j).LinesCount = CLng(UserAreaNode.getAttribute("LinesCount"))
            Dim Uline() As UsysLine
            h = 0 '注意在下一个Area的循环过程前归零
            ReDim Uline(h) '清空
            For Each ULineNode In UserAreaNode.selectNodes("./Line")
                ReDim Preserve Uline(h)
                Uline(h).ID = CLng(ULineNode.getAttribute("id"))
                Uline(h).CharsCount = CLng(ULineNode.getAttribute("CharsCount"))
                Dim Char() As UsysChar
                l = 0 '注意在下一个行的循环过程前归零
                ReDim Char(l) '清空
                For Each CharNode In ULineNode.selectNodes("./Char")
                    ReDim Preserve Char(l)
                    Char(l).ID = CLng(CharNode.getAttribute("id"))
                    Char(l).Left = CSng(CharNode.getAttribute("Left"))
                    Char(l).Top = CSng(CharNode.getAttribute("Top"))
                    Char(l).Height = CSng(CharNode.getAttribute("Height"))
                    Char(l).Width = CSng(CharNode.getAttribute("Width"))
                    Char(l).Content = Trim(CharNode.getAttribute("Content"))
                    Char(l).PossibleCharsCount = CLng(CharNode.getAttribute("PossibleCharsCount"))
                    Dim txtChars As String
                    txtChars = CharNode.selectSingleNode("./PossibleChars").Text
                    Char(l).PossibleChars = GetStr(txtChars)
                    Char(l).StrokesCount = CLng(CharNode.getAttribute("StrokesCount"))
                    Dim PenStroke() As UsysStroke
                    m = 0 '注意在下一个字的循环过程前归零
                    ReDim PenStroke(m) '清空
                    For Each PenStrokeNode In CharNode.selectNodes("./PenStroke")
                        ReDim Preserve PenStroke(m)
                            PenStroke(m).ID = CLng(PenStrokeNode.getAttribute("id"))
                            PenStroke(m).Color = CLng(PenStrokeNode.getAttribute("Color"))
                            PenStroke(m).LineWidth = CLng(PenStrokeNode.getAttribute("LineWidth"))
                            Dim txt As String
                            txt = PenStrokeNode.selectSingleNode("./X").Text
                            PenStroke(m).x = GetSingle(txt)
                            txt = PenStrokeNode.selectSingleNode("./Y").Text
                            PenStroke(m).y = GetSingle(txt)
                            txt = PenStrokeNode.selectSingleNode("./Force").Text
                            PenStroke(m).Force = GetByte(txt)
                            txt = PenStrokeNode.selectSingleNode("./DeltaTime").Text
                            PenStroke(m).DeltaTime = GetLong(txt)
                        m = m + 1
                    Next
                    Char(l).PenStroke = PenStroke()
                    l = l + 1
                Next
                Uline(h).Char = Char()
                h = h + 1
            Next
            UserArea(j).Uline = Uline()
            j = j + 1
        Next
        Page(i).UserArea = UserArea()
        i = i + 1
    Next
    Request.Page = Page()

    '释放内存
    Set PenStrokeNode = Nothing
    Set CharNode = Nothing
    Set ULineNode = Nothing
    Set UserAreaNode = Nothing
    Set PageNode = Nothing
    Set PagesNode = Nothing
    Set objXML = Nothing
    
    ReadXML = Request '返回值
End Function

有一些用于数据转换的函数没有贴出代码,不过整个流程框架就是这个样子了。
谢谢,虽然很相似,但我要读的元素很多,不能像您一样采用循环,我要用递归的方式来读xml文件.
递归?你是说在VB里写一个递归函数以吗?
如果是,那么很不幸,VB6.0不支持递归的函数.这个功能在C和.NET里可以实现.
谁说VB不支持递归?支持的

symbian求职(北京) 重载操作符问题 spcomm 电子秤 老问题 统计 存储过程 无法从非嵌套表项访问行 IFrame Onunload里面读不到最新的服务器变量(ASP, JS) 我觉得BOSS的需求写得有点,问题,我能不能向他提意见 IIS和VS自带的服务器 连接SQL的问题 TDateTime的延时和提前怎么做? 这样获取鼠标相对控件的坐标为什么不对? 急救分页问题 关于CryptoStream无法Close的bug 请教一个小问题,全部分数35 关闭IE的时候,如何实现删除数据库中的数据 was中sessionListener的设置 关于树排序问题 MyEclipse6.5为什么我的机子不能用 用CAPICOM控件签名时hash算法是在哪里决定的? 心里不爽,散发! 计算器 跨frame的弹出层 一个简单的语句 为什么我的第二个socket连接不上呢? 有关List的删除问题 求C#组合键回显代码 如何使用IComparer来排序FileInfo[] 工具条 求一个浏览图像的vb小程序 delete语句的条件是not in +数组,如何写,谢谢! 求sql语句