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 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 :
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: