2014-05-23 18 views
0

我正在移植使用复杂类型来包含结构化消息系统的VB6应用程序。我正在工作的当前问题是将其转换为VB.net结构。以下是声明:将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程序读取。

我没有问题转换成固定长度蜇伤的简单字符串而是变换的固定长度字符串的数组中WayPointRec这在随后包括WayPointRec在MessageStore的航点阵列中的是,其中我目前停留

也如何最好地处理固定长度字符串

编辑的“HGIinfo” 2D字符串数组

省略了一个更详细 - 顶层

Public MsgArray() As MessageStore 

其中MsgArray成长为

redim preserve MsgArray(x) 

与X受限0-100

+0

是有与所述C程序使用了该数据的任何灵活性,或这基本上是第三方事件吗?这并不是打开“在网络中全部做好”的大门,但其中一些问题非常棘手。 – Plutonix

+0

C程序运行跨平台,VAX-VMS,AIX 4.2,SYSTEM V R4 unix,Linux –

回答

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 

此外,不使用结构,你将无法初始化数组的大小,请参阅: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个问题:

  • 不能初始化数组的在.NET阵列与界限符。即: 公共HGIinfo(MAX_HGI,3)(5)作为字符串
  • 可使用结构阵列的未初始化尺寸
  • 不能初始化数组边界(1〜#),阵列从0在vb.net启动。

可以使用的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 

也有上限初始化字符串()阵列,你需要的东西像:

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继承的Classes,并设置Capacity属性。但整体效率不高。

,并且还可以利用来指定下界阵列:

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

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

+0

请参见编辑问题结束。 MsgArray是MsgStores的一个动态数组,它的最大容量限制为100 MsgStore –

+0

您可以在vb.net中以相同方式执行此操作,也可以使用实现“iList”接口的“ArrayList”:http://msdn.microsoft .COM/EN-US /库/ vstudio/system.collections.arraylist – porkchop