Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence

Cours VB.NET

Date de mise à jour : 05/12/2010


XX-F. Migration VB6=>VB.NET 2003
XX-F-1. Les objets
XX-F-1-a. Les Classes du Framework
XX-F-1-b. Les formulaires ou fenêtres
XX-F-1-c. Les Contrôles
XX-F-1-d. Les Variables
XX-F-1-e. Les Tableaux
XX-F-1-f. Les Collections
XX-F-1-g. Les Structures
XX-F-1-h. Les Fonctions et Sub
XX-F-1-i. Dans le code
XX-F-1-j. Gestion des erreurs
XX-F-1-k. Les graphiques
XX-F-1-l. Les bases de données
XX-F-1-m. Les Classes
XX-F-1-n. GOSUB et ON GOSUB n'existent plus
XX-F-1-o. Les Timers
XX-F-1-p. Conversion VB6 vers VB.NET
XX-G. VB.NET 2005 : nouveautés 2005
XX-G-1. Le matériel
XX-G-2. L'IDE
XX-G-2-a. On peut créer des fenêtres toutes faites, avec les contrôles
XX-G-2-b. Edit and Continue
XX-G-2-c. Il y a des exemples de code
XX-G-2-d. Il est proposé des solutions pour corriger les erreurs de code
XX-G-2-e. Le Projet Designer
XX-G-2-e-i. Exemple de ressource
XX-G-2-e-ii. Exemple de paramètre
XX-G-2-f. Alignement de controles
XX-G-2-g. Le déplacement des contrôles ou l'accès aux principales tâches est amélioré
XX-G-2-h. Renommer un nom : modification automatique
XX-G-2-i. Commentaire en XML
XX-G-3. Les nouveaux Objets
XX-G-4. Les instances de Forms
XX-G-5. Les nouveaux Contrôles
XX-G-5-a. DataGridView
XX-G-5-b. MaskedTextBox
XX-G-5-c. SoundPlayer
XX-G-5-d. SplitContainer
XX-G-5-e. ListView
XX-G-5-f. WebBrowser
XX-G-5-g. LayoutPanel
XX-G-5-h. MenuStrip
XX-G-5-i. ToolStrip
XX-G-5-j. StatuStrip
XX-G-5-k. ProgessBar
XX-G-6. Les nouvelles 'Variables'
XX-G-7. Les nouvelles 'Collections'
XX-G-8. Dans le Code : Les nouvelles instructions
XX-G-9. Les nouveautés dans les Classes
XX-H. Nouveautés 2008 et Framework 3


XX-F. Migration VB6=>VB.NET 2003

Cela concerne surtout ceux qui passent de VB6 à VB.NET, pour les autres c'est une révision.

Les petits nouveaux qui ne connaissaient pas VB6 (précédente version de VB) ne doivent pas lire ce qui est en vert.


XX-F-1. Les objets

En VB.NET tout est objet: les fenêtres, les contrôles, les variables....

Set et Let ne sont plus pris en charge.

Les objets peuvent être assignés par une simple opération d'assignation :

Object1 = Object2

Pour définir une propriété par défaut d'un objet, vous devez désormais référencer explicitement la propriété. Exemple

Object1.Text = Object2.Text

Vous pouvez définir vous même un nouveau type d'objet, une Classe.

Puis instancer des objets à partir de cette Classe.

VB.NETpermet une vraie programmation objet: héritage, polymorphisme, surcharge, Interface ...


XX-F-1-a. Les Classes du Framework

Il existe toujours les mots clefs de Visual Basic (Len, Trim, Rnd..) mais en plus le Framework met à disposition une multitude de Classes qui possèdent des méthodes permettant de faire une multitude de choses sans programmer:

Exemple:

La Classe Array (les tableaux) possède une méthode Sort qui trie les tableaux.

Dim T() As Integer
	T(0)=78
	..
	Array.Sort(T)

XX-F-1-b. Les formulaires ou fenêtres

On se rend compte que quand on dessine une fenêtre Form2 par exemple, VB crée une nouvelle classe 'Class Form2'

Public Class Form2
Inherits Systeme.Windows.Forms.Form 

End Class
Elle hérite de System.Windows.Forms.Form: on le voit bien dans le code.

Pour utiliser cette fenêtre, il faut créer une instance de cette fenêtre à l'aide de la Classe :

On tape Dim f As New Form2(), on crée une instance de la Class Form2.

Enfin la fenêtre sera ouverte grâce à la méthode ShowDialog ou Show.

Comme pour un Objet en général, la fenêtre créée sera visible dans sa portée. Si une fenêtre est instanciée dans une procédure, l'objet fenêtre f ne sera visible que dans cette procédure.

Comment passer de VB6 à VB.net?

  • Avant en VB6, on avait:

Form2.Load
			
Form2.Show
  • Avec le programme de conversion VB6=>VB.Net on a:

Form2.DefInstance.Show()
car il ajoute une routine qui créée automatiquement une instance de form2:

#Region "Prise en charge de la mise à niveau "

Private Shared m_vb6FormDefInstance As form2
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As form2
	Get
		If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
			m_InitializingDefInstance = True
			m_vb6FormDefInstance = New form2()
			m_InitializingDefInstance = False
		End If
			DefInstance = m_vb6FormDefInstance
	End Get
	Set
			m_vb6FormDefInstance = Value
	End Set
End Property
#End Region
  • En fait il faut mieux avec VB.net écrire:

Dim F As New Form2
				
F.Show
On remarque que Load n'existe plus, par contre, le Dim crée le formulaire sans l'afficher, c'est à peu prêt équivalent..

Les Forms ont 2 contrôles menu:

Les MainMenu

Les ContextMenu.

Visual Basic .NET ne prend pas en charge la méthode Form.PrintForm


XX-F-1-c. Les Contrôles

La plupart des objets ne possèdent plus de propriétés par défaut.

En VB6:

Dim str As String = TextBox1
Maintenant il faut écrire:

Dim str As String = TextBox1.Text
Visual Basic .NET ne prend pas en charge le contrôle conteneur OLE .

