Grandeur et décadence de vb2008

Grandeur et décadence de VB6/VBA vers VB2008

Introduction

Ce tutoriel est un résumé succinct de quelques différences entre les fonctions et instructions de VB6 et VB2008, et des alternatives éventuelles... agrémenté de mes commentaires... Je n'ai pas grande prétention, mais je pense que cela peut être utile à d'autres qui se mettent à programmer en VB.NET ayant une base sur VB6/VBA pour se repérer... Bien sur, ce tutoriel sera aussi le reflet de mes progrès en la matière, dont vous pouvez y apporter vos suggestions…

Types numériques entiers

Type VB2008 Type CLR Nb d'octets utilisés Valeur par défaut Plage de valeur Code Exemple VB2008 Type équivalent en VB6/VBA Code Exemple VB6
Boolean System.Boolean 1 False False ou True Dim x As Boolean
Dim x As System.Boolean
inchangé Dim x As Boolean
Byte System.Byte 1 0 0 à 255 Dim x As Byte
Dim x As System.Byte
inchangé Dim x As Byte
Sbyte System.SByte 1 0 -128 à 127 Dim x As SByte
Dim x As System.Sbyte
(inconnu)
Short System.Int16 2 0 -32768 à 32767 Dim x As Short
Dim x As System.Int16
Dim x = 32767S
Integer Dim x As Integer
UShort System.UInt16 2 0 0 à 65535 Dim x As UShort
Dim x As System.UInt16
Dim x = 65535US
(inconnu)
Integer System.Int32 4 0 -2147483648 à 2147483647 Dim x As Integer
Dim x As System.Int32
Dim x = 2147483647I
Long Dim x As Long
UIteger System.UInt32 4 0 0 à 4294967295 Dim x As UInteger
Dim x As System.UInt32
Dim x = 4294967295UI
(inconnu)
Long System.Int64 8 0 -9223372036854775807 à 9223372036854775807 Dim x As Long
Dim x As System.Int64
Dim x = 9223372036854775807L
(inconnu)
ULong System.UInt64 8 0 0 à 18446744073709551615 Dim x As ULong
Dim x As System.UInt64
Dim x = 18446744073709551615UL
(inconnu)

Types numériques décimaux

Type VB2008 Type CLR Nb d'octets utilisés Valeur par défaut Plage de valeur Code Exemple VB2008 Type équivalent en VB6/VBA Code Exemple VB6
Single System.Single 4 0 -3.402823E38 à 3.402823E38 Dim x As Single
Dim x As System.Single
inchangé Dim x As Single
Double System.Double 8 0 -1.79769313486231E308 à 1.79769313486247E308 Dim x As Double
Dim x As System.Double
inchangé Dim x As Double
(inconnu) Currency Dim x As Currency
Decimal System.Decimal 16 0 -79228162514264337
593543950335 à
79228162514264337
593543950335
Dim x As Decimal
Dim x As System.Decimal
Dim x = 79228162514264337
593543950335D (cf remarque)
(inconnu)

Remarque : L'utilisation de "Decimal" est difficile à cause des conversions implicites en Double dès qu'on utilise les fonctions mathématiques.

Mots-clés obsolètes

Ce tableau regroupe les mots-clés obsolètes de VB6/VBA dans VB2008, et dans le cas ou cela est possible, son équivalent natif en VB2008.
(Bien sur, parfois il est nécessaire de mettre "toute une structure" que je ne reprends pas, mais cela devrait être suffisant pour savoir vers quoi chercher...)
Pour régler la comptabilité (ou pas) avec VB6, il suffit de cocher Microsoft.VisualBasic dans le menu Propriétés de l'application (WindowsApplication1 par défaut) > Références.

