Cours VB.NETDate 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:
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
|
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:
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)
|
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)
|
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
|
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
If colorDialog1. ShowDialog () = DialogResult. OK Then
Texte. ForeColor = colorDialog1. Color
End If
End Sub
|
On peut modifier la boite à notre gout avant de l'ouvrir:
colorDialog1. SolidColorOnly = True
colorDialog1. AllowFullOpen = True
colorDialog1. FullOpen = True
colorDialog1. Color = Color. Red
|
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).
Private WithEvents MyDataGridView As New DataGridView
Me. Controls . Add (MyDataGridView)
MyDataGridView. ColumnCount = 5
With MyDataGridView. ColumnHeadersDefaultCellStyle
. BackColor = Color. Navy
. ForeColor = Color. White
. Font = New Font (MyDataGridView. Font , FontStyle. Bold )
End With
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
. 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
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
. Add (row0)
. Add (row1)
. Add (row2)
. Add (row3)
. Add (row4)
. Add (row5)
. Add (row6)
End With
With Me. MyDataGridView
. Columns (0). DisplayIndex = 3
. Columns (1). DisplayIndex = 4
. Columns (2). DisplayIndex = 0
. Columns (3). DisplayIndex = 1
. Columns (4). DisplayIndex = 2
End With
Me. MyDataGridView . Rows . Add ()
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
Me. MyDataGridView . Rows . Clear ()
|
Exemple 2: On crée la grid avec des lignes et des colonnes puis on modifie les cellules.
Grid. RowCount = 50
Grid. ColumnCount = 5
With Me. Grid
. RowsDefaultCellStyle . BackColor = Color. White
. AlternatingRowsDefaultCellStyle . BackColor = Color. AliceBlue
. MultiSelect = False
. EditMode = DataGridViewEditMode. EditProgrammatically
End With
With Grid. ColumnHeadersDefaultCellStyle
. BackColor = Color. Blue
. ForeColor = Color. Blue
. Font = New Font (Grid. Font , FontStyle. Bold )
End With
With Grid
. AllowUserToAddRows = False
. AllowUserToDeleteRows = False
. AllowUserToOrderColumns = False
. AllowUserToResizeColumns = False
. AllowUserToResizeRows = False
. Columns (0). Name = " Date "
. Columns (1). Name = " Libellé "
. Columns (2). Name = " Montant "
. Columns (3). Name = " Origine "
. Columns (4). Name = " Cochée "
. RowHeadersVisible = False
. Columns (2). Width = 30
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 "
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
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
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 " )
Grid. AutoResizeColumns ()
Grid. Rows (1). Cells (1). Selected = True
Dim x As Integer = Grid. CurrentCellAddress . X
Dim y As Integer = Grid. CurrentCellAddress . Y
Grid. Rows . Clear ()
Grid. RowCount = 50
Grid. ColumnCount = 5
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
Grid. Col = 3
Grid. CellFontBold = True
Grid. CellForeColor = Color. Red
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
Set Grid. CellPicture = ImageCoche. Picture
|
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
MSHFlexGridEdit Grid, Txtedit, 32
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)
Select Case KeyCode
Case 27
Edt. Visible = False
MSHFlexGrid. SetFocus
Case 13
Edt. Visible = False
MSHFlexGrid. SetFocus
MiseaJourLigne
Case 38
MSHFlexGrid. SetFocus : DoEvents
Edt. Visible = False
MiseaJourLigne
If MSHFlexGrid. Row > MSHFlexGrid. FixedRows Then
MSHFlexGrid. Row = MSHFlexGrid. Row - 1
End If
Case 40
MSHFlexGrid. SetFocus : DoEvents
Edt. Visible = False
MiseaJourLigne
If MSHFlexGrid. Row < MSHFlexGrid. Rows - 1 Then
MSHFlexGrid. Row = MSHFlexGrid. Row + 1
End If
Case 39
End Select
End Sub
|
Sub MSHFlexGridEdit (MSHFlexGrid As Control, Edt As Control, KeyAscii As Integer)
Select Case KeyAscii
Case 0 To 32
Edt = Trim (MSHFlexGrid)
If Len (Edt) < 1 Then
Edt = Grid. Text
End If
Edt. SelStart = 1000
Case Else
Edt = Chr (KeyAscii)
Edt. SelStart = 1
End Select
Edt. Move MSHFlexGrid. Left + MSHFlexGrid. CellLeft , MSHFlexGrid. Top + MSHFlexGrid. CellTop ,
_MSHFlexGrid. CellWidth - 8, MSHFlexGrid. CellHeight - 8
Edt. ForeColor = ROUGE
Edt. Visible = True
Edt. SetFocus
End Sub
|
Public Sub MiseaJourLigne ()
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 "
|
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)
DataGrid1. CurrentRowIndex = noLigne
|
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 ()
Dim dgc As MyDataGridColumnStyle
Dim dgCols As GridColumnStylesCollection
dgCols = DataGrid1. TableStyles (0). GridColumnStyles
For Each dgc In dgCols
dgc. BeginUpdate
Next
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 ())
MyBarre. Minimum = 1
MyBarre. Maximum = filenames. Length
MyBarre. Value = 1
MyBarre. Step = 1
Dim x As Integer
for x = 1 To filenames. Length - 1
If CopyFile (filenames (x - 1)) = True Then
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
MyBarre. Style = ProgressBarStyle. continuous
|
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):
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;
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:
ContextMenu1. MenuItems . Clear ()
ContextMenu1. MenuItems . Add (" Ouvrir " , New System. EventHandler (AddressOf Me. Ouvrir_Click ))
ContextMenu1. MenuItems . Add (" Fermer " , New System. EventHandler (AddressOf Me. Fermer_Click ))
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 ()
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.
|