VB6 到 VB.Net 转换问题 - 未声明名称"表单"



将VB6代码转换为vb.net时,我会遇到一些问题。我会在这里特别处理一个。

原始VB6代码是:

Public Sub dynForm(sFormName As String, loadingForm As Form, Optional resizeMe As Boolean = True)
On Error GoTo ErrHandler
    'Used to dynamically open a form based on its name.
    Dim oForm As Form
    'Add a Form to the collection
    Set oForm = Forms.Add(sFormName)
    'Load the Form
    Load oForm
    If resizeMe Then
        setFrmSize oForm
    End If
    centerForm oForm
    'Show The Form
    oForm.Show 1, loadingForm
    If oForm Is Nothing Then Exit Sub
    Set oForm = Nothing
    Exit Sub
ErrHandler:
    logError Err.Description & vbCrLf & "sFrm:" & sFormName & " not found!",       Err.Number, "common.dynForm", ErrorMsg
End Sub

转换过程产生以下(我缩短了转换注释,该评论指的是不再有效的链接):

    Public Sub dynForm(ByRef sFormName As String, ByRef loadingForm As System.Windows.Forms.Form, Optional ByRef resizeMe As Boolean = True)
    On Error GoTo ErrHandler
    'Used to dynamically open a form based on its name.
    Dim oForm As System.Windows.Forms.Form
    'Add a Form to the collection
    'UPGRADE_ISSUE: Forms method Forms.Add was not upgraded. 
    oForm = Forms.Add(sFormName)

    'Load the Form
    'UPGRADE_ISSUE: Load statement is not supported. 
    Load(oForm)
    If resizeMe Then
        setFrmSize(oForm)
    End If
    centerForm(oForm)
    'Show The Form
    VB6.ShowForm(oForm, 1, loadingForm)
    If oForm Is Nothing Then Exit Sub
    'UPGRADE_NOTE: Object oForm may not be destroyed until it is garbage collected. 
    oForm = Nothing
    Exit Sub
ErrHandler: 
    logError(Err.Description & vbCrLf & "sFrm:" & sFormName & " not found!", Err.Number, "common.dynForm", ErrorType.ErrorMsg)
    End Sub

返回以下错误:
名称为"表格"。 名称"加载"未声明。

我刚刚评论了加载声明。但是,将表格添加到该系列中已被证明是一个更坚固的坚果。

我尝试了几种变体:

    oForm = System.Windows.Forms.Form.Add(sFormName)

返回错误:'add'不是'system.windows.forms.form'

的成员
    oForm = System.Windows.Forms.Form.AddOwnedForm(sFormName)

返回错误:引用非共享成员需要对象引用。

    oForm = My.Forms.Add(sFormName)

返回错误:'add'不是'rsc_reports.my.myproject.myforms'的成员。

如何将表格名称作为添加到集合中的参数传递?

VB6代码正在使用类名称创建表单的新实例。VB.NET做到这一点的方法是反思。

从此处尝试使用此代码,以使其对案例不敏感。

Imports System 
Imports System.Windows.Forms 
Imports System.Reflection 
Public Class ObjectFinder 
Public Shared Function CreateObjectInstance(ByVal objectName As String) As Object 
  ' Creates and returns an instance of any object in the assembly by its type name. 
  Dim obj As Object 
  Try 
    If objectName.LastIndexOf(".") = -1 Then 
      'Appends the root namespace if not specified. 
      objectName = [Assembly].GetEntryAssembly.GetName.Name & "." & objectName 
    End If 
    obj = [Assembly].GetEntryAssembly.CreateInstance(objectName, True) 
  Catch ex As Exception 
    obj = Nothing 
  End Try 
  Return obj 
End Function 
Public Shared Function CreateForm(ByVal formName As String) As Form
  ' Return the instance of the form by specifying its name.
  Return DirectCast(CreateObjectInstance(formName), Form)
EndFunction

然后更换您的行。

oForm = Forms.Add(sFormName) 

使用此行

oForm = ObjectFinder.CreateForm(sFormName)

最新更新