Il n'existe pas de contrôle carré rectangulaire ligne . On peut les remplacer sous la forme d'étiquettes (Label), tandis que les ovales et les cercles qui n'existent pas non plus, ne peuvent pas être mis à niveau.

Visual Basic .NET est doté d'un nouvel ensemble de commandes graphiques faisant partie de GDI+. Circle, CLS, PSet, Line et Point n'existent plus. Étant donné que le nouveau modèle objet est assez différent de celui de Visual Basic 6.0,il faut tout réécrire.

Visual Basic .NET ne prend pas en charge l'échange dynamique de données (DDE, Dynamic Data Exchange).

Bien que Visual Basic .NET prenne en charge la fonctionnalité de glisser-déplacer, le modèle objet est différent de celui de Visual Basic 6.0. Il faut tout réécrire.

Le .NET Framework est doté d'un objet Clipboard amélioré (System.Windows.Forms.Clipboard) qui offre plus de fonctionnalités et prend en charge un plus grand nombre de formats de Presse-papiers que l'objet Clipboard de Visual Basic 6.0. Il faut tout réécrire.

Les groupes de contrôle n'existent plus. Il y a des moyens de les remplacer.


XX-F-1-d. Les Variables

Option Explicit étant activé par défaut, toutes les variables doivent être déclarées avant d'être utilisées.

Le type de données Variant n'existe plus. Celui-ci a été remplacé par le type Object.

Le type de données Integer est désormais de 32 bits ; le type de données Long est de 64 bits.

On peut utiliser les type Booléens qui ne peuvent prendre que 2 valeurs :True et False (pas 0 et -1)

En VB.NET Option Strict étant activé, il faut convertir explicitement une donnée d'un type vers un autre si c'est nécessaire.

Response.Write("Le total est " & CStr(total))

on attend des String, la variable total qui est numérique est donc transformée en String par CStr.

Les variables créées dans la même instruction Dim seront du même type. Par exemple, dans VB.NET, l'instruction Dim i, j, k As Integer crée chacun des trois objets (i, j, et k) comme Integer. Les versions précédentes de VB créaient i et j comme Variants et k comme Integer (c'était nul!!).

Il existe un type Char qui contient un seul caractère.

Le type Currency est remplacé par le type Decimal.

Les String de longueur fixe n'existent plus. Il y a quelques ficelles pour contourner cela mais bonjour la simplicité!!

Les String et Char sont en Unicode (chaque caractère est codé sur 2 octets).

Une variable peut avoir une portée locale, publique ou, et c'est nouveau, une portée au niveau d'un bloc:

For i=0 to 100
	Dim Str As String 'Str est visible uniquement entre For et Next
	...
	next i

XX-F-1-e. Les Tableaux

Le premier élément d'un tableau a l'indice 0 obligatoirement; plus d'Option Base.

On peut initialiser un tableau en même temps qu'on le déclare:

Dim Tableau(3) As Integer ={7,2,3,5}

A noter que ce tableau contient 4 élément d'index 0, 1, 2, 3.

Dim S(4 to 15) n'est plus accepté.

Dim est utilisé pour la déclaration initiale, Redim pour le redimensionnement uniquement.

Les tableaux font partie de la Classe Array, ce qui autorise l'utilisation de méthodes bien pratiques: Sort par exemple trie automatiquement le tableau.


XX-F-1-f. Les Collections

Elles sont omniprésentes. C'est fondamental de bien comprendre leur fonctionnement: Ce sont des listes ayant un nombre d'élément non défini, on peut y ajouter des éléments, en retirer, il y a des méthodes pour trier, rechercher..

Cela peut être :

Des listes d'objet: ArrayList

Des listes de booléens: BitArray

Des listes Clé-Valeur :HashTable

Des Queue

Des Piles :Stack

La notion de collection est généralisée et utilisée dans beaucoup d'objets: Une ListBox possède une collection d'Item (les éléments de la listBox)


XX-F-1-g. Les Structures

Elles remplacent les "Types définis par l'utilisateur".

Structure MaStructure
	Public i As Integer
	Public c As String
End Structure

XX-F-1-h. Les Fonctions et Sub

Les parenthèses sont désormais requises autour de la liste de paramètres dans tous les appels de méthodes y compris pour les méthodes qui ne prennent pas de paramètres. Exemple :

If Flag = False Then
   	AfficheMessage()
End If
Par défaut, les arguments sont passés par valeur, et non pas référence . Si vous voulez passer des arguments par référence, vous devez utiliser le mot clé ByRef devant l'argument comme dans l'exemple suivant :

Call MaFunction(argbyvalue, ByRef argbyref)

Il peut y avoir des paramètres optionnels.

Return est un nouveau mot clé qui permet à une fonction de retourner une valeur.

Private Function MaFonction (Byval Chaine As String)
	Return Chaine.ToLower()
End Function

XX-F-1-i. Dans le code

Simplification d'écriture:

A +=2 est équivalent à A=A+2

Nouveau type de boucle

While condition

End While

Boucle tant que condition est vraie.

Wend n'existe plus.

Le Multithreading est possible.


XX-F-1-j. Gestion des erreurs

La gestion des erreurs est structurée:

Elle utilise

Try

Code a tester

Catch

interception de l'erreur

Finally

suite

End Try

On error goto reste utilisable.


XX-F-1-k. Les graphiques

En GDI (VB6) on utilisait les handles(HDC) pour spécifier un image.

En GDI+ (VB.Net) on travaille sur les Graphics et leurs méthodes. Graphics.DrawLine..

L'unité de mesure est le pixels. (Plus de Twips)


XX-F-1-l. Les bases de données

Visual Basic .NET contient une version améliorée des objets de données actifs (ADO, Active Data Objects) appelée ADO.NET.

DAO, RDO et ADO peuvent toujours être utilisés dans du code Visual Basic .NET, avec toutefois quelques petites modifications . Toutefois, Visual Basic .NET ne prend pas en charge la liaison de données DAO et RDO aux contrôles ou contrôles de données ni la connexion utilisateur RDO.


XX-F-1-m. Les Classes

La syntaxe des propriétés de classe a changé et ne contient plus Property Let, Property Get, et Property Set. La nouvelle syntaxe des propriétés est analogue à celle de C#.

