救命啊!VB程序,一个比较复杂的问题,希望集思广益,在线等!!!

vikavika 2007-11-17 06:28:29


这个问题比较复杂,写得比较长,请大家原谅。因为对于VB不是很懂,但是又要实现这个情况,对于我来说实在很难。也因为不知道到底应该用哪些命令来实现,所以我只能把我要得到的结果写出来,希望高手们能给我点意见。

上图的四个方块,被视为四个互相连接的Modul,每个Modul都有四个Dock,分别为0,1,2,3.每个Modul只能够认识与之直接相连的Modul,.首先我要形成这四个Modul的一个Routing Table.正如上图所示。起点-> 终点 [Step]<进口>
第一行的-1表示Modul本身,例如从M1到M1,Step为0.
第二行是因为每个Modul可以认识与自己直接连接的Modul,所以也没有规则。例如,从M1到M0,step为1,从M0的dock2进入M0,所以简写为<M0.2>。
第三行起就有了一定的规则。例如红线标示的部分,因为知道M0与M1相连,于是在M1中寻找与M1直接相连的Modul,得到M2,那么从M0进入M2就需要2Step,因为还是通过M1,所以进口还是M1的Dock0,即为M1.0。同样的规则,可以得到这一行其余的语句。
根据以上的规则,可以通过第三行的信息来完成第四行的语句,直到把整张表格完成。

目前我的程序只能实现第一行,第二行以后的没有办法实现。



第二张图片显示的是我程序目前运行后所得到的结果。首先左边的框里点击那些小方格,形成需要的Modul的不同的组合,被点到的方格标志为“X”,然后点击"Create",给每个Modul赋值。右键点击任意一个Modul,在ListBox中出现这个Modul的完整的Routing。

希望大家帮帮忙。
...全文
126 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang111wen 2007-11-26
  • 打赏
  • 举报
回复
个人觉得,你先把你所要做的功能说出来,比如你要用在什么地方,做什么用的,或许大家可以从其他方面想到方案来帮你实现,你现在说的这个确实难懂
vikavika 2007-11-17
  • 打赏
  • 举报
回复
一下是FMS.vb

Public Structure SToken
Public StartID As String
Public ZielID As String
Public Kosten As Integer
Public Dock As Integer

Public ReadOnly Property str() As String
Get
Return StartID + " -> " + ZielID + " [" + CStr(Kosten) + "] via < " + CStr(Dock) + " >"
End Get
End Property
End Structure

Public Structure SRT_Entry
Public Modul As String
Public Dock As Integer
Public Kosten As Integer

Public ReadOnly Property str() As String
Get
Return "M: " + Modul + " -- D: " + CStr(Dock) + " -- K: " + CStr(Kosten)
End Get
End Property
End Structure

Public Structure SZK
Public StartID As String
Public ZielID As String
Public Kosten As Integer

Public ReadOnly Property str() As String
Get
Return "< " + StartID + " > < " + ZielID + " > < " + CStr(Kosten) + ">"
End Get
End Property
End Structure

Public Class FMS
Private m_ListRT As New ArrayList
Private m_StartID As Integer
Private m_ZielID As Integer
Private m_Kosten As Integer
Private m_Dock As Integer
Private m_iMRA As New Integer

Public Sub New(ByVal SID As Integer, ByVal ZID As Integer, ByVal KT As Integer, ByVal DK As Integer)

MyBase.New()

Dim rtEntry As SToken

rtEntry.StartID = SID
rtEntry.ZielID = ZID
rtEntry.Kosten = KT
rtEntry.Dock = DK

m_ListRT.Add(rtEntry)

m_iMRA = -1
m_StartID = SID
m_ZielID = ZID
m_Kosten = KT
m_Dock = DK

End Sub

#Region "Simulations-Funktion"
Public Event OutputDock(ByVal iFMS_ID As Integer, ByVal iDock As Integer, ByVal token As SToken)

Public Sub inputport(ByVal iPort As Integer, ByVal token As SToken)
' token.ZielID =

