收录日期:2019/06/20 13:40:07 时间: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不支持递归?支持的

关于select语句的简单问题,在线等待,马上给分!! [散分] CET没考好 大家帮忙看看,我写的这个东西为什么不能实现 一个关于断线重连的奇怪问题,高手请进! 关于Domino和IIS下系统做单点登录的问题 ▲service:服务的控制问题:(按季老大的做了,怎么不对) 有人熟悉水晶报表么? asp动态树型目录问题...高手请进 菜鸟:一段小代码调不出来了,大家帮帮忙~ 到下面地方顶就给分,先来先得的 hibernate ONE_TO-MANY问题!想求一个语句,在查出Book表中的数据的同时查出Customer表中的数据怎么写!请高手进来看一下!!! VB的\"类",我看着晕,麻烦也学过C++的大哥帮忙指点一下. iframe中如何能够跨域访问DOM对象 求一个经常能用到视图或存储过程!不信您就进来看看! 哪位大虾有带时间的日期控件 和单独的时间控件,急着用,谢谢! hibernate怎样先排序再分页取出? [100分贴人人有分]在线,初学者简单问题,回答有还是没有,最好给出理由 OWC成图后,可以由X轴上的数值计算出Y轴上的数值吗? 自定义UserControl后,在aspx文件中调用,我想在aspx.cs文件中获得,如何处理 没理解了,究竟什么是数组的指针? 使用QuickRep如何打印出“网格” 为什么我的Windows 2003 的共享文件夹在内网其他电脑都无法访问? 帮忙看看这个语句,为什么不能实现 高手请进:困扰多时的问题了,装过vb6后再装vc6,就示有潜在的版本冲突.为什么? 有关msxml2.xmlhttp运用,出现网页错误问题 公司组网问题? 急,在线等,取日期表达式中的日期部分。 怎样获得某文件夹下的文件名啊? 急!!VC++ 安装完后出现的问题,求大虾指点 有关msxml2.xmlhttp运用,出现网页错误问题