Preparando-se para migrar para o VB.NET


Você ainda esta trabalhando com o VB 6.0 certo ?

Mas pretende migrar para o VB.NET certo ?

Então você precisa se preparar para que a migração seja a menos traumática possível certo ?

Vou dar algumas orientações para te ajudar a alcançar este objetivo certo ?

Bem , vamos ao que interessa...

Dez Conselhos legais para você migrar seu projetos VB6.0 para o VB.NET

1- Utilize em seu código a conversão explícita de tipos de dados , sempre.

O primeiro conselho na verdade você deveria estar pondo em prática há muito tempo não somente por causa da migração mas por uma questão de programar melhor . Vou explicar , o Visual Basic não é uma linguagem fortemente tipada como o Java. Sem perceber você pode cometer verdadeiras barbaridades em seu código e o VB 6 nem vai ligar. Quer um exemplo ? Veja o código abaixo :

Dim i As Integer
Dim j As String
Dim k As Variant

i = 1000
j = "2000"
k = i + j

Debug.Print " O valor de k é : " & k
Debug.Print " O tipo de k é : " & VarType(k)
O resultado do processamento é o seguinte:

O valor de k é : 3000
O tipo de k é : 5 (tipo Double)

O Visual Basic vai compilar e executar o código acima sem dar nenhuma mensagem de erro de tipo incompatível . Você somou uma string com um inteiro e obtém um resultado do tipo Double , e tá tudo certo , o VB 6 deixa essas aberrações acontecer.

O VB.NET não aceita mais isso. Então , ou você passa a usar conversões explícitas , quando o caso requerer, ou vai ter muita dor de cabeça.

Quando digo que você deve usar conversão explicíta quero dizer que você deve fazer a conversão com a função de conversão apropriada de forma a tornar os tipos de dados compatíveis. No exemplo anterior você poderia fazer o seguinte para corrigir o problema .(veja as linhas destacadas)

Dim i As Integer
Dim j As String
Dim k As Variant

i = 1000
j = "2000"
k =CStr(i) + j

Debug.Print " O valor de k é : " & k
Debug.Print " O tipo de k é : " & VarType(k)
Dim i As Integer
Dim j As String
Dim k As Variant

i = 1000
j = "2000"
k = i +CInt(j)

Debug.Print " O valor de k é : " & k
Debug.Print " O tipo de k é : " & VarType(k)

É bom você saber também que :

- O tipo de dado Currency não é mais suportado no VB.NET o tipo que o substitui é o Decimal

- o tipo de dados Integer passou a ser chamado Short e representa um número inteiro de 16 bits com sinal.

- o tipo de dados Long agora se chama Integer e tem 32 bits com sinal e o tipo Long passa a ter 64 bits com sinal

Tamanho do inteiro Tipo de dados no VB tipos dados no VB.NET Tipo original na CLR
16 bits com sinal Integer (%) Short System.Int16
32 bits com sinal Long (&) Integer System.Int32
64 bits com sinal Não existe Long System.Int64

2- Procure não omitir as propriedades padrão dos objetos em seu código

Nas versões anteriores do VB podíamos omitir as propriedades padrão de um objeto. Por exemplo: A propriedade padrão do controle Label é Caption (no VB 6.0), então podíamos ter:

Label.Caption = "Caption propriedade padrão da Label"  
  Label = "Caption propriedade padrão da Label" 

ou para o controle Textbox onde a propriedade padrão é Text poderíamos fazer:

Text1.Text = "Usando a propriedade padrãol"  
 Text1 = "Sem usar a propriedade padrão" 

O VB 6.0 não se importava , mas ao migrar seu código o VB.NET não vai conseguir fazer a migração, pois no caso do controle Label a propriedade Caption foi alterada para Text , e , se você não indicar a propriedade padrão a migração não ocorre. Portanto sempre utilize a propriedade padrão do objeto.

3- Quando você for trabalhar com datas utilize o tipo Date e evite Double.

O VB6.0 permite que você use o tipo Double para armazenar datas , este tipo usa quatro bytes . No VB.NET uma variável do tipo Date usa o tipo de dado DateTime que é um inteiro de 8 bytes ; portanto não podemos converte Double para Date no VB.NET. O código abaixo é válido no VB 6.0 mas causa um erro de compilação no VB.NET.

Dim dbl As Double
Dim data As Date
data = Now
dbl = data                   'VB.NET: Não aceita datas em variáveis do tipo Double
dbl = DateAdd("d", 1, dbl)   'VB.NET: Não usa Double em funções date
dat = CDate(dbl)             'VB.NET: CDate não pode converter double to date

Embora o VB.NET forneça as funções ToOAdate e FromOADate para converte double e date , durante a migração fica difícil determinar a sua intenção em usar Double para armazenar datas e ela não ocorre. Portanto sempre use o tipo Date para armazenar datas.

4- Evite usar a propagação do tipo Null

