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…
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) |
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.
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. |
i=i+1, peut être remplacé par i += 1 (à la manière de C++, java, javascript...)
i=i-1 par i -= 1
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
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.
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é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)
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)