Variables tableaux et variables objets

Leçons de programmation Visual Basic

Vous avez déjà vu, dans la leçon 2, comment créer et utiliser des variables dans le code de visual basic, et les différents types de variables. Nous allons ici approfondir l'aspect des variables de visual basic en explorant les dimensions.

Nous verrons :
Variables indexées à une dimension
Variables à plusieurs dimensions
Variables objets diverses de VB

Variables tableaux à une seule dimension :
On pourrait avoir besoin un jour où l'autre de créer plusieurs variables rapidement et contenant le même type de données : par exemple, on voudrait créer 50 variables contenant des chiffres à placer après traitement dans un contrôle listbox. Pour cela on peut écrire :

Dim var1 As Integer
Dim var2 As Integer
Dim var3 As Integer
Dim var4 As Integer
...
Dim var50 As Integer

Mais ce procédé est très décourageant et lourd dans le code de visual basic. Ainsi, il existe une autre méthode plus claire qui utilise un index dans la variable définie. Exemple, ici on écrira :

Dim var(1 To 50) As Integer

Ceci crée 50 variables portant le même nom et des index propres. On est obligé d'utiliser des constantes pour définir le début et la fin de l'index pour les variables. Pour accéder à une variable, on procède comme pour un contrôle indexé :

var(10) = Val(text1.text)

Ceci permet d'enregistrer la valeur contenue dans text1 dans var, à la position numéro 10.

Avantages de ce type de variable indexés :
Ces index allègent particulièrement le code d'abord car la définition ne prend qu'une ligne et pas 50. Ensuite car l'accès aux 50 variables peut se faire avec une boucle For. Par exemple pour convertir 50 entrées en francs dans un contrôle listbox et les mettre dans un contrôle list, on fera ainsi :

Dim var(0 To 49) As Integer

List2.Clear

For i = 0 To 49 'on part de zéro car l'index de départ du listbox est_ zéro.
    var(i) = Val(List1.List(i))
    var(i) = var(i) / 6.55957
    List2.Additem Str(var(i)), i
Next i

Remarque : ce code en lui-même est débile car on peut se passer de la variable pour faire cela, mais il existe des cas où la variable permet de garder en mémoire des informations qui seront relues plus tard...

Variables Tableaux à plusieurs dimensions :
On peut compliquer la chose en définissant des variables à plusieurs dimensions (comme si on voulait créer un tableau avec lignes et colonnes). Voici comment faire :

Dim VarTable(1 To 5, 1 To 3)

Ceci crée une variable modélisable ainsi :

1,1 1,2

1,3

2,1 2,2 2,3
3,1 3,2 3,3
4,1 4,2 4,3
5,1 5,2 5,3

On accède à la ligne 2 colonne 3 avec le code :

var(2,3) = 2500

Ensuite, on peut continuer à définir une troisième dimension ainsi :
   Dim variable(X,Y,Z)
Et une quatrième :
 
  Dim variable(X,Y,Z,T)
Et une Nième :
   Dim variable(X,Y,...,N)
etc.

Variables objet diverses dans VB :

On peut aussi créer dans Visual Basic des objets dynamiquement. Prenons l'exemple d'une feuille MDI frmMain avec un menu Nouveau. Le menu nouveau crée une nouvellee feuille fille du style de la feuille modèle frmDocument. Je place ce paragraphe au coeur de cette leçon car c'est rapidement vu et on obtient une sorte de tableau d'objets provenant d'un modèle (celui indexé 0). On procède alors ainsi :

Dim DocNum As Integer

Sub LoadNewDoc()
Dim frmD As New frmDocument

'• Dim : créer une variable normalement
'• As : définit frmD comme étant une instance nvelle de frmDocument : une feuille_ _identique.
'• New : crée une nouvelle feuille et ne prend pas la même.


DocNum = DocNum + 1
frmD.Tag = DocNum
frmD.Caption = "Nouveau Document n°" & Str(DocNum)
frmD.Show
End Sub

Voilà. Ainsi on peut créer autant de feuilles dynamiquement et accéder à celle-ci. On peut ausi faire cela pour un contrôle TextBox ou n'importe quel objet de visual basic. La syntaxe à retenir est :

Dim nomvar As New objet

Application :
Pour finir, je vous décrit ici rapidement comment créer
une grille de n lignes et p colonnes réalisée avec des contrôles images. Grille pouvant servir à la programmation d'un jeu de plate-forme ou à un algorithme génétique solveur de labyrinthe :

Le principe est très simple : on va faire deux plans (supposant que celui du fond sera le décor et le premier plan sera l'espace de déplacement du joueur). Le plan du fond décrit par le groupe d'images back, le premier plan par pos.

• Le tableau aura une représentation en mémoire dans une variable tableau à deux dimensions (pratique pour programmer des jeux) : voici la déclaration :

Public Tableau() As Integer

• Les deux contrôles images indicés zéro sont placés l'un sur l'autre, pos sera plac au-dessus de back (Ctrl+J et Ctrl+K permettent de définir le positionnement)

• Une procédure MakeTab(n,p) contiendra le code de génération.

• Le bouton Créer contiendra l'appel à la procédure de génération du tableau graphique MakeTab.

Voici le code de génération du tableau graphique, et l'application (screenshot) à un essai d'algorithme génétique (AG) (utilisation pour la création d'un labyrinthe avec un pourcentage de murs implémenté).

Public Sub MakeTab(n As Integer, p As Integer)
Dim a As Integer
Dim
cwidth As Integer
Dim
cheight As Integer

'décharger la grille précédente
For k = 1 To Form1.back.Count - 1
Unload Form1.back(k)
Unload Form1.Pos(k)
Next k

If n <= 1 Then
MsgBox "Nombre de lignes invalide"
GoTo fin
ElseIf p <= 1 Then
MsgBox "Nombre de colonnes invalide"
GoTo fin
End If

row = n
col = p

'attention i pour décrire les abscisses a pour max col
'attention j pour décrire les ordonnées a pour max row

ReDim Tableau(col, row) 'redimensionnement du tableau en mémoire

cwidth = 240 'Form1.pos(0).Width
cheight = 240 'Form1.pos(0).Height

For i = 1 To col
For j = 1 To row

a = (j - 1) * col + i - 1
If a > 0 Then
Load Form1.back(a)
Load Form1.Pos(a)
End If

'à ce niveau on peut implémenter le
'placement de murs comme dans l'AG
Tableau(i, j) = 0

With Form1.back(a)
.Left = (j - 1) * cwidth + 1440 '1440 est la coordonnée de gauche de la case indicée 0
.Top = (i - 1) * cheight + 120 'idem pour 120 et la case pos(0) ou back(0)
.Visible = True
End With

With Form1.Pos(a)
.Left = (j - 1) * cwidth + 1440
.Top = (i - 1) * cheight + 120
.Visible = True
.ZOrder 'place le contrôle devant
.ToolTipText = Str(a) 'pas indispensable
End With

Next j
Next i

End Sub