Public Property ThisProperty As String
    Get
      	ThisProperty = InternalValue
    End Get
    Set
        InternalValue = value
    End Set
End Property
Les classes sont totalement objet et acceptent le polymorphisme, la surcharge , l'héritage..


XX-F-1-n. GOSUB et ON GOSUB n'existent plus

Il faut remplacer une une routine qui était appelée par gosub par une sub ou une fonction.

Remplacer

Sub Mon Programme
	..
		Gosub Routine
	..
End SuB

Routine:
		Code de la routine
Return
Par

Sub Mon Programme
	..
		Call Routine()
	..
		End Sub
		
Sub Routine()
		
    code de la routine
			
End Sub
Il faudra simplement faire attention aux variables, les variables locales à Mon Programme ne seront pas accessible dans la routine.

Pour On Gosub, il faut remplacer par un SelectCase.


XX-F-1-o. Les Timers

S'agissant du contrôle Timer, le fait d'affecter à la propriété Interval la valeur 0 ne désactive pas la minuterie ; l'intervalle est réinitialisé à 1. Dans vos projets Visual Basic 6.0, vous devez affecter à la propriété Enabled la valeur False plutôt que d'affecter à Interval la valeur 0.


XX-F-1-p. Conversion VB6 vers VB.NET

Il existe un outil de conversion (Menu Fichier, Ouvrir, Convertir, Assistant de mise à niveau de VB.NET) pour convertir un source VB6 en VB.NET.

Le problème est qu'il donne un code, à mon avis, inutilisable avec:

  • Conversion des instructions VB6=>VB.NET quand il le peut.
  • Conversion en utilisant une classe de compatibilité contenant des instructions spécifiques à VB6 (qui ne sont PAS du VB.NET) produisant un code hybride. Cette classe de compatibilité disparaîtra probablement dans les prochaines versions.
  • Conversion en utilisant des ficelles avec ajout de plein de code: voir l'exemple des Forms au dessus ou l'outil de conversion crée une complexe fonction nommée 'DefInstance' permettant de créer des formulaires.
  • Des instructions impossible à convertir automatiquement et qui seront à réécrire à la main.
Il faut convertir les programmes VB6 avec l'outil de conversion pour voir ce que cela donne: c'est instructif de voir le nouveau code.

Mais il faut réécrire totalement une bonne partie du code: l'appel des fenêtres en particulier.

Il faut rapidement ne pas utiliser du tout la classe de compatibilité VB 6 , éviter les instructions héritées de VB6, privilégier l'usage des classes du FrameWork.


XX-G. VB.NET 2005 : nouveautés 2005

Différences entre les versions. Que permet la version Express GRATUITE par rapport aux autres?

Télécharger VB Express 2005 GRATUIT à vie.

Télécharger sql Server 2005 Express

Télécharger le Service Pack 1 (SP1) New

Développer en VB 2005 pour Vista (Framework 3) New


XX-G-1. Le matériel

Support des plateformes 64 bits.(Pas dans la version Express)

Support du 'multi monitor'


XX-G-2. L'IDE


XX-G-2-a. On peut créer des fenêtres toutes faites, avec les contrôles

Il y a des fenêtres toutes faites pour accélérer le travail (les templates) comme les 'AboutBox' les 'Explorer Form'...


XX-G-2-b. Edit and Continue

Il y a maintenant le 'Edit and continue': en mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (Sauf pour les déclarations).


XX-G-2-c. Il y a des exemples de code

Les Snippets (bride, morceau de code) permettent d'insérer du code tout fait.

Dans le code d'une procédure, le click droit de la souris ouvre un menu. Cliquer sur Insérer un extrait (Insert Snipper) puis double-cliquer sur la rubrique que vous cherchez.

On obtient le code suivant:

' Copy the active window.

SendKeys.SendWait("{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim window As Bitmap

window = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)

' Copy the entire screen.

SendKeys.SendWait("+{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim screen As Bitmap

screen = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)
Génial!!


XX-G-2-d. Il est proposé des solutions pour corriger les erreurs de code

Une fenêtre vous indique les corrections à faire.

Si je veux afficher une valeur numérique (avec option Strict=On),il y a erreur, VB me propose la correction:


XX-G-2-e. Le Projet Designer

Toutes les propriétés de l'application peuvent être modifiées dans le 'Projet Designer', il est directement accessible dans l'explorateur de solution (My Projet)ou par le menu Affichage-> Page de propriétés:

Le nom de l'application , son icône,

Le formulaire de démarrage (startUp Form),

L'écran de démarrage (Splash Screen), il suffit d'indiquer son nom (VB l'affiche et le fait disparaître quand le formulaire de démarrage s'ouvre).

Le mode d'arrêt de l'application: A la fermeture du formulaire de démarrage ou lorsque tous les formulaires sont fermés.

Les Option Strict, Explicit.(Onglet Compiler)

On peut utiliser aussi les paramètres (Settings), et les ressources....


