你能像在 VB6 中一样使用 VB.Net 形式 'statically' 吗?

Can you use VB.Net forms 'statically' the same as in VB6?

我已经将 VB6 程序转换为 VB.Net。该程序运行并且似乎可以正常运行 80%。我很难理解一些 for references 是如何工作的。

在 VB6 中我有这样的代码

 frmComms.MSComm1.PortOpen = True
' if port already used by other app then warn user and go back to initial screen
 If (Err.Number = PORT_ALREADY_USED) And (GlManualCom = MANUAL) Then
    frmDetection.Hide
    MsgBox rs.LoadResString(ErrMesxxx), vbCritical + vbOKOnly, rs.LoadResString(ErrMesxyz)
    Call frmSelection.RefreshSettings
    Unload Me
    frmSelection.Show
    Exit Sub
 ElseIf Err.Number = INVALID_PORT_NUMBER Then ' Invalid port number
    frmDetection.Hide
    MsgBox rs.LoadResString(ErrMes19Sub), vbExclamation + vbOKOnly, rs.LoadResString(ErrMes19Title)
    Call frmSelection.RefreshSettings
    Unload Me
    frmSelection.Show
    Exit Sub
  ElseIf Err.Number = DEVICE_NOT_OPEN Then ' This device is not open
    frmDetection.Hide
    MsgBox rs.LoadResString(ErrMeszzz) , vbCritical
    Call frmSelection.RefreshSettings
    Unload Me
    frmSelection.Show
    Exit Sub
 End If

这些 frmSelection 引用引用了 VB6 中的实际对象,但在 Vb.Net 中它们引用的是对象还是某些静态引用。 在代码的其他地方,它会在VB6形式中设置一个public变量为“frmSelection.CancelFlag = True”,但试图跟踪代码,我无法确定这个'frmSelection.CancelFlag'实际上影响了我的代码。我感觉我应该使用对 'frmSelection' 的对象引用。像'objSelection = new frmSelection',那么我可以使用对象来设置变量; objSelection.CancelFlag = 正确。

我用了一个程序把VB6代码转换成VB.Net,所以也许可以参考这些项目'statically'。 'static' 我的意思是 C++ 意义上的;您可以引用 class 的变量而无需创建 class.

在 VB6 中,我的印象是第一次引用表单会创建并加载表单,也许事实并非如此。但是在VB.Net如果我在窗体的Load事件中打断点,即使代码中有很多地方不断使用窗体的函数,它也不会停在那里。

我试图将一些 frmXYZ 引用转换为 objXYZ 以查看是否会改变结果,但似乎并没有。我创建了一个完全全局变量,而不是在表单中使用 public 变量,这确实有效。

表单在 vb.net 和 VB6 中的工作方式非常相似。通常在 .net 中,您会看到创建表单实例的代码,然后显示它。但是,您仍然可以使用 VB6 类型的方法,并使用“基本”实例 class.

所以,你可以这样走:

Form2.Show()

所以,这将创建一个该表单的实例,并加载它。

现在在任何其他形式的任何其他代码中,你可以去:

Form2.TextBox1.Text = "Hello"

所以,在这方面,你很好。

您的问题是关于您在该表格上用于串行通信部分的 MS-Comm object/control。

通常(甚至在 VB6 中),您可以在代码中创建该 ms-comm 对象的实例。但在很多情况下,为了避免必须创建该实例,您会在该窗体上放置一个 ms-comm 控件。这就是您的代码需要进行繁重工作的地方。

那么,从一般代码方法的角度来看?如果完全改变您在 VB6 中使用的编码风格和方法,您真的不需要太多。

“大”变化将发生在您没有 ActiveX ms-comm 控件的地方,因此这就是您需要解决、改变和努力的地方,并给予一些关心和爱护。

因此,要显示表单,您可以创建一个实例并显示它。或者您实际上可以只启动表单并为您创建一个实例。

所以,这实际上取决于您打开表单的方式。我不会费心去更改代码,只是显示 form.show() 来启动表单。

您需要重新构建并创建串口通信代码。那就是您将发生巨大变化的地方。 VB6 中的 ms-comm 控件很(简单),因为它可以在该窗体上连接代码事件。那就是您将发生重大代码更改的地方。那么对于 99% 的通用表单和代码呢?您不必更改太多代码。挑战在于您没有 ActiveX 串行 com 控件。您需要重新构建其工作方式,因为您在该表单上没有 ms-com ActiveX 控件。

因此,了解如何在 .net 中使用串行通信 - 如果没有简单的 ms-com 控件,那么该代码将需要重写。可以找到很多文章-像这样说:

https://www.xanthium.in/serial-port-programming-visual-basic-dotnet-for-embedded-developers

VB.Net 设置的基础结构的一部分是 My.Forms 对象,它被引入范围以便可以直接使用,即您通过语法 FrmName 引用它而不是使用全名 My.Forms.FrmName。因此,有时 FrmName 是类型,有时是 属性 My.Forms.FrmName,具体取决于上下文。

我建议您首先使用完整引用替换缩写引用,目的是最终完全不使用 object via My。至于 Load 事件,它是一个事件,只有在特定情况下才会被调用。如果你想在总是调用的东西上设置断点,在构造函数中设置它。