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


VIII-P. Couleurs et Font
VIII-P-1. Les couleurs
VIII-P-1-a. Généralités
VIII-P-1-b. Enumération Color
VIII-P-1-c. Rouge, vert, bleu
VIII-P-1-d. Couleurs 'System'
VIII-P-1-e. Couleur dans les objets
VIII-P-1-f. Choix d'une couleur par l'utilisateur
VIII-P-2. Police de caractères (ou Font)
VIII-Q. Grille ou Grid
VIII-Q-1. Contrôles Freeware à télécharger, c'est du '.Net'
VIII-Q-1-a. 'LameGrid'en français +++++
VIII-Q-1-b. Autre
VIII-Q-2. 'DataGridView' à partir de VB 2005
VIII-Q-3. MsFlexGrid de VB6 et DataGrid de 2003(pour mémoire)
VIII-R. ProgressBar
VIII-R-1. ProgressBar de VB 2003
VIII-R-2. ProgressBar de VB 2005
VIII-S. Créer des contrôles par code
VIII-S-1. Créer par code des contrôles
VIII-S-2. Ajouter des évènements
VIII-S-3. Menu par code
VIII-T. Mise à jour et vitesse de l'affichage


VIII-P. Couleurs et Font


VIII-P-1. Les couleurs


VIII-P-1-a. Généralités

Une couleur est représentée par 3 octets correspondent aux composants de couleur rouge, vert et bleu. Chaque octet peut prendre la valeur 0 à 255 (ou 0 à FF en hexadécimal).

Si on utilise la notation hexadécimale, il faut mettre &H avant: &HFF correspond à 255.

Exemple : valeur des 3 composantes couleurs et couleurs correspondantes:

En plus, dans certains cas, il y a une composante alpha qui indique la transparence. 255 indique que la couleur est opaque, 1 à 254 indique que la couleur est transparente.

Il y a une Classe Color dans SystemDrawing. On peut instancier un Objet Color:

Dim myColor As Color
On peut voir les composants de cette couleur avec:

myColor.A composante alpha

myColor.B composante bleue

myColor.R composante rouge

myColor.G composante verte

On ne peut pas les modifier car ces propriétés sont en ReadOnly!! Utiliser FromArg pour modifier.


VIII-P-1-b. Enumération Color

Le plus simple est, pour modifier la couleur d'un objet par du code, d'utiliser l'énumération 'Color' qui contient le nom d'une couleur toute faite (en RGB sans composante Alpha):

Color.Back,

Color.Fuchsia

Color.Chocolate

Color.Red ...

Voici toutes les couleurs à votre disposition:

Elles font partie de System.Drawing

Comme d'habitude il suffit de taper Color. et la liste très longue des couleurs s'ouvre.

Bouton.BackColor=Color.Red     'modifie la couleur de fond du bouton

Ces couleurs semblent correspondre au couleurs 'Web'. Il y a longtemps quand on avait des moniteurs affichant 256 couleurs, il existait une liste nommé 'web-safe colors ' contenant 216 couleurs qui étaient des couleurs 'sures' c'est à dire affichable sans utilisation de tramage (le tramage étant l'affichage d'une couleur en juxtaposant des pixels de couleurs différentes pour se rapprocher de la couleur manquante); mais maintenant cela est obsolète avec les moniteurs actuels. Il semble que les couleurs VB correspondent aux couleurs Web bien qu'il y ait plus de couleurs Web que de couleurs VB.



VIII-P-1-c. Rouge, vert, bleu

Plus puissant:

 Color.FromArgb
Crée une couleur à partir des valeurs des quatre composants ARVB (argb en anglais) 8 bits (alpha, rouge, vert et bleu).

alpha indique la transparence. 255 indique que la couleur est opaque, 1 à 254 indique que la couleur est transparente.

L'octet le plus significatif, représenté par AA, correspond à la valeur du composant alpha. Les second, troisième et quatrième octets, représentés par RR, VV et BB, correspondent aux composants de couleur rouge, vert et bleu, respectivement. Chaque octet prend la valeur 0 à 255 ou 0 à FF en hexadécimal.

Le paramètre correspond à 4 X 8bits=32 bits= un Integer. Pour plus de clarté on rentre généralement les données en hexadécimal:

Me.BackColor= Color.FromArgb(&H780000FF)    'correspond à un bleu transparent.
 
Voici les principales couleurs et le code hexadécimal correspondant:


Il y a des surcharges:

On peut passer chaque paramètre séparément:

Me.BackColor=Color.FromArgb(120, 0, 0, 255)
 
On peut aussi passer l'alpha et la couleur en second paramètre. Pour obtenir une couleur bleue à moitié transparente:

 MaCouleur = Color.FromArgb(128,color.blue)

Plus simple:

On peut définir une couleur avec la fonction RGB (red, green, blue) , pas de composantes alpha ici.

Dim red As Color = RGB(255, 0, 0) ' fait partie de Microsoft.VisualBasic


VIII-P-1-d. Couleurs 'System'

Ce sont les couleurs utilisées par Windows pour afficher la barre de titre, les fonds, couleurs d'éléments actifs ou non. On peut modifier ces couleurs en passant par le panneau de configuration (option 'Affichage'). Toutes les applications les utilisent. On peut aussi les utiliser.

L'énumération KnownColor contient les couleurs système (couleur des barres, texte, fenêtre active..)

mais pour utiliser une couleur system, il faut employer SystemColors.

