TStringGrid accéder à une cellule à partir d'un autre

Résolu
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009 - 3 mai 2007 à 12:14
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 4 mai 2007 à 15:55
Bonjour à tous,
J'utilise un TstringGrid (un TDrawGrid devrait être identique) et je souhaiterais un cliquant sur
une cellule (par exemple cells(1,1)) pouvoir modifier la couleur de celle-ci, mais aussi la couleur
de deux autres cellules (exemple cells(1,5) et cells(1,8)) et en même temps leur goEditing.
Si je surcharge onDrawCell, il n'interviendra que sur la cellule cliquée.
Une idée ??
Une fonction TstringGrid.Cell(x,y).Brush.Color serait le Nirvana.......
Merci
A+

14 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 mai 2007 à 14:15
"Par contre ta deuxième réponse me gêne énormément."
=> lol. C'est pas moi qui décide !

Ce que tu peux faire, c'est ajouter [goEditing] dans le OnSelectCell que pour les cellules qui t'intéresse et le ré-enlever pour celles qui ne t'intéressent pas.

"je pense passer une variable pour indiquer la ligne à travailler"
si c'est une ligne bien spéciale que tu doit colorer alors c'est la meilleure solution. Met la alors dans la section "private" de ta fiche.

++
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 mai 2007 à 14:50
Logiquement, tu n'est pas obligé de "sauvegarder" puisque la valeur est tout de même stockée dans StringGrid.Cells[ACol, ARow] ...

Pour l'autre truc du goEditing, pou, fait des tests et si ça ne va pas, ouvre un autre sujet.
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 mai 2007 à 12:41
Salut,

Non, le OnDrawCell intervient pour toutes les cellules. Il faut juste demander dans le OnSelectCell de redessiner tout le contrôle (StringGrid.Invalidate).

Après, dans le OnDrawCell, tu sais comment ça se passe ...

Si tu as un soucis, postes le cod qui ne va pas.

A+
Flo
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
3 mai 2007 à 13:04
Justement, puisque le onDrawCell redessine toute les cellules, comment lui spécifier que c'est telle ou telle cellule qui est concernée par un changement......
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 mai 2007 à 13:28
Ah, ben c'est simple: l'évenement te dit quelle cellule il est en train de dessiner à l'aide des parmaètre ACol et ARow. Donc à toi de choisir quelle couleur prendre suivant la cellule en cours de dessin.

Voici un petit exemple (SG est mon StringGrid):
procedure TForm1.FormCreate(Sender: TObject);
begin
  SG.RowCount := 10;
  SG.ColCount := 6;
  SG.FixedCols := 0;
  SG.FixedRows := 0;
end;

procedure TForm1.SGSelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  SG.Invalidate;
end;

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  {>> Test de la cellule sélectionée }  if (ACol SG.Col) and (ARow SG.Row) then
  begin
    SG.Canvas.Brush.Color := $00AAAAFF;
    SG.Canvas.Rectangle(Rect);
  end

  {>> Colorie les 4 cellules autour de la sélection (en diagonale) }  else if (Abs(ACol - SG.Col) 1) and (Abs(Arow - SG.Row) 1) then
  begin
    SG.Canvas.Brush.Color := clSkyBlue;
    SG.Canvas.Rectangle(Rect);
  end;
end;

Avec ça, tu devrais t'en sortir.
Par contre, je ne comprends pas ta question avec le "goEditing". Cette option est valable pour tout le StringGrid donc tu ne peux pas le changer juste pour une cellule.

Allez, bonne chance,
Flo
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
3 mai 2007 à 13:39
Ok j'y vois plus clair, je pense passer une variable pour indiquer la ligne à travailler.
Par contre ta deuxième réponse me gêne énormément. Je pensais que l'on pouvait
bloquer toute la grille en édition, et n'activer que la cellule voulue au bon moment.
Je suppose que la fonction Enabled est identique ????......
A+
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
3 mai 2007 à 14:41
Merci pour tes lumières....
Je viens d'écrire le code celà fonctionne, seul soucis je ne voyais plus le texte des cellules, j'avais oublié de sauvegarder et de réécrire. Maintenant tout est bon.....
Je vais bricoler le goEditing......ca fera peut-être le prochain sujet.......
Merci
A+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
3 mai 2007 à 15:09
salut,

une autre solution, c'est d'ajouter un object perso (genre TCellProperty) a chaque cell (vu que ce'st des string list), puis de lire l'object lors du draw. mais c'est pas des plus rapide.
parcontre, cela te permet de n'ajouter l'object qu'au cell ayant des property (couleur, ..) différent des valeur par default.

A+

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 mai 2007 à 15:56
@Loda: ce ne sont pas vraiment des stringlist. En fait, c'est stocké de façon assez bizarre. Je sais pas si tu as le code source de la VCL mais je te conseille d'y faire un tour: ça vaut le coup
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
4 mai 2007 à 09:01
re,

@Florenth:
oui, effectivement. dsl. ce ne sont pas de tstringlist mais des TStringSparseList(TStrings). ce qui ne change pas grand choses, vu que les object asscocié au string sont impléemnter dans tstrings... bref. le point est que tu peux les utiliser comme des string list, cad avec un object associé a chaque cell.

A+

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 10:43
"vu que les object asscocié au string sont impléemnter dans tstrings"
Et justement, non ! Malgré que tu puisse *en théorie* ajouter des objets avec la méthode AddObject(), le type TStrings ne fait rien pour les conserver. Normal puisqu'il est abstrait.

Par contre, ce que tu peux faire, c'est déclarer une matrice de taille dynamique genre FCellsProps: array of array of TCellProperty que tu redimentionnes lorsque tu changes la taille de ton StringGrid.

Mais après, on s'éloigne du sujet.

A+
Flo
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
4 mai 2007 à 11:44
... dsl. c'est moi. tstrings est abraite pour les objects. (je devrai le savoir depuis le temps)

mais tu peux quand même associer des object au cell d'un tstringgrid:

VCL extract (grids.pas):

 { TStringGrid }
  { TStringGrid adds to TDrawGrid the ability to save a string and associated
    object (much like TListBox).  It also adds to the DefaultDrawing the drawing
    of the string associated with the current cell.
[...]
   
 Objects
        A ColCount by Rowcount array of TObject's associated with each cell.
        Object put into this array will *not* be destroyed automatically when
        the grid is destroyed.

Le coup des TCellProperty, je l'utilise dans un des mes code. J'avais penser aussi a un array separer, mais ca devient très chiant lors que tu deplacer des colonne. Alors que le objects de tstringgrid est déjà implémenté.

mais c'est vrai qu'on s'éloigne de plus en plus du sujet.

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 11:48
Ouh là là ...
On commence à s'embrouiller !
Désolé, je n'avais pas vu non plus quon pouvait assosier des objets aux cellules. Du coup, cette solution est à préférer. ça va me faire modifier quelques codes tout ça ...

Résultat: tout finit bien ! surtout que gebu34 a résolu son problème !

++
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
4 mai 2007 à 15:55
Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
Rejoignez-nous