IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le StringGrid facile avec Lazarus


précédentsommairesuivant

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

Image non disponible

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 :

 
Sélectionnez
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;

Image non disponible

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 :

 
Sélectionnez
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.

Image non disponible

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.

Image non disponible

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.

Image non disponible

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 :

 
Sélectionnez
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;


Image non disponible

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 :

 
Sélectionnez
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.

Image non disponible

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.


précédentsommairesuivant

Copyright © 2010 Dimanche2003. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.