Me.BackColor = SystemColors.ActiveBorder 'modifie la couleur de fond du formulaire en cours


VIII-P-1-e. Couleur dans les objets

Pour changer la couleur d'arrière-plan du contrôle (le fond), utilisez la propriété BackColor, la propriété d'avant plan est Forecolor (la couleur du texte dans un bouton par exemple).

Ici pour ce bouton, BackColor est égal à Color.Red et ForeColor est à Color.Black

Dans le code MyButton.BackColor = Color.Red

En mode Design (conception), on peut modifier la couleur directement en cliquant sur le bouton '...' en face de BackColor par exemple: la fenêtre de choix des couleurs apparaît:

On a le choix entre toutes les couleurs possibles (65535) par 'Personnaliser', les couleurs Web (Celles de l'énumération Color) et couleurs system (System).



VIII-P-1-f. Choix d'une couleur par l'utilisateur

Pour permettre à l'utilisateur de choisir une couleur, il faut mettre dans le formulaire une ColorDialog à partir de la boite à outils; elle vient se placer sous le formulaire:

Il faut ensuite, par code, ouvrir cette ColorDialog.

La classe ColorDialog a une méthode ShowDialog, analogue à la méthode ShowDialog des classes OpenFileDialog et

Si l'utilisateur quitte la boîte de dialogue en cliquant sur le bouton 'OK', la méthode ShowDialog retourne DialogResult.OK et la couleur choisie est dans la propriété Color de l'objet ColorDialog .

Exemple:

L'utilisateur clique sur un bouton nommé 'CouleurButton' cela ouvre la ColorDialog, l'utilisateur clique sur une couleur puis sur 'Ok', cela donne aux caractères de la TextBox 'Texte' la couleur choisie.

Private Sub CouleurButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles CouleurButton.Click

' Ouverture de la dialogBox colordialog1

If colorDialog1.ShowDialog() = DialogResult.OK Then

' on met la couleur dans la propriété forecolor du TextBox

Texte.ForeColor = colorDialog1.Color

End If

End Sub

On peut modifier la boite à notre gout avant de l'ouvrir:

colorDialog1.SolidColorOnly= True  'Couleurs pures (unies) seulement
colorDialog1.AllowFullOpen= True  'Autorise le bouton des couleurs personnalisées (volet de droite)
colorDialog1.FullOpen= True  'Affiche les couleurs personnalisées
colorDialog1.Color= Color.Red  'Couleur préselectionnée



VIII-P-2. Police de caractères (ou Font)

Une 'Font' est définie par:

- Un nom.

- Une taille.

- Un style (gras, italique, souligné..)


Pour modifier la police de caractère utilisée dans un contrôle, il faut lui assigner un objet 'Font'

label1.Font = New System.Drawing.Font("Arial", 10) 
'on indique le nom de la font et la taille, on aurait pu ajouter un troisième argument: le style (gras, italique, souligné).


	label1.Font = New System.Drawing.Font(label1.Font, FontStyle.Bold Or FontStyle.Italic)
Ici c'est une autre signature Font, Style. On peut ajouter 2 autres paramètres (Unit et jeux de caractères).

Visual Basic .NET prend en charge les polices TrueType et OpenType.

Dans un contrôle, les propriétés de police sont automatiquement héritées du parent, sauf lorsqu'elles sont explicitement définies pour l'objet enfant. Par exemple, si vous avez deux contrôles d'étiquette dans un formulaire et que vous changiez les propriétés de police du formulaire en Arial, les polices du contrôle d'étiquette sont également changées en Arial. Si par la suite vous changez la police d'une étiquette en Times Roman, les modifications qui pourront être apportées à la police du formulaire ne remplaceront pas la police de l'étiquette.


Pour lire les fonts installées utiliser l'espace de noms System.Drawing.FontFamily.

Dim ff As FontFamily
For Each ff In System.Drawing.FontFamily.Families
listBox1.Items.Add(ff.Name)
Next

Pour que l'utilisateur modifie la police du contrôle List1.

Dim myFontDialog As FontDialog
   myFontDialog = New FontDialog()
   
   If myFontDialog.ShowDialog() = DialogResult.OK Then
      
      List1.Font = myFontDialog.Font
   End If

Les polices True Type sont précédées d'un TT.

Les polices Open Type sont précédées d'un O.


On ouvre une fenêtre de choix de police, si une police est sélectionnée par l'utilisateur, on l'applique à List1.

Pour mettre la font de la form en gras:

If Not (Me.Font.Bold) Then
        Me.Font = New Font(Me.Font, FontStyle.Bold)
End If

Pour qu'un TextBox utilise la font "Courier New" de taille 12 en italique:


						TextBox1.Font = New Font("Courier New", 12, FontStyle.Italic)

Attention:

Ne pas utiliser dans votre programme des font 'exotiques' que vous trouvez très belle mais qui ne seront pas présentes sur l'ordinateur des utilisateurs ( elles seront dans ce cas substituées par d'autres avec un résultat aléatoire). Utilisez de l'Arial, il n'y aura pas de problèmes!!


Police BitMap, 'True Type', 'Open Type'.

Avant les années 1990 il y avait des polices au format BitMap (image matricielle). Elle ne sont plus utilisées par VB.Net.

Depuis 1980 existe True Type, un format de police multiplateforme vectorielle, développé par Apple et vendu ensuite à Microsoft.