End Sub
Private Sub SendToken(ByVal dock0 As Boolean, ByVal dock1 As Boolean, ByVal dock2 As Boolean, ByVal dock3 As Boolean, ByVal token As SToken)
If dock0 Then RaiseEvent OutputDock(m_StartID, 0, token)
If dock1 Then RaiseEvent OutputDock(m_StartID, 1, token)
If dock2 Then RaiseEvent OutputDock(m_StartID, 2, token)
If dock3 Then RaiseEvent OutputDock(m_StartID, 3, token)
End Sub

#End Region

#Region "Debug"
Public Function GetRoutingTable() As ArrayList
Return Me.m_ListRT
End Function
#End Region

End Class
vikavika 2007-11-17
  • 打赏
  • 举报
回复
以下是我的程序,希望大家给点意见!!

Public Class Form1

Structure SMapElement
Public Dock0 As Integer 'left
Public Dock1 As Integer 'up
Public Dock2 As Integer 'right
Public Dock3 As Integer 'down

Public ReadOnly Property GetFMS(ByVal iDock As Integer) As Integer
Get
Select Case iDock
Case 0
Return Dock0
Case 1
Return Dock1
Case 2
Return Dock2
Case 3
Return Dock3
End Select
End Get
End Property

Public ReadOnly Property GetDock(ByVal iFMS As Integer) As Integer
Get
If Dock0 = iFMS Then Return 0
If Dock1 = iFMS Then Return 1
If Dock2 = iFMS Then Return 2
If Dock3 = iFMS Then Return 3
Return -1
End Get
End Property
End Structure

Private m_Map As Array
Private m_ListFMS As New ArrayList

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
FlexGrid()
showFMSInfo(-1)
End Sub

#Region "FMS Objects"
Private Sub CreateFMSobjects()

Dim SID As Integer
Dim ZID As Integer
Dim KT As Integer
Dim DK As Integer

Dim oFMS As FMS

For SID = 0 To m_Map.GetLength(0) - 1
ZID = SID
KT = 0
DK = -1
oFMS = New FMS(SID, ZID, KT, DK)

m_ListFMS.Add(oFMS)

AddHandler oFMS.OutputDock, AddressOf OnOutputDock

Next


End Sub

Public Sub OnOutputDock(ByVal iFMS_ID As Integer, ByVal iDock As Integer, ByVal token As SToken)

Dim iDestFMS, iDestDock As Integer

iDestFMS = CType(m_Map.GetValue(iFMS_ID), SMapElement).GetFMS(iDock)

If iDestFMS = -1 Then
Else
iDestDock = CType(m_Map.GetValue(iDestFMS), SMapElement).GetDock(iFMS_ID)
End If

End Sub
#End Region

#Region "Create"

Private Sub CreateMap()
Dim iRow, iCol As Integer
Dim i As Integer = 0

For iCol = 0 To AxMSFlexGrid1.Cols - 1
For iRow = 0 To AxMSFlexGrid1.Rows - 1
If AxMSFlexGrid1.get_TextMatrix(iRow, iCol) <> "" And i < 100 Then
AxMSFlexGrid1.set_TextMatrix(iRow, iCol, i)
i += 1
If i = 100 Then
MessageBox.Show("Es darf nur 99 Module." & Chr(13) & "Bitte das Profil neu erstellen!", "Fehler")
End If
End If
Next
Next

m_Map = Array.CreateInstance(GetType(SMapElement), i)

For iCol = 0 To AxMSFlexGrid1.Cols - 1
For iRow = 0 To AxMSFlexGrid1.Rows - 1
If Not AxMSFlexGrid1.get_TextMatrix(iRow, iCol) = "" Then
CreateMapEntry(iRow, iCol)
End If
Next
Next

End Sub

Private Sub CreateMapEntry(ByVal iRow As Integer, ByVal icol As Integer)

If Not AxMSFlexGrid1.get_TextMatrix(iRow, icol) = "" Then

Dim MapElem As New SMapElement
MapElem.Dock0 = -1
MapElem.Dock1 = -1
MapElem.Dock2 = -1
MapElem.Dock3 = -1

Dim i As Integer

'check Dock0 (links)
i = iRow - 1
If i >= 0 Then
If Not AxMSFlexGrid1.get_TextMatrix(i, icol) = "" Then
MapElem.Dock1 = AxMSFlexGrid1.get_TextMatrix(i, icol)
End If
End If

'check Dock1 (oben)
i = iRow - 1
If i >= 0 Then
If Not AxMSFlexGrid1.get_TextMatrix(i, icol) = "" Then
MapElem.Dock1 = AxMSFlexGrid1.get_TextMatrix(i, icol)
End If
End If

'check Dock2 (rechts)
i = icol + 1
If i < AxMSFlexGrid1.Cols Then
If Not AxMSFlexGrid1.get_TextMatrix(iRow, i) = "" Then
MapElem.Dock2 = AxMSFlexGrid1.get_TextMatrix(iRow, i)
End If
End If

'check Dock3 (unten)
i = iRow + 1
If i < AxMSFlexGrid1.Rows Then
If Not AxMSFlexGrid1.get_TextMatrix(i, icol) = "" Then
MapElem.Dock3 = AxMSFlexGrid1.get_TextMatrix(i, icol)
End If
End If

m_Map.SetValue(MapElem, CInt(AxMSFlexGrid1.get_TextMatrix(iRow, icol)))

End If

End Sub

#End Region

#Region "FlexGrid"

Private Sub FlexGrid()
Dim i As Integer
Dim iCellSize As Integer = 300

For i = 0 To AxMSFlexGrid1.Cols - 1
AxMSFlexGrid1.set_ColWidth(i, iCellSize)
Next
For i = 0 To AxMSFlexGrid1.Rows - 1
AxMSFlexGrid1.set_RowHeight(i, iCellSize)
Next
End Sub

Private Sub AxMSFlexGrid1_MouseDownEvent(ByVal sender As Object, ByVal e As AxMSFlexGridLib.DMSFlexGridEvents_MouseDownEvent) Handles AxMSFlexGrid1.MouseDownEvent

If e.button = 1 Then
Dim iCol As Integer = CType(sender, AxMSFlexGridLib.AxMSFlexGrid).MouseCol
Dim iRow As Integer = CType(sender, AxMSFlexGridLib.AxMSFlexGrid).MouseRow
If AxMSFlexGrid1.get_TextMatrix(iRow, iCol) = "" Then
AxMSFlexGrid1.set_TextMatrix(iRow, iCol, "X")
AxMSFlexGrid1.CellBackColor = Color.Yellow
Else
AxMSFlexGrid1.set_TextMatrix(iRow, iCol, "")
AxMSFlexGrid1.CellBackColor = Color.White
End If
End If

If e.button = 2 Then
Dim iCol As Integer = CType(sender, AxMSFlexGridLib.AxMSFlexGrid).MouseCol
Dim iRow As Integer = CType(sender, AxMSFlexGridLib.AxMSFlexGrid).MouseRow
Dim str As String = AxMSFlexGrid1.get_TextMatrix(iRow, iCol)
Dim i As Integer

If str = "X" Or str = "" Then
i = -1
Else
i = CInt(str)
End If

showFMSInfo(i)

End If
End Sub

#End Region

#Region "Show"
Public Sub showFMSInfo(ByVal iFMS_ID As Integer)
ShowDockInfo(iFMS_ID)
ShowRoutingTable(iFMS_ID)
End Sub

Private Sub ShowDockInfo(ByVal iFMS_ID As Integer)
If iFMS_ID = -1 Then
Me.Button_FMS.Text = "No FMS"
Else
Me.Button_FMS.Text = "FMS " + CStr(iFMS_ID)
End If
End Sub

Private Sub ShowRoutingTable(ByVal iFMS_ID As Integer)

Me.ListBox_RT.Items.Clear()

Dim rt As ArrayList
Dim i As Integer
Dim str As String

If Not iFMS_ID = -1 Then

rt = CType(Me.m_ListFMS.Item(iFMS_ID), FMS).GetRoutingTable()
For i = 0 To rt.Count - 1
str = CStr(i) + " : " + CType(rt.Item(i), SToken).str
Me.ListBox_RT.Items.Add(str)
Next
End If


End Sub
#End Region

#Region "Debugging"


Private Sub Button_Create_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Create.Click
CreateMap()
CreateFMSobjects()

End Sub

Private Sub Button_Clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Clear.Click

AxMSFlexGrid1.Clear()
Me.Button_FMS.Text = "FMS"
Me.ListBox_RT.Items.Clear()
Me.m_ListFMS.Clear()
End Sub

#End Region


End Class
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