Перетворення ваших проектів з VB6 в VB.NET

Переклад: Mr.Young, VBstep.ru

Windows API

У багатьох виклики API функцій, які у Visual Basic 6.0, доведеться
коригувати типи даних відповідно до нового стандарту. Оскільки в VB 6.0,
тип даних Longвідповідає типу Integerв VB.NET, а
тип Integer з VB6 нового типу Short. Ці зміни зроблені для
полегшення використання API функцій у ваших додатках. Дивіться приклад:

Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
    Dim Ver As Long
    Ver = GetVersion()
MsgBox ("Версія Windows" & Ver)
End Function

Замінюємо на:

Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
    Dim Ver As Integer
    Ver = GetVersion()
MsgBox ("Версія Windows" & Ver)
End Function

На додаток до змінених числовим типами даних, змінений і тип String,
в VB 6.0 рядок могла бути фіксованою довжини, а тепер це не підтримується і
Вам доведеться звертатися до класу String для установки довжини рядка. Дивіться
приклад:

Private Declare Function GetUserName Lib "advapi32.dll" _
			Alias "GetUserNameA" _
			(ByVal lpBuffer As String, _
			ByRef nSize As Long) As Long
Function GetUser()
    Dim Ret As Long
    Dim UserName As String
    Dim Buffer As String * 25
    Ret = GetUserName(Buffer, 25)
    UserName = Left$(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox (UserName)
End Function

можливо найпростіший варіант для подальшого перетворення, зараз створювати
рядки фіксованої довжини, що складається з 25 символів, наприклад так:

    Dim Buffer As String
    Buffer = String$(25, " ")

Ось як буде виглядати в Visual Basic.NET:

Declare Function GetUserName Lib "advapi32.dll" _
			Alias "GetUserNameA" _
			(ByVal lpBuffer As String, _
			ByRef nSize As Integer) As Integer
Function GetUser()
    Dim Ret As Integer
    Dim UserName As String
    Dim Buffer As String
    Buffer = New String(CChar(" "), 25)
    Ret = GetUserName(Buffer, 25)
    UserName = Left(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox(UserName)
End Function

У деяких випадках, Visual Basic.NET дозволяє краще передавати дескриптор
рядків API функцій, Ви можете довільно оголошувати те як хочете використовувати
рядок, як ANSI або як UNICODE символи.

Є три випадки, коли Ви повинні будите зробити деякі зміни. По-перше,
передачу API функції для користувача типів даних містять рядки фіксованої
довжини або масив байтів. У VB.NET Ви повинні будите змінити свій код, додавши
атрибути (з System.Runtime.InteropServices) до кожного рядка фіксованої довжини
або байтовому масиву. По-друге використання при оголошення функції змінної
типу As Any, не підтримується в VB.NET. Змінні типу As Any часто використовуються
для передачі рядків або порожніх покажчиків (Null); Ви можете замінити використовуване у
VB 6.0 оголошення функції на два, одне з Long, іншого зі String. Для прикладу розглянемо
параметр lpKeyName, функції GetPrivateProfileString, він має тип As Any:

Private Declare Function GetPrivateProfileString Lib "kernel32" _
			Alias "GetPrivateProfileStringA" _
			(ByVal lpApplicationName As String, _
			ByVal lpKeyName As Any, _
			ByVal lpDefault As String, _
			ByVal lpReturnedString As String, _
			ByVal nSize As Long, _
			ByVal lpFileName As String) As Long

Ви видаляєте оголошення з типом As Any, замінюючи його на дві версії оголошення з Long і String:

Private Declare Function GetPrivateProfileStringKey Lib "kernel32" _
			Alias "GetPrivateProfileStringA" _
			(ByVal lpApplicationName As String, _
			ByVal lpKeyName As String, _
			ByVal lpDefault As String, _
			ByVal lpReturnedString As String, _
			ByVal nSize As Long, _
			ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileStringNullKey Lib _
			"kernel32" Alias _
			"GetPrivateProfileStringA" _
			(ByVal lpApplicationName As String, _
			ByVal lpKeyName As Long, _
			ByVal lpDefault As String, _
			ByVal lpReturnedString As String, _
			ByVal nSize As Long, _
			ByVal lpFileName As String) As Long

Коли Ви хочете передати функції порожній покажчик, використовуйте версію
GetPrivateProfileStringNullKey. Майте введу, що роблячи подібну
перетворення викликів функцій Вам все рівно доведеться, при переході на Visual
Basic.NET, так що краще робити це вже зараз.

І нарешті, Ви повинні будите зробити деякі зміни якщо використовуєте API для
створення потоків, субкластінга, пасток і т.д. Деякі з цих функцій викличуть помилку
періоду час виконання (run-time error) у Visual Basic.NET. Багато API функції мають
еквівалент в Visual Basic.NET або в. NET Framework. Ви повинні будите змінювати їх від
випадку до випадку.

Повна версія статті знаходиться тут.

Форми та елементи керування

Visual Basic.NET використовує нову угоду для форм, Windows Forms. Windows
Forms практично сумісні з формами Visual Basic 6, проте є деякі
ключові відмінності, які наведені нижче:

  • Windows Forms не підтримують елемент
    управління OLE container control. Ви повинні
    уникати використання цього елемента
    управління у ваших додатках
    створюваних у Visual Basic 6.0
  • Відсутня контрол Shape в Windows Forms.
    Квадрати і прямокутники будуть замінені
    Labels, в той час як кола і овали не будуть змінені.
    Ви повинні уникати використання їх у ваших додатках.

  • У Windows Forms не буде елемента Line.
    Горизонтальні та вертикальні лінії
    будуть включені в Labels. Діагональні лінії
    залишаться без змін, Ви повинні уникнути їх
    використання.

  • Нові команди для роботи з графікою
    замінять методи Форми, такі як, Circle, CLS,
    PSet, Line, І Point. Оскільки нова
    об'єктна модель відрізняється від використовуваної
    в Visual Basic 6.0, то ці методи не можуть бути поновлені.

  • Для елемента керування Timer, властивість Interval
    встановлення в 0 не відключає таймер, а
    скидає на 1. У проектах Ви повинні
    будите замінити властивість Interval = 1 на Enabled
    = False.

  • Windows Forms є два засоби управління
    меню, MainMenu і ContextMenu, беручи до уваги,
    що в Visual Basic 6.0 тільки один елемент
    управління меню, який може бути відкритий як MainMenu або ContextMenu.
    Елемент управління меню заміниться на
    MainMenu, Вам доведеться заново створювати
    контекстне меню використовуючи ContextMenu.

  • Windows Forms не підтримуватиме
    динамічний обмін даними (DDE).

  • Windows Forms не буде методу Form.PrintForm.
  • Хоча Windows Forms буде підтримувати drag-and-drop,
    об'єктна модель досконала інша Visual
    Basic 6.0. Тому використовувані в Visual Basic 6.0
    властивості і методи drag-and-drop оновлено не
    будуть.

  • Структура. NET має поліпшений об'єкт
    Clipboard (System.WinForms.Clipboard), Це передбачає
    більше функціональних можливостей і
    більшу кількість підтримуваних
    форматів об'єкт Clipboard в Visual Basic 6.0. Однак, через відмінності
    між об'єктними моделями, інструкції буфера обміну не можуть бути
    автоматично модернізовані.

  • Windows Forms не будуть підтримувати властивість Name у форм і контролів, перебір всіх
    контролів для пошуку контрола з потрібним ім'ям працювати не буде. Але це можна
    буде зробити по-іншому

  • Щоб гарантувати правильні розміри
    ваших форм, завжди у своїх програмах,
    використовуйте ScaleMode = twips. Після оновлення,
    Visual Basic.NET автоматично перетворює твіп
    в пікселі.

  • Windows Forms підтримує лише шрифти true-type
    і open-type. Якщо у вашому додатку використовуються
    інші шрифти, то вони будуть замінені на
    шрифти встановлені в системі за умовчанням,
    при цьому всі елементи форматування (розмір,
    курсив і т.д.) буде втрачено. У VB 6.0 скрізь
    за замовчуванням використовується шрифт MS Sans Serif. З цієї причини,
    рекомендується використовувати Arial, скрізь де
    Ви застосовуєте форматування тексту.

Повна версія статті знаходиться тут.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*