(concurrent du format Type1 de PostScript d'Adobe)


On utilise depuis 2001 OpenType qui est un nouveau format de police multiplateforme vectorielle, développé conjointement par Adobe et Microsoft. Adobe propose plusieurs milliers de polices OpenType.

Les deux principaux atouts du format OpenType résident dans sa compatibilité multiplateforme (un seul et même fichier de polices exploitable sur les postes de travail Macintosh et Windows) et sa prise en charge de jeux de caractères et de fonctions de présentation très étendus, qui offrent de meilleures capacités linguistiques et un contrôle typographique évolué.

Une police Open Type est basée sur le numéro de caractères Unicode et peut contenir jusqu'à 65000 glyphes.

Le format OpenType est une extension du format TrueType SFNT qui gère également les données des polices Adobe® PostScript® et des fonctions typographiques inédites.

Les noms de fichier des polices OpenType contenant des données PostScript possèdent l'extension .otf, tandis que les polices OpenType de type TrueType portent l'extension .ttf.


Notion de Font proportionnelle.

Il existe des fonts proportionnelles, comme l'Arial, où les différents caractères n'ont pas la même largeur (le i est plus étroit que le P)c'est plus joli.

Par contre dans les fonts non proportionnelles, comme le 'Courier New', tous les caractères ont même largeur. C'est parfois plus pratique quand on veut afficher des lignes qui concorder sur le plan alignement vertical (et qu'on ne veut pas utiliser les tabulations).



VIII-Q. Grille ou Grid

Qu'utiliser pour afficher dans une 'Grille'(Grid), un tableau (type tableur avec des lignes et des colonnes)?

Ici on affiche du texte directement dans les cellules SANS utiliser de liaison avec une base de données. On parle de grille 'indépendante'.

Il y a :

MsFlexGrid de VB6

LameGrid et SourceGrid Shareware VB.Net

DataGrid VB.Net 2003

DataGridView VB.Net 2005


VIII-Q-1. Contrôles Freeware à télécharger, c'est du '.Net'


VIII-Q-1-a. 'LameGrid'en français +++++

Il existe un contrôle gratuit nommé lameGrid qui est du pur .Net et qui permet simplement d'afficher dans une grid.

On le trouve ici avec son mode d'emploi:


C'est simple rapide, efficace. On le conseille.

Son usage est simple:

Grille(1.2).Forecolor= MyColor

Grille(1.2).Font= MyFont

Grille(1.2).Texte="Lulu"

VIII-Q-1-b. Autre

SourceGrid en Anglais.



VIII-Q-2. 'DataGridView' à partir de VB 2005

C'est celui qu'il faut utiliser.

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.(Contrôle indépendant)

Exemple 1: On crée la Grid puis des colonnes de la grid; on crée les lignes que l'on ajoute à la grille.

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.

Exemple de Microsoft: afficher dans le contrôle MyDataGridView 5 colonnes( nommées date, piste, titre, artiste, album) et 6 lignes de chanson.(exemple à partir d'un exemple de Microsoft).

'création de la grille

Private WithEvents MyDataGridView As New DataGridView

Me.Controls.Add(MyDataGridView)

 

'On met 5 colonnes

MyDataGridView.ColumnCount = 5

 

'On colore les en-têtes, on met les fonts

With MyDataGridView.ColumnHeadersDefaultCellStyle

.BackColor = Color.Navy

.ForeColor = Color.White

.Font = New Font(MyDataGridView.Font, FontStyle.Bold)

End With

 

'on positionne la grille

With MyDataGridView

.Name = "MyDataGridView"

.Location = New Point(8, 8)

.Size = New Size(500, 250)

.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders

.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single

.CellBorderStyle = DataGridViewCellBorderStyle.Single

.GridColor = Color.Black

.RowHeadersVisible = False

 

'On donne le nom des colonnes

.Columns(0).Name = "Date"

.Columns(1).Name = "Piste"

.Columns(2).Name = "Titre"

.Columns(3).Name = "Artiste"

.Columns(4).Name = "Album"

.Columns(4).DefaultCellStyle.Font = New Font(Me.MyDataGridView.DefaultCellStyle.Font, FontStyle.Italic)

.SelectionMode = DataGridViewSelectionMode.FullRowSelect

.MultiSelect = False

.Dock = DockStyle.Fill

End With

 

 

'Création d'un tableau de 5 strings pour chaque ligne

Dim row0 As String() = {"11/22/1968", "29", "Revolution 9", _

"Beatles", "The Beatles [White Album]"}

Dim row1 As String() = {"1960", "6", "Fools Rush In", _

"Frank Sinatra", "Nice 'N' Easy"}

Dim row2 As String() = {"11/11/1971", "1", "One of These Days", _

"Pink Floyd", "Meddle"}

Dim row3 As String() = {"1988", "7", "Where Is My Mind?", _

"Pixies", "Surfer Rosa"}

Dim row4 As String() = {"5/1981", "9", "Can't Find My Mind", _

"Cramps", "Psychedelic Jungle"}

Dim row5 As String() = {"6/10/2003", "13", _

"Scatterbrain. (As Dead As Leaves.)", _

"Radiohead", "Hail to the Thief"}

Dim row6 As String() = {"6/30/1992", "3", "Dress", "P J Harvey", "Dry"}

With Me.MyDataGridView.Rows

'Ajout de ligne

.Add(row0)    

.Add(row1)

.Add(row2)

.Add(row3)

.Add(row4)

.Add(row5)

.Add(row6)

End With

With Me.MyDataGridView

'Ordre des colonnes

.Columns(0).DisplayIndex = 3

.Columns(1).DisplayIndex = 4

.Columns(2).DisplayIndex = 0

.Columns(3).DisplayIndex = 1

.Columns(4).DisplayIndex = 2

End With

 

 

 

'Ajouter une ligne

Me.MyDataGridView.Rows.Add()

 

'Enlever la ligne pointée

If Me.MyDataGridView.SelectedRows.Count > 0 AndAlso _

Not Me.MyDataGridView.SelectedRows(0).Index = _

Me.MyDataGridView.Rows.Count - 1 Then

Me.MyDataGridView.Rows.RemoveAt( _

Me.MyDataGridView.SelectedRows(0).Index)

End If

 

'Faire disparaître toutes les lignes

Me.MyDataGridView.Rows.Clear()  'il ne reste plus que les en-têtes de colonnes

 

Exemple 2: On crée la grid avec des lignes et des colonnes puis on modifie les cellules.



'Mettre 5 colonnes et 50 lignes dans la grid

Grid.RowCount = 50

Grid.ColumnCount = 5

 

With Me.Grid


 


'Une ligne sur 2 en bleue

.RowsDefaultCellStyle.BackColor = Color.White

.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue


'Interdir la selection de plusieurs cellules

.MultiSelect = False



'Empeche la saisie dans les cellules (en faite, le permet par programmation)

.EditMode = DataGridViewEditMode.EditProgrammatically

End With


 


'Gestion des en-têtes de colonne

With Grid.ColumnHeadersDefaultCellStyle '

.BackColor = Color.Blue  'ça marche pas!!?? voir plus bas

.ForeColor = Color.Blue

.Font = New Font(Grid.Font, FontStyle.Bold)' en gras

End With

 

With Grid


 


'Empêche les modifications de lignes, colonnes, l'ajout, la suppression

.AllowUserToAddRows = False

.AllowUserToDeleteRows = False

.AllowUserToOrderColumns = False

.AllowUserToResizeColumns = False

.AllowUserToResizeRows = False


 


'Nomme les colonnes (en têtes)

.Columns(0).Name = "Date"

.Columns(1).Name = "Libellé"

.Columns(2).Name = "Montant"

.Columns(3).Name = "Origine"

.Columns(4).Name = "Cochée"

.RowHeadersVisible = False 'pas de première colonne d'en tête

.Columns(2).Width = 30 'modifie la largeur de la colonne 2

End With
La couleur des entêtes ne marche pas? Il suffit de mettre la propriété EnableHeadersVisualStyles à False pour que le datagridview prenne en compte le style appliqué par code.


Pour avoir une 2 lignes d'en-tête:

.Columns(2).Name = "Montant" & ControlChars.CrLf & "en euros"

'(ColumnsHeaderHeightSizeMode est par défaut à AutoSize)



'On modifie la couleur de fond d'une cellule, on aligne au milieu, impose un format et affiche "12"

Grid.Item(3, 3).Style.BackColor = Color.Coral

Grid.Item(3, 3).Style.Alignment = DataGridViewContentAlignment.MiddleRight

Grid.Item(3, 3).Style.Format = "#####"

Grid.Item(3, 3).Value = 12




'On modifie la couleur de fond d'une cellule, on aligne au milieu, 
' on met en italique et affiche "Toro"

Grid.Item(3, 4).Style.BackColor = Color.Chartreuse

Grid.Item(3, 4).Style.Alignment = DataGridViewContentAlignment.MiddleRight

Grid.Item(3, 4).Style.Font = New Font(Grid.Font, FontStyle.Italic)

Grid.Item(3, 4).Value = "Toro"



If Not Button1.Font.Style = FontStyle.Bold Then 

Button1.Font = New Font(FontFamily.GenericSansSerif, _ 12.0F, FontStyle.Bold) 

End If 




'On force la cellule à accepter une image, on aligne au milieu, donne une couleur de fond 
'et affiche une image à partir d'un fichier.

Grid.Item(2, 2) = New DataGridViewImageCell

Grid.Item(2, 2).Style.Alignment = DataGridViewContentAlignment.MiddleCenter

Grid.Item(2, 2).Style.BackColor = Color.Wheat

Grid.Item(2, 2).Value = New Bitmap("viconote.gif")


 


'On  autorise le redimensionnement  auto, marche pas?

Grid.AutoResizeColumns()


 

'Positionner la cellule courante, le curseur sur la cellule 1,1

Grid.Rows(1).Cells(1).Selected = True

 

'Connaître la ligne et la colonne de la cellule  courante

Dim x As Integer = Grid.CurrentCellAddress.X

Dim y As Integer = Grid.CurrentCellAddress.Y


 

 


'Effacer le contenu de toutes les cellules de la grid

Grid.Rows.Clear()

Grid.RowCount = 50

Grid.ColumnCount = 5



'Modifier le ToolTipText (Petit rectangle jaune contenant un test qui apparait quand le curseur de 
'la souris reste un moment sur une cellule)

Private Sub Grid_CellFormatting(ByVal sender As Object, ByVal e 
_As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles Grid.CellFormatting

Dim cell As DataGridViewCell = Grid(e.ColumnIndex, e.RowIndex)

cell.ToolTipText = "oui"

End Sub
On rappelle que la première cellule en haut à gauche est la cellule '0,0'; on ne compte pas les en-têtes.


VIII-Q-3. MsFlexGrid de VB6 et DataGrid de 2003(pour mémoire)

Pour mémoire:
Microsoft fournissait avec VB6 l'activeX 'Microsoft Flexgrid 6' qui permettait de satisfaire à la plupart des demandes . Il est toujours possible d'utiliser cet activeX dans vos programmes mais ce n'est plus du .net (c'est du non managé).

Il faut l'ajouter dans la boite à outils: Bouton droit puis dans le menu 'Ajouter/Supprimer un composant' puis 'Parcourir' , on ajoute MSFLXGRD.OCX qui est dans Windows/System32 ( si vb6 installé, ou sinon le demander à quelqu'un qui a le cd VB6 mais il faut ensuite ouvrir le cd vb6 et cliquer sur c:\common\tools\vb\controls\vbctrls.reg). ).

Voila ce qu'il permet de faire en VB6: (Logiciel LDF de l'auteur)

Les propriétés Cols et Rows permettent de définir le nombre de colonne et de ligne.

FixedCols et FixedRows permettent de déterminer les colonnes et lignes qui ne bougent pas (titres); BackColorFixed donne une couleur à ces lignes fixes.

Modifier la largeur d'une colonne:

Grid.ColWidth(i) =150

Pour modifier une cellule:

Grid.Row = 2        'Coordonnées de la cellule
Grid.Col = 3
Grid.CellFontBold = True    'Texte en gras
Grid.CellForeColor = Color.Red 'Couleur du texte

Grid.Text= Texte  
ou

Grid.TextMatrix(2, 3) = Texte
.TextMatrix est beaucoup plus rapide que .Text mais on n'a accès qu'au texte et pas à l'enrichissement.


Modifier la couleur de fond d'une cellule:

Grid.CellBackColor = Color.Red

Mettre une image dans une cellule

Grid.CellPictureAlignment = flexAlignCenterCenter '4= gère l'alignement
Set Grid.CellPicture = ImageCoche.Picture    'Syntaxe VB6, le Set doit disparaître en .Net
On peut gérer l'évènement Grid_RrowColChanged quand l'utilisateur change de cellule. Il existe bien sur Grid_Click...

Pour accélérer l'affichage et éviter le scintillement , surtout si il faut réafficher la totalité du tableau avec des couleurs et des images, il faut désactiver la mise à jour de l'affichage, afficher la page, réactiver. L'affichage devient instantané.

L'exemple suivant colore une ligne sur deux, c'est instantané.

Dim i As Integer

Dim j As Integer

Grid.Redraw = False
Grid.Clear

For i = 0 To NbMaxLigne Step 2
Grid.Row = i
For j = 0 To MaxColonne - 1
Grid.Col = j
Grid.CellBackColor = VERTCLAIR
Next j
Next i

Grid.Redraw = True

Il n'y a pas de gestion de saisie dans les cellules, il faut le faire 'à la main', Grid_KeyPress appelle une routine qui simule une saisie dans la grille avec un textbox qui prend les dimensions de la cellule.

Mettre dans un formulaire une grille MSFLEXGRID nommée Grid, une TextBox (avec borderSTyle =None) nommée TxtEdit.

Grid_KeyPress appelle une routine qui affiche le textbox (qui prend les dimensions de la cellule), l'utilisateur tape son texte dans le textbox, quand il sort, le textbox est effacé et le texte affiché dans la cellule de la grid.

AJOUTER DANS LES PROCEDURES:

Private Sub Grid_DblClick()
If Txtedit.Visible = True Then Exit Sub 'evite une boucle
'edite
MSHFlexGridEdit Grid, Txtedit, 32 ' Simule un espace.
End Sub


Private Sub Grid_GotFocus()
If Txtedit.Visible = True Then
Grid = Txtedit
Txtedit.Visible = False
End If
End Sub


Private Sub Grid_KeyPress(KeyAscii As Integer)
MSHFlexGridEdit Grid, Txtedit, KeyAscii
End Sub



Private Sub Grid_RowColChange()
EditKeyCode Grid, Txtedit, 27, 0
End Sub


Private Sub Txtedit_KeyDown(KeyCode As Integer, Shift As Integer)
EditKeyCode Grid, Txtedit, KeyCode, Shift
End Sub
AJOUTER LES 3 routines:

Sub EditKeyCode(MSHFlexGrid As Control, Edt As Control, KeyCode As Integer, Shift As Integer)
' Traitement de contrôle d'édition standard.
Select Case KeyCode
Case 27 ' ÉCHAP : masque, renvoie le focus à MSHFlexGrid.
Edt.Visible = False
MSHFlexGrid.SetFocus
Case 13 ' ENTRÉE renvoie le focus à MSHFlexGrid.
Edt.Visible = False
MSHFlexGrid.SetFocus
MiseaJourLigne
Case 38 ' Haut.
MSHFlexGrid.SetFocus: DoEvents
Edt.Visible = False
MiseaJourLigne
If MSHFlexGrid.Row > MSHFlexGrid.FixedRows Then
MSHFlexGrid.Row = MSHFlexGrid.Row - 1
End If
Case 40 ' Bas.
MSHFlexGrid.SetFocus: DoEvents
Edt.Visible = False
MiseaJourLigne
If MSHFlexGrid.Row < MSHFlexGrid.Rows - 1 Then
MSHFlexGrid.Row = MSHFlexGrid.Row + 1
End If
Case 39 ' droit.
' MSHFlexGrid.SetFocus: DoEvents
' If MSHFlexGrid.Col < MSHFlexGrid.Cols Then
' MSHFlexGrid.Col = MSHFlexGrid.Col + 1
' End If
' Edt.Visible = False
' MiseAJourLigne
' Case 37 ' Gauche.
' MiseAJourLigne
' MSHFlexGrid.SetFocus: DoEvents
' If MSHFlexGrid.col > MSHFlexGrid.FixedCols - 1 Then
' MSHFlexGrid.col = MSHFlexGrid.col - 1
' End If
End Select
End Sub