XX-G-2-e-i. Exemple de ressource
Onglet 'Ressources' , créons une ressource nommée 'toto' et contenant '2' (c'est une string)

Pour l'utiliser dans le programme, on fera:

My.Resources.toto

Les ressources sont en Read-Only.

On vient de créer une ressource 'chaines' mais en déroulant la liste en haut à gauche , on voit qu'il y a des ressources Image, Icône, Audi, Fichier, Autre.


XX-G-2-e-ii. Exemple de paramètre
Onglet 'Paramètres' , créons un paramètre nommé 'Para1' et contenant '1' (c'est une string)

Pour l'utiliser dans le programme, on fera:

My.Parametre.Para1

Les Paramètres sont en Read-Only si la portée est 'Application', et en Read-Write si la portée est 'Utilisateur'.

Ces 'variables paramètres utilisateur' ont des valeurs qui seront conservées et enregistrées automatiquement dans l' 'environnement' d'un utilisateur. Si on en modifie la valeur, on retrouve la valeur modifiée lors d'une utilisation ultérieure ce qui permet de conserver les habitudes des utilisateurs.


XX-G-2-f. Alignement de controles

Si on modifie la taille ou l'emplacement d'un contrôle, VB signale par un trait bleu que le contrôle modifié et le contrôle voisin sont alignés:

Voir les exemples.


XX-G-2-g. Le déplacement des contrôles ou l'accès aux principales tâches est amélioré

La croix à gauche permet de déplacer le contrôle, la petite flèche à droite permet d'ouvrir un menu qui donne accès aux tâches les plus fréquentes.


XX-G-2-h. Renommer un nom : modification automatique

On nomme cela 'Refactoring': Cliquer sur une variable, puis bouton droit, dans le menu cliquer sur 'Renommer'. Modifier le nom de la variable, valider. Dans toute la Classe la variable est renommée.


XX-G-2-i. Commentaire en XML

On peut ajouter des commentaires en xml.

Exemple:

Pour une Sub: sur une ligne blanche au dessus de 'Sub', tapez ''' (3 ').

ou

Pour une variable: curseur sur la variable , bouton droit puis 'Insérer un commentaire' dans le menu.

Un bloc Xml <Summary> se crée automatiquement; Ajouter 'Fonction Calculant le total' entre les basiles <summary>

Quand ensuite on tape le nom de la Sub , le commentaire s'affiche. Pratique quand on travaille en equipe.

De plus Visual Basic génère automatiquement un fichier de documentation XML lorsque vous créez le projet. Ce fichier apparaît dans le répertoire de sortie de l'application sous le nom AssemblyName.xml.


XX-G-3. Les nouveaux Objets

My: le SUPER RACCOURCI.

My permet d'avoir accès rapidement à certaines fonctionnalités:

My.Application

Permet d'accéder rapidement aux propriétés de l'application en cours.

Vous pouvez ainsi récupérer des informations sur l'assembly, la culture (langue) de l'application.

Voir le chapitre sur My.



XX-G-4. Les instances de Forms

En VB2003 il fallait instancier une Form avant de l'utiliser.

    Dim newForm1 As NewForm1
    newForm1.BackColor = System.Drawing.Color.Green
    newForm1.Show()
On peut toujours le faire en 2005 mais on peut aussi utiliser la Class Form1 sans instancier:

    Form1.ForeColor = System.Drawing.Color.Coral
    Form1.BackColor = System.Drawing.Color.Cyan
    Form1.Show()
Comme il n'y a pas d'instance de Form1, VB en crée une.


XX-G-5. Les nouveaux Contrôles


XX-G-5-a. DataGridView

Il remplace le DataGrid dans VB.Net 2005 Il est bien plus simple à utiliser surtout pour modifier directement la grille sans passer par un DataSet.

MyDataGridView.ColumnCount = 5 indique le nombre de colonne.

MyDataGridView.Columns(0).Name = "Date" met un texte dans le haut de la colonne.

MyDataGridView.Rows.Add(t) 'Ajout de ligne; t est un tableau de 5 strings.

MyDataGridView.CurrentCell est la cellule courante (CurrentCellAdress contient les numéro de ligne et colonne)

MyDataGridView.EditMode = DataGridViewEditMode.EditOnEnter autorise de modifier les cellules.


XX-G-5-b. MaskedTextBox

Permettant d'utiliser un masque pour la saisie de caractères. Le masque indique quels caractères interdire ou permettre.

La propriété Mask permet d'indiquer le masque de saisie.

On peut la modifier en mode 'Design' :

On voit bien dans la fenêtre ci dessus: le masque '00:00' permet de saisir 2 groupes de 2 chiffres. L'utilisateur voit que qu'il y a dans l'aperçu '__:__' et est obligé de taper 2 chiffres puis 2 chiffres.

On peut utiliser des masques tout faits (Heure, date..) ou créer un masque personnalisé.

On peut aussi modifier le masque par code:

maskedTextBox1.Mask = "LL"
 
Pour le masque personnalisé on utilise:

0 Chiffre requis (lettres refusés) 
9 Chiffre ou espace optionnel. (lettres refusés) 
# Chiffre ou espace optionnel. (+) (-) sont permis. 
L Lettre requise. (chiffres refusés) 
? Lettre requise optionnelle. (chiffres refusés) 
& Caractère requis.(Chiffres et lettres permises)   
C Caractère, requis optionnel.(Chiffres et lettres permises %*& permis)  
A Alphanumérique requis opt.(Chiffres et lettres permises %*& refusés)  
. Point Decimal; celui de la culture. 
, Séparateur de millier; celui de la culture. 
: Séparateur de temps; celui de la culture. 
/ Séparateur de date; celui de la culture. 
$ Symbole monétaire; celui de la culture. 
< Convertir les caractères qui suivent en minuscule.  
>  Convertir les caractères qui suivent en majuscule. 
| Stop la conversion minuscule ou majuscule. 
\ Escape. Le caractère qui suit devient un littéral.\\” affichera '\'. 
Autres caractères Littéraux. Affichés tels quels

Exemple:

"00/00/0000" permet de saisir une date.

"LLL" permet de saisir trois lettres (pas des chiffres)

/ $ , : sont dépendant de la culture en cours:

Si le Mask="0$" il apparaîtra "_€ en culture française.

On peut modifier cela par FormatProvider property.

MaskCompleted indique si la saisie est conforme.

Dim returnValue As Boolean
returnValue = maskedTextBox1.MaskCompleted
MaskedTextBox1.text permet de lire le contenu du texte.

L'évènement le plus souvent utilisé est TextChanged

Private Sub MaTextBox_TextChanged(sender As Object, _ 
  e As EventArgs) Handles MaTextBox.TextChanged
End Sub 

XX-G-5-c. SoundPlayer

Pour écouter des sons .Wav


XX-G-5-d. SplitContainer

Permettant de créer facilement une séparation déplaçable entre 2 zones.

On met le SplitContainer, dans les 2 zones on met par exemple 2 textbox. Il faut mettre la propriété Dock de ces 2 textbox à Fill.

En mode Run, cela marche : si je déplace la zone de séparation centrale, cela agrandit un textbox et diminue le second.

Margin indique la largeur de la séparation.

Orientation permet une séparation horizontale ou verticale.


XX-G-5-e. ListView


XX-G-5-f. WebBrowser

Pour ouvrir une zone internet.


XX-G-5-g. LayoutPanel

Permettent de positionner les contrôles dans une Form en conception.

FlowLayoutPanel: Place les contrôles à droite du précédent, passe 'à la ligne' si nécessaire, c'est génial pour créer plusieurs lignes de label, TextBox, Bouton:

TableLayoutPanel:On crée un tableau de panel, puis on met les contrôles dans les cellules:


XX-G-5-h. MenuStrip

Remplace les MainMenu

On peut même mettre des images dans les menus. Il peut y avoir des combobox et des zones de texte.

Il y a aussi les ContextMenuStrip qui remplace les ContextMenu.


XX-G-5-i. ToolStrip

Création de barre n'importe ou dans le formulaire.

Exemple de barre de menu comprenant:

Un bouton.

Un label

Un bouton déroulant un menu.

Un comboBox

Une zone texte

Une barre de progression.

Images possible dans les menus, il peut y avoir des séparateurs.


XX-G-5-j. StatuStrip

Pour créer une barre d'état en bas d'un formulaire; remplace les StatusBar.

Peut contenir des LabelStrip (Label ou LinkLabel), des ProgressBar, DropDownButton et ToolsStripButton.


XX-G-5-k. ProgessBar

Idem le contrôle de 2003 avec des fonctionnalités en plus:

La propriété Style permet la progression par blocks, en continue, ou en oscillation droite gauche comme lors de l'ouverture de Windows XP.

Il y a aussi le toolstripcontainer et un contrôle permettant l'usage port série.


XX-G-6. Les nouvelles 'Variables'

VB 2005 prend en charge les types non signés:

UInteger Entier codé sur 32 bits pouvant prendre les valeurs 0 à 4 294 967 295.

ULong Entier codé sur 64 bits :0 à 18 446 744 073 709 551 615

UShort Entier sur 16 bits 0 à 65 535.

et

SByte Codé sur 1 octet, valeur de -128 à 127


XX-G-7. Les nouvelles 'Collections'

On peut utiliser des collections 'génériques'

System.Collections.Generic.List(Of String)
On peut ainsi créer des collections fortement typées.

Il y a en plus les Collections spécialisées (nouveau type de collection):

L'espace System.Collections.Specialized fournit ce nouveau type de collection:

Exemple: ListDictionary avec Clé et Valeur:

Dim l As New System.Collections.Specialized.ListDictionary

XX-G-8. Dans le Code : Les nouvelles instructions

  • Continue dans une boucle Do While ou For permet de passer à l'itération suivante sans effectuer le code.
    While condition

    ..Continue While

    End While

    Continue For existe aussi.

  • IsNot simplifie l'écriture:
    If Not (Objet1 Is Nothing ) Then..

    devient

    If Objet1 IsNot Nothing Then

  • Using
    Permet de créer un bloc qui libère les ressources en fin de bloc:
    
        Using sqc As New System.Data.SqlClient.SqlConnection(s)
            MsgBox("Connected with string """ & sqc.ConnectionString & """")
        End Using
    
  • TryCast
    En plus de CType et de Cast, il y a maintenant TryCast qui retourne Nothing si la conversion est impossible.

  • Procédures avec paramètres différents.
    On peut 'overloader' une procédure afin de pouvoir l'appeler avec des paramètres différents.
    
    Overloads Sub LireEnregistrement(ByVal Name As String, ByVal amount As Single)
    
    ' Code permettant de rechercher l'enregistrement à partir du nom.
    
    End Sub
    
    Overloads Sub LireEnregistrement(ByVal Numero As Integer, ByVal amount As Single)
    
    ' Code permettant de rechercher l'enregistrement à partir du numéro
    
    End Sub
    

XX-G-9. Les nouveautés dans les Classes

Les classes 'Partielles' sont possible.

Partial Class MaClasse

End Class
Ainsi une Classe peut être scindée en plusieurs parties situées dans des endroits différents du code.


On peut surcharger les opérateurs + - * / mais aussi _ ^ & Like And Or Xor Not < > = << >> CType IsTrue, IsFalse

Exemple: surchargeons l'opérateur +

Public Structure height
    ...
    Public Shared Operator +(ByVal h1 As height, ByVal h2 As height)As height
        Return New height(h1.feet + h2.feet, h1.inches + h2.inches)
    End Operator
End Structure
La routine doit être Shared, de plus si on surcharge certains opérateurs, il faut aussi surcharger leur inverse: si on surcharge '>' , il faut surcharger '<'.

Surcharge de IsTrue, IsFalse CType

Si on teste un boolean, il a la valeur True ou False.

Si par contre je crée une classe nommée 'Personne', je peux définir comment une instance sera considérée comme égale à True. Il faut surcharger l'opérateur IsTrue en lui indiquant dans quelle condition l'instance sera considérée comme =True:

Exemple:

J'ai une instance e de type Personne, si e.Present =True, dans ce cas je veux que e soit considéré comme True; il faut écrire dans la Classe 'personne':

Public Shared Operator IsTrue(ByVal e As Personne) As Boolean

If e Is Nothing Then

    Return False

Else

    Return e.Present

End If

End Operator
Pour définir l'opérateur IsFalse, c'est simple: c'est Not e

Public Shared Operator IsFalse(ByVal e As Personne) As Boolean

    Return Not e

End Operator
Ensuite je pourrais utiliser des instructions de la forme:

If e then.. 
Surcharge de CType:

Je peux définir dans une classe comment CType va fonctionner:

Pour cela dans la classe Personne, je vais définir les 3 possibilités:

Public Shared Widening Operator CType(ByVal e As Personne) As String

Return e.Nom + " " + e.Prenom

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Date

If e Is Nothing Then

    Return Nothing

Else

    Return e.DateDeNaissance

End If

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Boolean

    If e Is Nothing Then Return False Else Return e.Present

End Operator
Ainsi

CType(UnePersonne,String) retourne Nom Prenon

CType(UnePersonne,Date) retourne la date de naissance

CType(UnePersonne,Boolean) retourne True ou False.

On peut créer des Property avec une portée différente pour le Set et le Get:

Public Class employee
    Private salaryValue As Double
    Protected Property salary() As Double
        Get
            Return salaryValue
        End Get
        Private Set(ByVal value As Double)
            salaryValue = value
        End Set
    End Property
End Class
Utilisation des 'générics'

Un type 'generic' permet de créer une Classe ayant des Data Types non définis au départ.

Créons une classe MyClasse; Of permet d'indiquer le genéric:

Public Class MyClasse(Of t)
    Public Sub NewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class
On peut ensuite utiliser cette classe avec des Integer ou des String:

Public UneClass As New MyClasse(Of Integer)
Friend stringClass As New MyClasse(Of String)
voir la rubrique 'générique' pour le détails.



XX-H. Nouveautés 2008 et Framework 3

VB edition 2008 c'est VB 9.0!!

On verra les nouveautés dans:

A- le Framework 3.5

B- l'IDE

C- le langage visual basic

A- LE FRAMEWORK 3.5

Un Framework est donc un ensemble de Classes.

Le Framework 2.0 était utilisé par VB 2005.

Le Framework 3.0 c'est le Framework 2 auquel s'ajoute WPF WCF WF WCS.

Windows Presentation Foundation (WPF) ex 'avalon' utilise un moteur de rendu vectoriel et des accélérations matériels pour afficher. Présent dans la version Express.

Windows Communication Foundation (WCF) ex 'indigo' permet de développer des applications distribuées inter opérables, fiables et sécurisées. WCF simplifie le développement d'applications connectées. Non présent dans la version Express.

Windows Workflow Foundation (WF) est constitué d'un modèle de programmation, d'un moteur d'exécution et d'outils, pour développer et intégrer des workflows dans les applications .NET. (un workflow est une succession d'actions ou d'étapes qui s'exécutent dans un ordre prédéfini). Non présent dans la version Express.

Windows CardSpace (WCS), ex Infocard, est une nouvelle technologie qui permet aux utilisateurs de prouver leur identité. Non résent dans la version Express.


Le Framework 3.5 est utilisé par VB2008.

C'est le Framework 3 auquel s'ajoute AJAX (utilisable dans les WebForms), LINQ et REST (C'est quoi?).

Vista comporte nativement le Framework 3.0.

VB 2008 permet de choisir et d'utiliser le Framework 2.0, 3.0 ou 3.5

Depuis le Framework 2 le CLR (Common Langage Runtime), le moteur, est toujours le même: c'est la version 2.


Attention:

Les WPF fonctionnent dans l'édition VB Express 2008; avec un IDE simplifié. Les extensions pour Windows WorkFlow Foundation ne peuvent pas être utilisées avec les versions Express : il vous faudra, au minimum, une version " Professionnel " de Visual Studio 2008 :

Collection HashSet

Cette nouvelle collection travaille sur les ensembles.

Il s'agit d'une collection sans ordre qui contient des éléments uniques. HashSet possède comme toutes les collections Add, Remove et Contains.. et fournit plusieurs opérations d'ensembles (notamment l'union, l'intersection et la différence symétrique)ce qui permet de prendre en charge la plupart des opérations mathématiques qui sont généralement réalisées sur des ensembles (sens mathématique du terme).

Dim hs As New HashSet(Of String)

Ajout d'éléments:

hs.Add("toto")

hs.Add("lulu")

hs.Add("titi"
La méthode Add renvoie True ou False pour indiquer si elle a fonctionné (s'il n'y avait pas déjà dans la HashSet l'élément que l'on veut ajouter).

Dim caMarche As Boolean = hs.Add("toto")  
'retourne False

hs.Count 
donne le nombre d'élément.

On peut effacer un élément:

hs.Remove("lulu") 
On peut effacer sous condition:

Exemple: effacer tous les éléments contenant un "t":

hs.RemoveWhere( Adress Of Test) 
'La fonction Test reçoit chaque string de la table et retourne un booléen qui indique si la condition est rempli ce qui déclenche le Remove.

Private Shared Function Test(ByVal s As String) As Boolean  

    Return (Instr(s,"t")<>0) 

End Function 

On peut ajouter la collection hs2 à hs grâce à UnionWith:

hs.UnionWith(hs2) 
Les éléments doublons (qui existent déjà dans hs )ne sont pas ajoutés.

Cela correspond à un And sur les 2 ensembles.


On peut rechercher les éléments communs à hs2 et à hs grâce à IntersectWith:

hs.IntersectWith(hs2) 
hs contient maintenant les éléments qui étaient présents dans hs et hs2

Cela correspond à un Or sur les 2 ensembles.


On peut supprimer tous les éléments de hs qui sont aussi contenus dans la collection passée en paramètre (hs2) avec ExceptWith

hs.ExceptWith(hs2) 
hs contient maintenant les éléments qui n'étaient pas présents dans hs et hs2


On peut rechercher les éléments contenus dans hs2 et dans hs mais pas dans les 2 grâce à SymmetricExceptWith:

hs.SymmetricExceptWith(hs2) 
hs contient maintenant les éléments qui étaient présents dans hs ou hs2 mais pas les deux.


On peut rechercher si hs2 est un sous ensemble de hs grâce à IsSubsetOf:

Dim b As Boolean= hs.IsSubsetOf(hs2) 
b est égal à True si hs est un sous ensemble de hs2 (tous les éléments de hs sont dans hs2).

Il existe aussi:

IsProperSubstOf qui retourne True si hs est un sous ensemble de hs2 et si hs différent de hs2 (sous ensemble strict)


On peut rechercher si hs est un sur ensemble de hs grâce à IsSupersetOf:

Dim b As Boolean= hs.IsSupersetOf(hs2) 
b est égal à True si hs est un sur ensemble de hs2 (tous les éléments de hs2 sont dans hs).

Il existe aussi:

IsProperSupersetOf qui retourne True si hs est un sur ensemble de hs2 et si hs est différent de hs2 (sur ensemble strict)

TimeZone

Les nouvelles classes DateTimeOffset et TimeZoneInfo permettent de mieux gérer les applications qui utilisent les zones dates et heures.


Suite B

Vb 2008 gère la cryptographie avec les algorithmes 'Suite B' de la NSA.


Support du Peer to Peer

Vb 2008 gère le Peer to Peer grâce à l'espace de nom System.Net.PeerToPeer.


AddIn

Il est possible à l'utilisateur d'ajouter à son application des Add-In.

WPF

Voir chapitre sur les WPF.

Plutôt que de travailler avec les Windows Forms (formulaire habituel utilisant GDI+); en VB 2008 on peut utiliser un mode graphique vectoriel extrêmement performant pour dessiner les formulaires et contrôles: pour cela on utilise les WPF (Windows Presentation Foundation).

Il y a le 'designer' en haut qui permet de dessiner l'interface que verra l'utilisateur. Le designer génère un fichier XAML en bas qui décrit en XML l'interface. Dans la version Express, il n'y a pas 'cider' qui permet de faire une interface extrêmement élaborée (dégradé de couleur, animation...) Si on était un peu 'maso' on écrirait du code XAML pour faire du graphisme élaboré.


Support Windows Vista

VB 2008 utilise sous Windows Vista les CommonDialogBox de Vista et à accès à la gestion des droits avec l'usage de l'UAC.


B- L'IDE VB 2008

Dans l'ensemble elle ressemble beaucoup à celle de VB 2005.

-Le changement majeur est de pouvoir travailler avec les WPF (voir plus bas).

-L'aide est plus élaborée:

Des que je tape une lettre VB propose dans une liste des mots. Exemple, je tape 'd', il affiche 'Dim', 'Dir'..., de plus si je me met sur un des mots, il ouvre une petite fenêtre d'explication sur le mot avec sa syntaxe.

-VB 2008 permet de choisir et d'utiliser le Framework 2.0, 3.0 ou 3.5.

Pour changer de Framework, passer par le menu 'Projet' puis 'Propriétés de..', onglet 'Compiler', en bas il y a un bouton nommé 'Options avancées de compilation...', cliquez dessus:

On peut en bas de la fenêtre modifier le Framework et utiliser le Framework 2, 3, 3.5.

C- NOUVEAUTÉS DANS VISUAL BASIC 2008

Initialisation simplifiée.

Soit une Classe Personne ayant les property Nom et Id

En VB 2005 on pouvait écrire:

Dim per2 As New Personne

With per2

  .Nom = "Philippe"

  .Id = 2

End With
Si le constructeur le permet (si il accepte 2 arguments pour New)on peut aussi écrire:

Dim per1 As New Personne ("Philippe", 2)
En VB 2008 on peut écrire:

Dim per1 As New Personne With {.Nom = "Philippe", .Id = 2}

Inférence de Type

Il faut pour cela que Option Infer =On (Off par défaut)

Passer par le menu 'Projet' puis 'Propriétés de..', onglet 'Compiler'

En plus des options Explicit, Compare, Strict, on peut modifier Option Infer.

L'inférence est la capacité de déduire le type d'une variable par analyse des types fournis en entrées ainsi que des opérations effectuées sur ceux-ci. C'est donc le compilateur qui déduit le type de la variable.

' Type explicite pour une String
Dim Myname1 As String = "Rouge"

' Exploitation de l'inférence de type
Dim Myname2 = "Vert"
Le passage du curseur de la souris sur Myname2 vous permet de découvrir que celui-ci est bien un type "String".

On avait dit qu'il fallait travailler avec Option Implicit = True et là on ne déclare même pas le type!!! En fait l'inférence existe afin de supporter par exemple les types anonymes ou encore LINQ.

Il existe des cas pour lesquels l'inférence de type ne se produit pas. Pour les instructions Dim locales, l'inférence de type survient uniquement lorsqu'il y a une assignation sur la ligne de déclaration. Par conséquent, pour les assignations effectuées hors de la déclaration de la variable, le compilateur supposera que le type est Object. Object est également toujours déduit comme type des membres de niveau classe, si bien que l'inférence de type ne s'applique pas aux fonctions, sous-routines, propriétés, champs de classe/structure, etc Lorsque Option Explicit est Off , une variable locale peut être utilisée dans le code sans déclaration explicite. La variable est supposée être dans ce cas de type Object et tous les appels sont liés tardivement. L'inférence de type ne survient pas sur les variables définies implicitement.


Link

Language-Integrated Query (LINQ).

Langage de requête intégré. C'est un langage de requêtes (permettant d'interroger une source de données) directement dans le code Visual Basic et à l'aide de mots clés familiers (issues du SQL, le langage d'interrogation des bases de données). De plus, ce qui est 'magique', ce langage de requêtes est utilisable, non seulement sur les bases de données SQL Serveur et ADO.NET mais aussi sur des documents XML et un ensemble d'objets comme les String, Collections, ListArray..

Exemple: rechercher les nombres pairs dans un tableau d'Integer:

' La Data source: c'est un tableau d'Integer 

Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

 

' Création de la requête.

'Pour chaque élément num dans la source

'Si l'élément num est tel que num Mod 2=0

'Selectionner num et le mettre dans réponses

 Dim réponses = From num In numbers _

                  Where num Mod 2 = 0  _

                  Select num 

 

' Exécution de la requête. 

' On utilise les réponses

For Each number In reponses 

    Console.Write(number & " ")

Next
Cela affiche sur la console: 0 2 4 6:

On peut vouloir compter uniquement les nombres pairs:

Dim nombredepair = (From num In numbers _ 

            Where num Mod 2 = 0 _ 

            Select num).Count()
On remarque que dans le premier exemple (Select num) l'exécution de la requête est effectuée au cours de la boucle For Each (exécution différée par rapport à la création) alors que dans le second exemple (count) , l'exécution est immédiate.


Méthodes d'extension.

Permet d'ajouter des fonctionnalités à une Data Type ( sans devoir faire une Classe dérivée)

Exemple:

Soit le DataType 'String', je veux y ajouter une méthode Print qui affichera la String sur la console:

Imports System.Runtime.CompilerServices

Module StringExtensions

    <Extension()> _
    Public Sub Print(ByVal aString As String)
        Console.WriteLine(aString)
    End Sub

End Module
C'est le "ByVal aString As String" qui indique que c'est une extension sur les 'String'.

Comment utiliser la méthode Print?

Imports ConsoleApplication2.StringExtensions

Module Module1

    Sub Main()

        Dim exemple As String = "Bonjour"
        ' Appel de  l'extension method Print.
        exemple.Print()

        ' Appel de la méthode d'instance  'ToUpper'.
        exemple.ToUpper()
        exemple.ToUpper.Print()

    End Sub

End Module
Si on veut ajouter un paramètre à la méthode Print, il faut l'ajouter au premier paramètre qui lui indique le DataType.

<Extension()> _
Public Sub PrintPonctuation(ByVal aString As String,  ByVal punc As String)
    Console.WriteLine(aString & punc)
End Sub
Ensuite pour l'utiliser:

Dim exemple As String = "Exemple" 
exemple.PrintPonctuation(".")

Lambda Expression

Une expression lambda est une fonction permettant de calculer et retourner une valeur unique. Exemple: Créons une expression lambda qui incrémente un Integer. Création de la fonction:

Dim ajoute1 = Function(num As Integer) num + 1
Utilisation de la fonction dans la même sub:

Console.WriteLine(ajoute1(5))   Affiche 6.
On dit que la fonction lambda 'ajoute1( num As Integer)' conduit à num+1.

On peut déclarer et utiliser la fonction en même temps:

Console.WriteLine((Function(num As Integer) num + 1)(5))
Dans ce cas il n'y a pas de nom de fonction.


Attention:

On n'a pas de 'End Function' ni de 'Return' ni de 'As', on ne peut pas utiliser les génériques.

Si on veut déclarer l'expression lambda dans la tête du module afin d'avoir un accès public, c'est plus complexe:

Class Window1

Delegate Function ajoute(ByVal num As Integer) As Integer

Public ajoute1 As ajoute = Function(num) num + 1

 

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _
 Handles Button.Click

    MsgBox(ajoute1(3).ToString)

End Sub

 
End Class
Voyons comment on peut passer à une Sub une fonction lambda en argument. On crée une fonction 'testResult' qui a pour argument une valeur et une fonction lambda. Cette fonction affiche "Success" ou "Failure" en fonction de la valeur True ou False retournée par la fonction lambda qui a reçu la valeur. Pour utiliser cette sub on l'appelle avec comme argument la valeur à tester et la fonction Lambda.

Module Module1
 Sub Main() 
'On appelle une fonction en envoyant une valeur et une fonction lambda.
' La ligne affiche "Success" car 4 est pair. 
testResult(4, Function(num) num Mod 2 = 0) 
' La ligne affiche "Failure" car 5 n'est pas > 10.
testResult(5, Function(num) num > 10)
 End Sub 
 
' Sub testResult a 2 arguments, 'value' un Integer  et 'fun' la fonction lambda 
' On teste la fonction lambda 'fun(value)' 
' en fonction du resultat True ou False on affiche "Success" ou "Failure"
Sub testResult(ByVal value As Integer, ByVal fun As Func(Of Integer, Boolean)) 
If fun(value) Then
 Console.WriteLine("Success") 
Else
 Console.WriteLine("Failure") 
End If 
End Sub 
End Module

Méthode partielle

Elle sont présentes dans des Classes Partielles. Et sur des méthodes privées. Voici la syntaxe.

Partial Private Sub MyMethode()
End Sub
Exemple:

Voici la Classe:

Partial Class Product 
Private _Quantity As Integer 
Property Quantity() As Integer 
...
End Property
 
Partial Private Sub QuantityChanged() 
End Sub 
 
End Class
Ici dans la Classe initiale la méthode partielle QuantityChanged() sert à donner la signature.

L'autre Classe partielle, qui est dessous, ajoute des fonctionnalités à la méthode partielle.

Partial Class Product</b>				

 Private Sub QuantityChanged()

     MsgBox("Quantity was changed to " & Me.Quantity) 

End Sub 

End Class

 
XML

On peut créer directement de l'XML dans le code. On peut créer un élément XML:

Dim contact1 As XElement = _
    <contact>
      <name>Patrick Dupont</name>
      <phone type="home">206-555-0144</phone>
      <phone type="work">425-555-0145</phone>
    </contact>
On peut créer un document XML:

Dim contactDoc As XDocument = _
    <?xml version="1.0"?>
    <contact>
      <name>Patrick Dupont</name>
      <phone type="home">206-555-0144</phone>
      <phone type="work">425-555-0145</phone>
    </contact>
On peut mettre dans le XML des expressions qui sont évaluées au cours de l'exécution, ces expressions sont de la forme: %= expression %

Exemple: Inclure dans l'élément XML un nombre et une date:

Dim MyNumber As String = "12345" 

Dim MyDate As String = "3/5/2006" 

Dim livre As XElement = _ 

<livre category="fiction" isbn=<%= MyNumber %>> <TheDate><%= MyDate %></TheDate> </livre>

Type Nullable.

Les types Par Valeur peuvent être étendus afin d'accepter une valeur normale habituelle ou une valeur Null (Nothing en VB). On peut déclarer un type Nullable de 3 manières:

Dim MyInteger As Nullable (Of Integer)
Mais aussi:

Dim MyInteger? As Integer

Dim MyInteger As Integer?
C'est le '?' qui force la variable Nullable.

Sur la seconde déclaration, la variable est MyInteger

Autre exemple:

Dim MyBol As Boolean?
MyBol pourra prendre la valeur True, False et Nothing.

Cela a de l'intérêt quand on travaille avec les bases de données qui ont des champs qui contiennent un Null et avec Linq.


Type anonyme

Habituellement, on peut déclarer Mycustomer, une instance de la classe Customer et renseigner une propriété .Name.

Dim MyCustomer = New Customer With {.Name = "Philippe"}
Grâce au type anonyme, on peut écrire:

Dim AnomyneCustomer = New With {.Name = "Philippe"}
Remarque= avant New il doit y avoir '=' et pas As.

Cela créer une nouvelle classe anonyme (sans nom) possédant une propriété .Name.

Les types anonymes sont surtout utilisés avec Linq:

Exemple:

Dim namePriceQuery = From prod In products _ 

                     Select prod.Name, prod.Price
Si products est une liste d'objets avec plein de propriétés, namePriceQuery est une collection de type anonyme qui posséde 2 propriétés: .Name et .Price .


 

Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com