As versões anteriores do VB suportavam a propagação do Null, i.e , quando o Null é usado em uma expressão o resultado da expressão será um Null. Veja no exemplo abaixo um exemplo onde o valor de Var sempre será Null devido a propagação:

Dim Var
Var = 1 + Null
Var = Null + Right$("Marcos", 1)
Var = Right("Olá", 0)
Devido a propagação do Null a variável Var sempre terá um valor Null

O VB.NET não suporta a propagação do Null. O código acima irá gerar um um erro de Tipo Incompatível (Type Mismatch). O VB6 possui duas versões para a função Right: Right$ que retorna uma string e Right que retorna uma variant que pode ser um Null. (Este é o motivo por Right("Olá", 0) retorna Null ; o mesmo ocorre com a função Left).

O VB.NET possui somente um Left qe retorna sempre uma string. Além disto as funções listadas abaixo NÃO retornam mais Null :

Chr Command CurDir Date Environ Error Hex Lcase Ltrim Mid Oct Right Rtrim Space Time Trim Ucase

Para verificar se um campo de uma tabela contém um valor Null você deve usar a função IsNull().

Além disto ao concatenar uma string com um valor Null ao programar com objetos de banco de dados é muito comum concatenar uma string vazia ao campo para ter certeza de um valor Null será transformada em um string vazia. Ex: String = rs!Field1 & ""

Você ainda pode fazer isto no VB.NET , ou seja , no VB.BET quando uma string vazia for concatenada com um Null o resultado será uma string vazia.

5- Use vetores (matrizes/arrays) com índice inicial Zero

O VB 6.0 permite que você defina uma matriz com qualquer índice inicial ; podemos também redimensionar uma matriz , usando ReDim , a qualquer tempo . O VB.NET sempre define uma matriz com índice inicial igual a Zero ; e Redim não pode ser usado , a não ser que a variável seja previamente declarada com Dim As Array. Vejamos um exemplo de código:

Dim a(1 To 10) As Integer 'LBound deve ser 0 no VB.NET
Dim v
ReDim v(10)               'Invalido : Não pode usar ReDim sem um Dim no VB.NET
Dim b(10) As Integer      'Válido : Cria um array de 11 inteiros
ReDim b(5) As Integer     'Válido : Agora você pode usar ReDim 

Quando você for migrar o seu projeto para o VB.NET se uma matriz possui índice incial igual a zero , nada será alterado. Porém se sua matriz não possuir índice incial igual a zero , ele será removido e uma mensagem de advertência será inserida no código como a seguir:

Dim a(1 To 10) As Integer
Alterado para:
'UPGRADE_WARNING: Lower Bound of array a was changed from 1 to 0
Dim a(10) As Integer

Portando procure usar matrízes com índice inicial igual a zero e evite usar Redim .

6- Use constantes no lugar de Literais

Procure usar no seu código as constantes que o VB 6.0 oferece. Por exemplo , em um código para maximizar um formulário onde podemos usar constantes ou literais :

Código usando constantes do VB 6.0 - USE Código usando literais - EVITE USAR
Me.WindowState = vbMaximized Me.WindowState = 2

Sabe porque ? Por que no VB.NET a maioria das constantes mudou de nome e de valor. O assistente de migração consegue migrar se você usa constantes , mas se usar valores literais , a migração pode ficar prejudicada.

Pelo memos motivo procure usar True e False ao invés de -1 e 0. Veja uma tabela com alguns exemplos:

NÃO USE USE
Form1.Show 1 Form1.Show vbModal
Chr(13) + chr(10) vbCrLf
chr(9) vbTab
Me.Forecolor = &H8000000F Me.ForeColor = vbgreen

7- Não use recursos obsoletos

Evite usar em seu código recursos que não são mais suportados pelo VB.NET . As seguintes palavras chaves não são mais suportadas:

Recursos NÃO mais suportados pelo VB.NET

Substitutos que você pode usar

Def<type> Declare suas variáveis de forma explícita
Computed GoTo/GoSub IF ou Select Case
GoSub/Return Utilize funções ou procedimentos
Option Base 0|1 VB.NET somente suporta arrays com índice inicial igual a zero
VarPtr, ObjPtr, StrPtr Funções não documentadas que não são mais suportadas
LSet Não mais suportada

8 - Fique atento na utilização das APIs do Windows

Muitas das APIs podem ser usadas no VB.NET exatamente como no VB 6.0 ; apenas devem ser ajustados os tipos de dados que sofreram alterações. Assim , o tipo de dados Long no VB 6.0 passou a ser Integer no VB.NET , e o tipo de dados Integer do VB 6.0 passou a ser Short no VB.NET.

Durante a migração estas alterações devem ser feitas por você . Vejamos um exemplo de utilização da API no código VB 6.0 abaixo:

Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
 Dim Ver As Long
 Ver = GetVersion()
 MsgBox ("System Version is " & Ver)
End Function	

Abaixo o código alterado para o VB.NET

Private Declare Function GetVersion Lib "kernel32" () As Integer        
Function GetVer()
    Dim Ver As Integer
    Ver = GetVersion()
    MsgBox("System Version is " & Ver)