Sub MSHFlexGridEdit(MSHFlexGrid As Control, Edt As Control, KeyAscii As Integer)
' Utilise le caractère qui a été tapé.
Select Case KeyAscii
' Un espace signifie "modifier le texte en cours".
Case 0 To 32
Edt = Trim(MSHFlexGrid)
If Len(Edt) < 1 Then

Edt = Grid.Text
End If

Edt.SelStart = 1000
' Tout autre élément signifie "remplacer le ' texte en cours".
Case Else
Edt = Chr(KeyAscii)
Edt.SelStart = 1
End Select
' Affiche Edt au bon endroit.
Edt.Move MSHFlexGrid.Left + MSHFlexGrid.CellLeft, MSHFlexGrid.Top + MSHFlexGrid.CellTop, 
					_MSHFlexGrid.CellWidth - 8, MSHFlexGrid.CellHeight - 8
Edt.ForeColor = ROUGE
Edt.Visible = True
' Et laisse l'opération s'effectuer.
Edt.SetFocus
End Sub

Public Sub MiseaJourLigne()
'Met à jour la grid

Grid.text=Txtedit.text
End sub

'DataGrid' de VB 2003

Contrôle à éviter: utiliser 'DataGridView' à partir de VB 2005. C'est un des contrôles fournit avec VB.Net 2003 les plus puissant. Il est très adapté pour faire une liaison avec une base de données, mais pour l'utiliser simplement, dur, dur!!

Il est composé de lignes et de colonnes:


Aspect du contrôle 'DataGrid'

Mettre un 'DataGrid' dans le formulaire en cours en allant le chercher dans la boite à outils.

On peut modifier l'aspect du DataGrid1
  • dans la fenêtre de propriété les propriétés
  • en utilisant la mise en forme automatique (lien en bas de la fenêtre de propriétés.)
Pour travailler avec un DataGrid, on peut:
  • écrire directement dedans
  • créer un DataSet (un DataSet c'est un objet qui a la structure d'une base de données mais en local, il comporte des lignes , des colonnes.. ).Ce DataSet sera ensuite lié au DataGrid par DataGrid1.DataSource= MonDataSet. Toute modification du Dataset sera ensuite répercutée automatiquement sur le DataGrid. Et toute modification du DataGrid sera répercutée sur le DataSet.

Comment modifier le texte d'une cellule?

Pour modifier une cellule du Datagrid, il faut modifier le DataSet (pas le DataGrd)

MonDataSet.Tables(0).Rows (0) (1)= "Montexte" '0 et 1 sont respectivement le numéro de ligne et de colonne. 

Comment lire le texte d'une cellule?

Lire ligne 1, colonne 1, l'afficher dans une TextBox.

TextBox1.Text = CType(DataGrid1(1, 1), String)

DataGrid1(1, 1) = TextBox1.Text

Comment sélectionner une ligne?

Il faut taper

DataGrid1.Select(noligne) 'ligne est en bleue
DataGrid1.CurrentRowIndex = noLigne'selectionne vraiment

Comment cacher une colonne?

MonDataSet.Tables["Employees"].Columns["LastName"].ColumnMapping = MappingType.Hidden
 

Comment améliorer la rapidité de l'affichage ?

Si on fait un grand nombre de modifications dans un DataGrid, le DataGrid est remis à jour à chaque modification, c'est long et souvent l'affichage clignote.

Pour éviter cela, il faut désactiver l'affichage par BeginUpdate, afficher toutes les modifications puis réactiver l'affichage par EndUpdate: la mise à jour se fait en une fois très rapidement.

Private Sub BeginEndUpdate()
' MyDataGridColumnStyle is a class derived from DataGridColumnStyle.
Dim dgc As MyDataGridColumnStyle
Dim dgCols As GridColumnStylesCollection
dgCols = DataGrid1.TableStyles(0).GridColumnStyles
For Each dgc In dgCols
dgc.BeginUpdate
Next 

' Code to update not shown here.

For Each dgc In dgCols
dgc.EndUpdate
Next

End Sub
 


VIII-R. ProgressBar


VIII-R-1. ProgressBar de VB 2003

Une progressBar permet de voir la progression d'une opération.

On donne une valeur aux propriétés Minimum et Maximum, la propriété Value permet de positionner la barre.

Souvent on utilise la ProgressBar différemment:

On donne une valeur aux propriétés Minimum et Maximum, on donne un pas (Step); la méthode PerformStep()augmente d'un pas.


Exemple de Microsoft:

filenames() contient une liste de fichier à copier, à chaque fois qu'un fichier est copié, on avance la barre (qui se nomme MyBarre):

Private Sub CopyAvecProgressBar(ByVal ParamArray filenames As String())

' Minimum à 1 
MyBarre.Minimum = 1
' Maximum= nombre total de fichier à copier.
MyBarre.Maximum = filenames.Length
' On initialise la ProgressBar.
MyBarre.Value = 1
' On indique le pas.
MyBarre.Step = 1

' Boucle de copie.
Dim x As Integer
for x = 1 To filenames.Length - 1
' Copier un fichier.
If CopyFile(filenames(x - 1)) = True Then
' Si la copie est OK incrémenter la ProgressBar.
      MyBarre.PerformStep()
End If
Next x
End Sub


VIII-R-2. ProgressBar de VB 2005

Fonctionne de la même manière.

MyBarre.Style = ProgressBarStyle.blocks   'indique d'avancer par block

MyBarre.Style = ProgressBarStyle.continuous 'indique d'avancer progressivement
On peut aussi, quand on ne connaît pas la durée du processus, indiquer à la ProgressBar d'avancer de gauche à droite (comme lors de l'ouverture de Windows XP)

MyBarre.Style = ProgressBarStyle.Marquee 


VIII-S. Créer des contrôles par code

Dans le code, on peut créer soi-même de toutes pièces, des contrôles et leurs évènements.


VIII-S-1. Créer par code des contrôles

Dans le code d'une procédure, il est possible de créer de toute pièce un contrôle, mais attention, il faut tout faire!!

Créons le bouton.

Dim Button1 As New Button
Modifions ses propriétés

Me.Button1.Location = New System.Drawing.Point(56, 144)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(104, 24)

Me.Button1.TabIndex = 0

Me.Button1.Text = "Button1"
Le bouton existe mais il faut l'ajouter à la collection Controls de la fenêtre (Cette collection contient tous les contrôles contenus dans la fenêtre):

Me.Controls.Add(Button1)

VIII-S-2. Ajouter des évènements

Le bouton existe mais pour le moment,il ne gère pas les évènements.

Il faut inscrire le bouton dans une méthode de gestion d'évènements. En d'autres termes, Vb doit savoir quelle procédure évènement doit être déclenchée quand un évènement survient. Pour cela, il y a 2 méthodes:

* Déclarer la variable avec le mot clé WithEvents ce qui permet ensuite d'utiliser le Handles du contrôle dans la déclaration d'une Sub:

