CodeS-SourceS
Rechercher un code, un tuto, une réponse

Grandeur et décadence de vb2008

Juillet 2017


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 VB2008Type CLRNb d'octets utilisésValeur par défautPlage de valeurCode Exemple VB2008Type équivalent en VB6/VBACode Exemple VB6
Boolean System.Boolean 1 False False ou True Dim x As Boolean
Dim x As System.Boolean
inchangé Dim x As Boolean
ByteSystem.Byte100 à 255Dim x As Byte
Dim x As System.Byte
inchangéDim x As Byte
SbyteSystem.SByte10-128 à 127Dim x As SByte
Dim x As System.Sbyte
(inconnu)
ShortSystem.Int1620-32768 à 32767Dim x As Short
Dim x As System.Int16
Dim x = 32767S
IntegerDim x As Integer
UShortSystem.UInt16200 à 65535Dim x As UShort
Dim x As System.UInt16
Dim x = 65535US
(inconnu)
IntegerSystem.Int3240-2147483648 à 2147483647Dim x As Integer
Dim x As System.Int32
Dim x = 2147483647I
LongDim x As Long
UItegerSystem.UInt32400 à 4294967295Dim x As UInteger
Dim x As System.UInt32
Dim x = 4294967295UI
(inconnu)
LongSystem.Int6480-9223372036854775807 à 9223372036854775807Dim x As Long
Dim x As System.Int64
Dim x = 9223372036854775807L
(inconnu)
ULongSystem.UInt64800 à 18446744073709551615Dim x As ULong
Dim x As System.UInt64
Dim x = 18446744073709551615UL
(inconnu)

Types numériques décimaux


Type VB2008Type CLRNb d'octets utilisésValeur par défautPlage de valeurCode Exemple VB2008Type équivalent en VB6/VBACode Exemple VB6
SingleSystem.Single40-3.402823E38 à 3.402823E38Dim x As Single
Dim x As System.Single
inchangéDim x As Single
DoubleSystem.Double80-1.79769313486231E308 à 1.79769313486247E308Dim x As Double
Dim x As System.Double
inchangéDim x As Double
(inconnu)CurrencyDim x As Currency
DecimalSystem.Decimal160-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/VBAEquivalent en VB.NETInstruction VB6 compatibleRemarques
App.PathApplication.StartupPath
As AnyAs Object
AtnMath.AtnXComme toutes les instructions de math, commencer avec l'identificateur MATH. De même avec Sin, Cos, etc...
CallCallXCall devient facultatif sous VB2008.
CallByNameCType
Microsoft.VisualBasic.CallByName
XCtype 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
CircleObject.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.
DoEventsApplication.DoEvents()
Emptynothing
EqvDé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.
IFFIf ... Then ... End IfX
Imp
_Initialize_Enter-
IntMath.FloorX
Instancing
InStrch.IndexOf(rech, 1)X
IsEmptySystem.DBNull / nothing-
IsMissingSystem.DBNull / nothing-
IsNullSystem.DBNull / nothing-
IsObject
LCasetexte.ToLowerX
Left, Left$-Définitivement supprimé de VB2008.
Lentexte.LengthX
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 !
LineObjet.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)
LSettexte.PadLeftX
LTrimtexte.TrimStartX
MidDim texte As String = "Bonjour"
texte.Substring(2, 5)
X
MsgboxMessageBox.ShowX
NowDim dte As DateTime = DateTime.Now
Dim dte As Date = Date.Now
X
Null
On.. GosubTry... Catch... FinallyDéfinitivement supprimé de VB2008.
On.. GOTOTry... Catch... FinallyX
On Error Resume NextTry... Catch... FinallyX
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.
RndDim r As New Random
r.Next(min,max)
X
RoundMath.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.)
RSettexte.PadRightX
RTrimtexte.TrimEndX
Scale
Set
SgnMath.SignXPour se passer de l'identificateur Math, on peut aussi mettre en tête de module la déclaration :
Imports System.Math
SqrMath.Sqrt-
String()texte.PadRight()-
_Terminate_FormClosed
_FormClosing
-
Time
Time$
Timer-En VB2008, Timer est un type.
Type
UCasetexte.ToUpperX
ValCDblX
Variant-Définitivement supprimé de VB2008.
VarTypeobjet.GetTypeXSous VB2008 compatible Microsoft.visualBasic : Information.VarType()
vbNewLineSystem.Environment.NewLine
System.Convert.ToChar(13)
XKeys.Return constante utilisée comme identificateur. (retourne 13)
vbNullStringString.EmptyX
vbTabSystem.Convert.ToChar(9)XKeys.Tab retourne 9
WendWhile... End WhileAu 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)

A voir également

Publié par us_30.
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.
Les code snippets
Appeler une fonction par son nom grâce à la fonction callbyname