End Function

Além disto , o VB 6.0 possui o tipo de dado string de tamanho fixo que não é suportado no VB.NET e que durante a migração para uma classe string. Abaixo um exemplo de código usado no VB 6.0:

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
Poderiamos substituir a

declaração :

Dim Buffer As String * 25

Por

Dim Buffer as String

Buffer = String(25," ")

O código usado no VB.NET ficaria assim:

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

Outro caso que vai requerer que você altere o código é a utilização da expressão As Any como tipo de dado na declaração da API. Este termo é usado para passar uma variável que pode ser uma String ou Null . O VB.NET não suporta As Any.

Podemos resolver isto usando duas versões da API : uma usando o tipo String e outra usando o tipo Long no lugar de As Any. Por exemplo , a API GetPrivateProfileString possui o parâmetro lpKeyName do tipo 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

Podemos substituir As Any usando a declaração da API em duas versões : uma que aceita um Long e outra que aceita uma string: Vejamos as duas versões:

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

Quando você quiser passar um valor Null para a API , basta usar a versão - GetPrivateProfileStringNullKey - fazendo isto a migração ocorre sem problemas.

Mesmo tomando todos estes cuidados haverá situações que poderão exigir que você faça alterações no código durante o processo de migração. Isto ocorre em situações de uso das APIs para criar e gerenciar Threads , subclasses do Windows , acesso a fila de mensagem , etc...

Não tem jeito , cada caso deve ser analisado isoladamente e o ajuste deve ser feito levando-se em conta a melhor solução.

9 - Cuidado na utilização de formulários no seu projeto

Quando utilizar formulários na versão 6.0 do VB use sempre a propriedade ScaleMode definida como Twips (este é o valor padrão). Ao efetuar a migração o VB.NET irá transformar as coordenadas de seus formulários de Twips para Pixels.

Além disto veja a lista(resumida) de incompatibilidade dos Windows Forms:

Obs: ScaleMode retorna ou define um valor que indica a unidade de medida para as coordenadas de um objeto quando usamos os métodos gráficos ou quando posicionamos controles.O valor para Twips é o seguinte:

vbTwips 1 (Padrão) Twip (1440 twips por polegada ).

Os formulários da plataforma .NET - Windows Forms - suportam somente fontes True-Type e Open-Type .

Se você usar outro tipo de fonte durante a migração as fontes serão substituídas pela fonte padrão do sistema e você vai perder toda a formatação : tamanho , negrito , itálico , sublinhado , etc...Então , nem pense em usar a fonte padrão do Visual Basic 6.0 - MS Sans Serif - pois ela não é True Type ; a recomendação é usar a fonte Arial.

10 - Não utilize a vinculação tardia (Late Binding) de objetos

Tanto o VB 6 como VB.NET suportam a vinculação(ou associação) tardia (Late Bound) de objetos ; Vinculação Tardia !!!!???

Por vinculação tardia entendemos ser a prática de declarar uma variável como sendo do tipo Objeto e associá-la a uma instância de uma classe em tempo de execução.

A utilização da vinculação Tardia pode originar problemas na hora da migração se você usar as propriedades padrão dos objetos no VB 6.0 , ou se uma propriedade ou método/evento sofreu alteração.

Vejamos um exemplo de código usando Late bound comparado com outro que usa a Early-Binding.(vinculação prévia)

Dim obj As Object
Set obj = Me.Label1
obj.Caption = "Ola , pessoal"
  == Dim obj As Label
Set obj = Me.Label1
obj.Caption = "Ola, Pessoal"
Prefira usar o código com Early-Bound
Late Bound   Early-Bound  

No código acima , ao usar Late Bound , teríamos um problema na migração , visto que a propriedade Caption do controle Label foi substituída pela propriedade Text.

Como o objeto declarado não tem um tipo específico , o assistente de migração não tem como traduzir o código corretamente para a nova versão. Evite então declarar variáveis como do tipo object.

Utilize então a vinculação prévia - Early-Binding.

Para terminar , mais conselhos sábios do tio Zé (diretos da MSDN) para você migrar com segurança :

  1. Não tente migrar direto do VB3 16 bits para o VB.NET , meu filho ! migre o projeto para o VB 6.0 e , se conseguir , tente migrar para o VB.NET.
  2. Não tente migrar aquele seu sistema de folha de pagamento completo para o VB.NET , seja prudente, comece com projetos pequenos e vá ganhando experiência...
  3. Procure aprender tudo sobre a nova plataforma e se familiarizar com as mudanças.
  4. Em projetos para banco de dados procure usar ADO nos seus projetos VB 6.0. Evite DAO e RDO.
  5. Evite criar projetos DHTML ou WebClasses no VB 6.0 . Eles não podem ser migrados para o VB.NET.

Depois de tanto conselho , mereço um descanso. Até mais...

Veja os Destaques e novidades do SUPER DVD Visual Basic  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Veja também os Cursos com vídeo aulas e projetos exemplos:

    Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti