2014-02-04 4 views
3

При преобразовании кода VB6 в VB.NET у меня возникает несколько проблем. Здесь я расскажу об этом конкретно.VB6 to 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 

Следующие ошибки были возвращены:
Имя 'Forms'is не объявлено. Имя «Нагрузка» не объявлено.

Я просто прокомментировал инструкцию Load. Но добавление формы в коллекцию оказалось более жестким орешком для взлома.

я попытался несколько вариаций:

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

возвращается ошибка: 'Добавить' не является членом 'System.Windows.Forms.Form' ошибки

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

возвращается: Ссылка на для не общего пользователя требуется ссылка на объект.

oForm = My.Forms.Add(sFormName) 

возвращается ошибка: 'Добавить' не является членом 'RSC_Reports.My.MyProject.MyForms'.

Как я могу получить имя формы, переданное в качестве параметра, добавленного в коллекцию?

+1

Вам необходимо создать класс FormsCollection для this.Check этой ссылке -> http://support.microsoft.com/kb/308537 – abhi

+1

Вы не должны нужна коллекция 'Forms' вообще. – SLaks

+0

Вы конвертер использует ByRef часто, когда он должен использовать ByVal –

ответ

1

Код VB6 создает новый экземпляр формы с использованием имени класса. Способ VB.Net - это отражение.

Попробуйте этот код from here с текстом, чтобы сделать его незаметной.

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) 
+0

@Zac Спасибо за ваше редактирование! Это заставило меня понять, что я не смог скопировать часть кода из исходного источника. Теперь я скопировал пропущенную процедуру CreateForm в свой ответ и изменил код для вызова CreateForm. – MarkJ

+0

lol, должен обновить мой код тоже :) – Zac

+1

Код, предложенный @MarkJ, верен, но у меня все еще было значение «Nothing», возвращаемое вызовом CreateInstance. CreateInstance с одним параметром чувствителен к регистру; Вместо этого мне пришлось использовать «CreateInstance (objectName, True)», которые активируют нечувствительность к регистру, потому что у меня была неправильная строка верблюда, используемая в качестве имени формы. – Zac

Смежные вопросы