Déclaration dans la partie déclaration du module(en haut) (WithEvents n'est pas accepté dans une procédure):

 Private WithEvents Button1 As  New Button
Remarque Button1 est accessible dans la totalité du module .

Puis écrire la sub évènement.

Sub OnClique ( sender As Object, EvArg As EventArgs) Handles Button1.Click

End Sub 
Ainsi VB sait que pour l'évènement Button1.Click, il faut déclencher la Sub OnClique.

Si on fait: Private WithEvents Button1 As Button (sans New) dans la partie déclaration puis DIM Button1 As New Button dans une procédure, la Sub OnClique ne fonctionne pas!!

C'est un problème de 'visibilité' donc bien faire Private WithEvents Button1 As New Button

Remarque: il pourrait y avoir plusieurs Handles sur une même sub, donc des évènements différents sur des objets différents déclenchant la même procédure.

* Utiliser AddHandler

Déclaration (possible dans une procédure):

 Dim Button1 As New Button
Puis écrire la gestion de l'évènement.( L'évènement Button1.click doit déclencher la procédure dont l'adresse est BouttonClique)

AddHandler Button1.Click, AddressOf  BouttonClique
(ne pas oublier la virgule avant AddressOf)

Enfin on écrit la sub qui 'récupère ' l'évènement:

Private Sub BouttonClique (sender As Object, evArgs As EventArgs)

End Sub 
Ainsi VB sait que pour un évènement du Button1 , il faut déclencher la Sub ButtonClique

Exemple avec AddHandler:

Créons un TextBox nommé TB et une procédure déclenchée par KeyUp de ce TextBox:

Dans une procédure (Button1_Click par exemple): Je crée un TextBox nommé TB, je le positionne, je mets dedans le texte 'ici une textbox'. Je l'ajoute aux Contrôles du formulaire.

Grâce à 'AddHandler', je lie l'évènement Keyup de cet objet TB à la sub que j'ai crée :TextboxKeyup.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim TB As New System.Windows.Forms.TextBox

    TB.Location = New System.Drawing.Point(2, 2)

    TB.Text = "ici une textBox"

    Me.Controls.Add(TB)

    AddHandler TB.Keyup, AddressOf TextboxKeyup.

End sub

 

Sub TextboxKeyup.(ByVal sender As Object, ByVal e As KeyEventArgs)

...

End Sub

Si je crée un autre bouton TB2, j'ajoute de la même manière AddHandler TB2.Click, AddressOf TextboxKeyup2, ainsi chaque évènement de chaque contrôle à ses propres routines évènement et en cliquant sur le bouton TB2 on déclenche bien TextboxKeyup2

Attention, la procédure TextboxKeyup doit recevoir impérativement les bons paramètres: un objet et un KeyEventArgs car ce sont les paramètres retournés par un KeyUp.

Autre exemple avec AddHandler mais avec 2 boutons:

Il est possible de créer plusieurs contrôles ayant la même procédure évènement:

Exemple: Créons 2 boutons (BT1 et BT2) déclenchant une seule et même procédures (BoutonClique).

Dans ce cas, comment savoir sur quel bouton l'utilisateur à cliqué ?

En tête du module déclarons les boutons (Ils sont public):

Public BT1 As New System.Windows.Forms.Button

Public BT2 As New System.Windows.Forms.Button
Indiquons dans form_load par exemple la routine évènement commune (BoutonClique) grâce a AddHandler.

Form_Load

    BT1.Location = New System.Drawing.Point(2, 2)

    BT1.Text = "Bouton 1"

    Me.Controls.Add(BT1)

    BT2.Location = New System.Drawing.Point(100, 100)

    BT2.Text = "Bouton 2"

    Me.Controls.Add(BT2)

    AddHandler BT1.Click, AddressOf BoutonClique

    AddHandler BT2.Click, AddressOf BoutonClique

End Sub
Si c'est le bouton 1 qui a été cliqué, afficher "button1" dans une TextBox:

Sub BoutonClique(ByVal sender As Object, ByVal e As EventArgs)

    If sender Is BT1 Then

      TextBox1.Text = "button 1"

    ElseIf sender Is BT2 Then

      TextBox1.Text = "button 2"

    End If

End Sub
La ruse est que déterminer quel objet (quel bouton) à déclenché l'évènement, pour cela on utilise le premier paramètre, le sender;

If sender Is BT1 Then  ' Si le sender est le bouton1..
Noter bien:

- le mot clé Handles permet d'associer un événement à une procédure au moment de la conception.

Le concepteur sait qu'une procédure doit gérer les événements (il peut y en avoir plusieurs).

- le mot clé Addhandler permet d'associer un événement à une procédure au moment de l'exécution.

Ceci est utile dans un cadre producteur-consommateur d'événements. Un objet produit un événement qui doit informer d'autres objets; au cours de l'exécution on crée l'association entre l'évènement et une procédure.

Remarque importante:

Les Handler ne sont en fait libérés qu'au déchargement complet du programme (application.exit) et non à la fermeture de la fenêtre et des objets contenus dans celle-ci... Aussi , si vous ouvrez plusieurs fois un même formulaire possédant AddHandler sur un bouton, cela créera à chaque fois un Handler qui s'ajoute aux précédents et l'évènement se déclenchera plusieurs fois lors de l'appuie du bouton!!

Il faut donc utiliser RemoveHandler pour libérer le Handler. L'instruction s'utilise de la même façon que le AddHandler ! (reprendre les lignes d'ajout du handler et remplacer AddHandler par RemoveHandler) .



VIII-S-3. Menu par code

Double-cliquez sur le composant ContextMenu dans la Boîte à outils pour l'ajouter sur le formulaire: Cela crée un ContextMenu1

Par code, on va le vider, puis ajouter des items (lignes) au menu, on indique le texte de l'item mais aussi quelle routine déclencher lorsque l'utilisateur clique sur le menu contextuel:

' Vide le  context menu.
ContextMenu1.MenuItems.Clear()
 

' Ajoute une ligne 'Checked'.
ContextMenu1.MenuItems.Add("Ouvrir", New System.EventHandler(AddressOf Me.Ouvrir_Click))
 

' Ajoute une ligne 'Checked

ContextMenu1.MenuItems.Add("Fermer", New System.EventHandler(AddressOf Me.Fermer_Click))
 

' Test si le contrôle en cours est CheckBox, si oui ajout d'un item "Contrôler".
If ContextMenu1.SourceControl Is CheckBox1 Then
ContextMenu1.MenuItems.Add("Contrôler", New System.EventHandler(AddressOf Me.Controler_Click))
End If
 
Bien sur, il faut écrire les Sub Ouvrir_Click() Fermer_Click Controler_Click.

En fonctionnement, l'utilisateur Clique 'droit' sur un contrôle, le menu contextuel s'ouvre, il clique sur 'Ouvrir' ce qui exécute la routine Ouvrir_Click.




VIII-T. Mise à jour et vitesse de l'affichage

Mise à jour de l'affichage:

La mise à jour de l'affichage d'un Label (comme les autres contrôles d'ailleurs) est effectuée en fin de Sub:

Si on écrit:

Dim i As Integer

For i = 0 To 100

    Label1.Text = i.ToString

Next i
La variable i prend les valeurs 1 à 100, mais à l'affichage rien ne se passe pendant la boucle, VB affiche uniquement 100 à la fin; si on désire voir les chiffres défiler avec affichage de 0 puis 1 puis 2... il faut rafraîchir l'affichage à chaque boucle avec la méthode Refresh():

Dim i As Integer

For i = 0 To 100

    Label1.Text = i.ToString: Label1.Refresh()

Next i
Une alternative est de mettre un Application.DoEvents() qui donne à Windows le temps de traiter les messages et de rafraîchir l'affichage.


Clignotement et lenteur d'affichage: Lorsqu'on modifie plusieurs propriétés visuelles d'un contrôle ou qu'on affiche dans une grille par exemple de nombreuses modifications, l'affichage est mis à jour après chaque modification: c'est long et cela clignote.
Pour remédier à cela on suspend le moteur d'affichage, on fait toutes les modifications, on remet le moteur d'affichage. Les modifications visuelles sont instantanées.

 Me.SuspendLayout()
 ...
 ...
 ...
Me.ResumeLayout(False)

Pour eviter le clignonement et accélérer l'affichage, on peut aussi utiliser BeginUpdate et EndUpdate sur un controle ListBox.

listBox1.BeginUpdate()
     ' On ajoute 50 éléments.
     Dim x As Integer
     For x = 1 To 50
         listBox1.Items.Add("Item " & x.ToString())
     Next x
     ' 
listBox1.EndUpdate()
 

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