将VB6嵌套类型重新修改为VB.net中的结构

时间:2014-05-23 23:42:40

标签: arrays vb.net vb6 structure

我正在移植一个使用复杂类型的VB6应用程序来包含结构化消息系统。我正在处理的当前问题是将其转换为VB.net结构。这是宣言:

Global Const MAX_MSGS = 150     ' Max number of messages per set
Global Const MAX_SETS = 100     ' Max number of message sets
Global Const MAX_HGI = 96       ' Max number of HowGozIt messages per set
Global Const MAX_WPS = 96       ' Max number of way points per message set
Global Const MAX_FLS = 15       ' Max number of flight levels per waypoint

Type MessageRec
 MessType As Integer           'Message Type
 MessIndex As Integer          'Message Index (not used currently)
 MessNextBit As Integer        'last bit for Mops messages
 MessTotal As Integer          'Mess total
 MultMessBit As Integer        'Multiple message bit position
 MessTitle As String * 25      'Message title
 MessNo As String              'Message Numbers and data for mops edit
 MessText As String            'I/F displayable text
 MessStr As String             'message bits for mops msgs, can be file for acars,aoc
 MessLabel As String * 4       'Label and sublabel
 TimeDelay As Integer          'Delayed time in seconds before message is delivered
 Active As Boolean             'Flag determines active/deactive
 AutoInit As Boolean            'Flag if part of auto init bundle
 AIDelay As Integer             'Auto Init time delay (secs)
End Type

Type WayPointRec
 Name As String * 7
 DeltaTime As String * 5
 FltLevel As String * 5
 DeltaFuel As String * 5
 Lat As String * 6                   ' Latitude of waypoint
 Long As String * 7                  ' Longitude of waypoint
 SAT As String * 3                   ' Standard Air temp (no need to save in database)
 Via As String
 NumAlts As String * 2                ' Numer of altitudes for following weather data
 FL(0 To MAX_FLS) As String * 3      ' Flight level for this weather
 WindDir(0 To MAX_FLS) As String * 3 ' Wind direction
 WindSpd(0 To MAX_FLS) As String * 3 ' Wind speed
 Temp(0 To MAX_FLS) As String * 3    ' Temperature
End Type

Type MessageStore                  
 Nmsgs As Integer              'Number of messages in the message set
 Fltno As Integer              'Flight Number
 SubFltNo As String * 1        'For multiple messages with same flight number
 CityPair As String * 7        'City Pair
 Descr As String * 12          'Message Set Description
 Hot As Integer                'Hot/Cold flag (true => hot, use second weather message set)
 DWndFL(0 To 3) As Integer     'Descent wind flight level (4 altitudes)
 DWndDir(0 To 3) As Integer    'Descent wind direction (4 altitudes)
 DWndSpd(0 To 3) As Integer    'Descent wind speed (4 altitudes)
 WndSpd(0 To 9) As Integer     'Start/end wind speed (5 altitudes)
 WndDir(0 To 9) As Integer     'Start/end wind direction (5 altitudes)
 TempDev(0 To 1) As Integer    'Start/end Temperature deviation from standard
 altn(0 To 1) As String * 3    'Alternate airports for area weather information
 nHGIwpts As Integer           'Number of waypoints for howgozit info
 HGIinfo(1 To MAX_HGI, 0 To 3) As String * 5  'Howgozit information
 MsgData(1 To MAX_MSGS) As MessageRec 'Message data mlw 7/12/02 changed 30 to 60
 nwpts As Integer              'Number of waypoints for winds/temp info
 WayPoints(1 To MAX_WPS) As WayPointRec 'For canned messages
 Index As Integer
 Active As Boolean             'Flag determines active/deactive
 DeltaArrivalTime As Integer   'add or subtract to get actual arrival time
 TimeToGate As Integer         'Time to gate from T/D for HOWGOZIT
End Type

结构MessageStore是磁盘格式(所有字段都转换为字符串进行写入),由另一个C程序读取。

对于简单的字符串转换为固定长度的stings我没有问题,但在WayPointRec中转换固定长度字符串的数组,然后包含在MessageStore的WayPointRec的WayPoints数组中,这是我目前被卡住的地方

还如何最好地处理固定长度字符串的“HGIinfo”2D字符串数组

修改

遗漏了一个细节 - 顶级

Public MsgArray() As MessageStore

其中MsgArray成长为

redim preserve MsgArray(x)

x限制为0-100

1 个答案:

答案 0 :(得分:0)

Public Class MessageStore
    Public MsgData As MessageRec
    Public WayPoints As WayPointRec
    Public DWndFL(3) As Integer
    Public HGIinfo(MAX_HGI, 3)() As String
End Class

Public Class WayPointRec
    Public FL(MAX_FLS)() As String
End Class
但是,最好将数组重新编写为类似的东西(或者将它们全部转化为类,但这样做太多了):

Private _HGIinfo(MAX_HGI, 3, 5) As String

此外,如果不使用Structures,您将无法初始化数组大小,请参阅:http://msdn.microsoft.com/en-us/library/2hkbth2a%28v=vs.71%29.aspx

还:http://msdn.microsoft.com/en-us/library/wak0wfyt.aspx#BKMK_CreatingAnArray

应该涵盖转换,需要推断休息。

3个问题:

  • 无法使用bounds说明符在.net中初始化数组数组。即: 公共HGIinfo(MAX_HGI,3)(5)As String
  • 无法使用Structures初始化数组大小
  • 不能初始化数组边界(1到#),数组从vb.net中的0开始。

你可以使用getter / setter属性来解决它们(但这很难看):

Private _HGIinfo(MAX_HGI, 3)() As String
Public Property HGIinfo(ByVal a As Integer, ByVal b As Integer) As String()
    Get
        ' perform some checks on value or MAX_HGI
        Return _HGIinfo(a, b)
    End Get
    Set(ByVal value As String())
        ' perform some checks on value or MAX_HGI
        _HGIinfo(a, b) = value
    End Set
End Property
HGIinfo(0, 1)(3).SubString(0, 4) ' would get the first 4 chars of the 3rd string, at position 0,1 in the _HGIinfo array

另外,要初始化具有上限的String()数组,您需要以下内容:

Private _HGIinfoStr(5) As String
Private _HGIinfo(MAX_HGI, 3)() As String
Public Sub New()
    _HGIinfo(0, 0) = _HGIinfoStr ' would need to loop through 0 to MAX_HGI, and also 0-3 to init all the members of the _HGIinfo array with bounds.
End Sub

再次,这将是非常混乱。类方法供参考:

Public Class HGIinfoClass
    Public _HGIinfoStr(5) As String
End Class
Private _HGIinfo(MAX_HGI, 3) As HGIinfoClass
Public Sub test()
    _HGIinfo(3, 3)._HGIinfoStr(3) = "test"
End Sub

实际上,我正在考虑使用属性来维护当前函数并重新格式化新数组边界并返回的方法,遗憾的是,它并不那么简单。需要数组副本或一些复杂的循环。

编辑:另外,另一种方法是将它们转换为继承自ArrayList的类,并设置Capacity属性。但总体来说效率较低。

并且还可以使用以下命令指定数组的下限:

Array.CreateInstance(GetType(String), New Integer(){5}, New Integer(){1}).

看(再次,真的很难看):http://msdn.microsoft.com/en-us/library/vstudio/x836773a