Instructions de VB6/VBA Equivalent en VB.NET Instruction VB6 compatible Remarques
App.Path Application.StartupPath
As Any As Object
Atn Math.Atn X Comme toutes les instructions de math, commencer avec l'identificateur MATH. De même avec Sin, Cos, etc...
Call Call X Call devient facultatif sous VB2008.
CallByName CType
Microsoft.VisualBasic.CallByName
X Ctype natif de VB2008, n'est pas exactement identique à CallByName, étant un peu moins modulable que cette dernière.
L'astuce du descripteur Microsoft.VisualBasic permet de faire tourner les fonctions de VB6 sans référence à celui-ci. (Astuce décrite dans l'aide de VB2008).
Chr(X) Char.ConvertFromUtf32(X)
System.Convert.ToChar(X)
X
Circle Object.DrawEllipse(...) Définitivement supprimé de VB2008.
Voir Line.
Currency - Définitivement supprimé de VB2008.
Date
Date$
Debug.Assert et Debug.Print
DefType - Définitivement supprimé de VB2008.
DoEvents Application.DoEvents()
Empty nothing
Eqv Définitivement supprimé de VB2008.
Gosub - Définitivement supprimé de VB2008.
Bizarrement, GOTO et les étiquettes sont encore pris en charge !
Return est utilisé pour retourner le résultat d'une fonction.
IFF If ... Then ... End If X
Imp
_Initialize _Enter -
Int Math.Floor X
Instancing
InStr ch.IndexOf(rech, 1) X
IsEmpty System.DBNull / nothing -
IsMissing System.DBNull / nothing -
IsNull System.DBNull / nothing -
IsObject
LCase texte.ToLower X
Left, Left$ - Définitivement supprimé de VB2008.
Len texte.Length X
Let - - Définitivement supprimé de VB2008.
Amusant tout de même, lors de la frappe de LET, VB2008 le met en bleu (donc reconnu) et le supprime tout juste après la validation effectuée !
Line Objet.DrawLine(...) - Définitivement supprimé de VB2008.
Exemple en VB.NET
Dim objGraph As Graphics
objGraph = Me.CreateGraphics
objGraph.DrawLine(Pens.Black, X0, Y0, X1, Y1)
LSet texte.PadLeft X
LTrim texte.TrimStart X
Mid Dim texte As String = "Bonjour"
texte.Substring(2, 5)
X
Msgbox MessageBox.Show X
Now Dim dte As DateTime = DateTime.Now
Dim dte As Date = Date.Now
X
Null
On.. Gosub Try... Catch... Finally Définitivement supprimé de VB2008.
On.. GOTO Try... Catch... Finally X
On Error Resume Next Try... Catch... Finally X
Option Base - Définitivement supprimé de VB2008.
L'indice inférieur d'un tableau ne peut que 0 sous VB.NET.
Option Private
PSet ? Définitivement supprimé de VB2008.
De manière détournée :
objGraph.DrawLine(Pens.Black, X0, Y0, X0, Y0+1)
Right, Right$ - Définitivement supprimé de VB2008.
Rnd Dim r As New Random
r.Next(min,max)
X
Round Math.Round(...) (Petite pub perso : je continue à persister à penser que mon snippet http://www.codyx.org/snippet_arrondir-nombre-decimal_310.aspx#1593 reste bien la meilleure solution pour arrondir.)
RSet texte.PadRight X
RTrim texte.TrimEnd X
Scale
Set
Sgn Math.Sign X Pour se passer de l'identificateur Math, on peut aussi mettre en tête de module la déclaration :
Imports System.Math
Sqr Math.Sqrt -
String() texte.PadRight() -
_Terminate _FormClosed
_FormClosing
-
Time
Time$
Timer - En VB2008, Timer est un type.
Type
UCase texte.ToUpper X
Val CDbl X
Variant - Définitivement supprimé de VB2008.
VarType objet.GetType X Sous VB2008 compatible Microsoft.visualBasic : Information.VarType()
vbNewLine System.Environment.NewLine
System.Convert.ToChar(13)
X Keys.Return constante utilisée comme identificateur. (retourne 13)
vbNullString String.Empty X
vbTab System.Convert.ToChar(9) X Keys.Tab retourne 9
Wend While... End While Au lieu de While... Wend. Construction automatique sous VB2008.

Les expressions d'assignation

i=i+1, peut être remplacé par i += 1 (à la manière de C++, java, javascript...)
i=i-1 par i -= 1

Tri

Sous VB.NET, on peut utiliser la méthode de tri intégrée très pratique et inconnu sous VB6/VBA : c'est la méthode ".SORT"
Exemple code (repris du snippet : http://www.codyx.org/snippet_tri-nombres_421.aspx#1412) :
Tri de nombre

Function TriNombre(ByVal TabATrier As Single()) As String
'Utilisation de la méthode Sort 
Dim Result As String = String.Empty
System.Array.Sort(TabATrier)
'construction de la chaine de résultat
For Each it As Single In TabATrier
    Result += it.ToString & System.Environment.NewLine
Next
Return Result
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tab(3) As Single
tab(0) = 4
tab(1) = 3
tab(2) = 9
tab(3) = 2
MessageBox.Show(TriNombre(tab))
End Sub

Tri de date : voir : http://www.vbfrance.com/forum/sujet-COMMENT-TRIER-DATES_1207751.aspx

Ecriture des procédures

La structure d'une procédure est différente entre VB2008 et VB6.
Par exemple en VB6, l'événement du "click" sur un bouton était directement le nom de la procédure :

Private Sub Command1_Click()
MsgBox "ok"
End Sub

En VB2008, le nom de la procédure peut-être quelconque auquel on associe la liste des objets + événements par l'intermédiaire de "Handles". Différents objets et événements peuvent donc être facilement associés. Dès lors, "sender" indique l'objet appelant la procédure.
Exemple :

Private Sub Nom_Procedure(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, Button1.Click
    MessageBox.Show(sender.Name)
End Sub

Remarque : Dans le cas où plusieurs procédures exploitent les mêmes objets + événements, c'est le classement alphanumérique sur le nom de la procédure qui donne l'ordre d'exécution.

Chronomètre : Mesure du temps d'exécution d'une partie de code

Voir le snippet : http://www.codyx.org/snippet_mesure-temps-execution-code_752.aspx#2247
Autre possibilité :

Dim start As DateTime = DateTime.Now
'...
MessageBox.Show((DateTime.Now - start).TotalMilliseconds & " milliseconds")

Opérations sur les bits

Opération complètement inconnue sous VB6, en VB.NET on peut jouer directement sur les "bits"...
Exemple de code

Dim octet As Byte = 128 ' vaut 10000000
octet >>= 3 ' Décalage de 3 bits vers la droite soit 00010000 soit 16 en décimal
MessageBox.Show(octet)
octet <<= 2 ' Décalage de 2 bits vers la gauche 01000000
MessageBox.Show(octet)

Variable de longueur fixe

Sous VB6, on peut facilement définir une variable STRING avec une longueur fixe. Par exemple, avec :

Dim Toto as string * 5

Mais sous VB2008, il semble que cela n'est plus possible... En même temps, VB2008 se débrouille plutôt bien sans... Une demi-solution éventuelle est de couper la variable avec .Substring(1, 5)

Ce document intitulé « Grandeur et décadence de vb2008 » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous