V. Edition des cases, curseur▲
La grille produite par le projet est complète, mais ses cases ne sont pas modifiables.
Les coordonnées de la souris sont affichées, mais le curseur reste très discret ce qui peut constituer un handicap dans le cas de grilles de grandes dimensions.
L'apparition de couleurs sur le passage de la souris localiserait plus facilement sa position.
L'événement OnDrawCell va autoriser l'affichage de ce curseur particulier.
V-1. Options dimensions et édition▲
Les dimensions de la grille (hauteur, largeur, nombre de colonnes, nombre de lignes, largeur de colonne, hauteur de ligne) sont renseignées dans l'inspecteur d'objets.
Retourner sur les options : un clic sur le signe + développe les possibilités.
1. Cliquer sur goColSizing, passer la valeur à True (largeur des colonnes).
2. Cliquer sur goEditing, passer la valeur à True (les cases peuvent être modifiées).
3. Cliquer sur goRowSizing, passer la valeur à True (hauteur des lignes).
Appuyer sur F9 pour lancer l'exécution et vérifier que chaque case peut être éditée, que chaque colonne, chaque ligne peut être ajustée en dimensions : les interventions sont possibles à partir des ligne et colonne fixes uniquement.
Cliquer sur le petit carré rouge qui stoppe l'exécution et cliquer sur OK pour rendre la main à Lazarus.
V-2. L'événement OnDrawCell▲
Cliquer sur la grille, puis sur l'inspecteur d'objets, volet Événements et sur OnDrawCell.
Dans la zone de saisie, écrire DessinGrille et appuyer sur Entrer.
Dans l'éditeur de source, une nouvelle procédure apparaît, DessinGrille, avec ses divers paramètres.
aCol et aRow désignent respectivement la colonne courante et la ligne courante, aRect est la cellule située à leur intersection.
Cette procédure est exécutée lors de la création de la grille, puis à chaque instruction Repaint.
Par ailleurs, le programme connaît sCol et sLig, qui sont respectivement la colonne et la ligne survolées par la souris.
En conclusion, la condition (aCol=sCol) And (aRow=sLig) identifie la case survolée par la souris.
Pour colorer en jaune la case survolée par la souris, le code s'écrira donc ainsi :
procedure
TMonFormulaire.DessinGrille(Sender: TObject;
aCol, aRow: Integer
; aRect: TRect; aState: TGridDrawState);
begin
With
MaGrille.Canvas do
begin
If
((aCol=sCol) And
(aRow=sLig)) Then
Brush.Color:=clYellow;
FillRect(aRect);
end
;
end
;
Un appui sur F9 permet de vérifier que... le code ne fonctionne pas comme prévu.
En effet, deux compléments sont nécessaires :
1. Les variables sCol et sLig sont déclarées au sein d'une procédure, donc ignorées de la nouvelle.
Il est donc nécessaire de supprimer la première déclaration et de la reporter en tête du programme, avant le mot clé implementation :
var
MonFormulaire: TMonFormulaire;
sCol, sLig : Integer
;
implementation
{ TMonFormulaire }
2. La procédure est lancée au démarrage et il faut la relancer à chaque fois que la souris se déplace. Donc dans la procédure CoordSouris, il faut ajouter l'instruction Repaint.
Dès que la souris se déplace, l'événement est détecté et traité dans le cadre de la procédure CoordSouris. Il suffit d'ajouter l'instruction Repaint dans cette procédure pour que la mise à jour graphique soit déclenchée.
Un appui sur F9 montre que cette fois le but recherché est atteint.
V-3. Surlignement de la ligne, de la colonne▲
Pour mettre en valeur la totalité de la ligne survolée par la souris, il suffit de remplacer la condition If ((aCol=sCol) And (aRow=sLig)) par :
If (aRow=sLig)... --> toute la ligne est surlignée.
Si au contraire, c'est l'ensemble de la colonne que l'on désire surligner, la condition deviendra :
If (aCol=sCol)... --> toute la colonne est surlignée.
Pour mettre une couleur dans toutes les cellules, il suffit de la déclarer avec Brush.Color avant l'introduction des conditions.
La logique se présenterait ainsi :
Brush.Color:=Couleur0;
Si condition1, Brush.Color:=Couleur1;
Si condition2, Brush.Color:=Couleur2;
...
FillRect(aRect);
V-4. Horizontale et verticale▲
Les familiers d'AutoCad et autres logiciels de dessin souhaiteront peut-être retrouver leur environnement favori à l'intérieur d'une grille.
À la déclaration de sCol et sLig, ajouter cooX et cooY (avant implementation).
Les coordonnées X et Y de la souris sont déterminées au sein de la procédure CoordSouris : compléter son code par cooX:=X et cooY:=Y.
Pour les lignes rouges, le code s'écrira, en utilisant les méthodes MoveTo et LineTo :
procedure
TMonFormulaire.DessinGrille(Sender: TObject;
aCol, aRow: Integer
; aRect: TRect; aState: TGridDrawState);
begin
With
MaGrille.Canvas do
begin
Pen.Color:=clRed;
MoveTo(0
, cooY);
LineTo(MaGrille.Width, cooY);
MoveTo(cooX, 0
);
LineTo(cooX, MaGrille.Height);
end
;
end
;
V-5. Cadre▲
Il reste une autre possibilité pour mettre en valeur la case survolée par la souris, celle de l'entourer par un cadre.
Le tracé des lignes doit commencer par un angle qui aura pour coordonnées aRect.Left et aRect.Top (sommet supérieur gauche).
Le premier segment sera une horizontale de longueur égale à la largeur de la colonne moins deux pixels pour ne pas écraser la ligne frontière, soit
ColWidths[sCol]-2.
La première verticale aura pour hauteur la hauteur de la ligne moins deux pixels, soit
RowHeights[sLig]-2
et le tracé continuera jusqu'au point de départ.
Le code s'écrira donc ainsi, en reprenant les méthodes MoveTo et LineTo :
procedure
TMonFormulaire.DessinGrille(Sender: TObject;
aCol, aRow: Integer
; aRect: TRect; aState: TGridDrawState);
var
Largeur, Hauteur : Integer
;
begin
If
(aCol=sCol) And
(aRow=sLig) Then
With
MaGrille.Canvas do
begin
Pen.Color:=clRed;
Largeur:=MaGrille.ColWidths[aCol]-2
;
Hauteur:=MaGrille.RowHeights[aRow]-2
;
MoveTo(aRect.Left, aRect.Top);//angle supérieur gauche
LineTo(aRect.Left+Largeur, aRect.Top);//1ère horizontale
LineTo(aRect.Left+Largeur, aRect.Top+Hauteur);//1ère verticale
LineTo(aRect.Left, aRect.Top+Hauteur);//2ème horizontale
LineTo(aRect.Left, aRect.Top); //retour
end
;
end
;
Un appui sur F9 montre que l'objectif recherché est atteint.
V-6. Bilan▲
Le projet permet maintenant de créer une grille de données et de suivre avec précision la position de la souris en mettant en valeur la case survolée, ou la ligne, ou la colonne.
Il est également possible de constituer un curseur style AutoCad, ou simplement d'encadrer la case.
Dans le prochain chapitre, les différentes options de mise en valeur seront restructurées afin de rendre leur choix accessible à partir du formulaire.