TStringGrid accéder à une cellule à partir d'un autre [Résolu]

gebu34
Messages postés
119
Date d'inscription
samedi 9 décembre 2006
Dernière intervention
17 novembre 2009
- 3 mai 2007 à 12:14 - Dernière réponse : cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
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+
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 3 mai 2007 à 14:15
3
Merci
"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.

++

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 3 mai 2007 à 14:50
3
Merci
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.

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de florenth
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 3 mai 2007 à 12:41
0
Merci
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
Commenter la réponse de florenth
gebu34
Messages postés
119
Date d'inscription
samedi 9 décembre 2006
Dernière intervention
17 novembre 2009
- 3 mai 2007 à 13:04
0
Merci
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+
Commenter la réponse de gebu34
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 3 mai 2007 à 13:28
0
Merci
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
Commenter la réponse de florenth
gebu34
Messages postés
119
Date d'inscription
samedi 9 décembre 2006
Dernière intervention
17 novembre 2009
- 3 mai 2007 à 13:39
0
Merci
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+
Commenter la réponse de gebu34
gebu34
Messages postés
119
Date d'inscription
samedi 9 décembre 2006
Dernière intervention
17 novembre 2009
- 3 mai 2007 à 14:41
0
Merci
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+
Commenter la réponse de gebu34
cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 3 mai 2007 à 15:09
0
Merci
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.
Commenter la réponse de cs_Loda
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 3 mai 2007 à 15:56
0
Merci
@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
Commenter la réponse de florenth
cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 4 mai 2007 à 09:01
0
Merci
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.
Commenter la réponse de cs_Loda
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 4 mai 2007 à 10:43
0
Merci
"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
Commenter la réponse de florenth
cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 4 mai 2007 à 11:44
0
Merci
... 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.
Commenter la réponse de cs_Loda
florenth
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 4 mai 2007 à 11:48
0
Merci
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 !

++
Commenter la réponse de florenth
cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 4 mai 2007 à 15:55
0
Merci
Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.