Bonjour,
Encore et toujours un problème. Est il possible d'ajouter un bouton dans une cellule d'un StringGrid ? Si oui comment ?
Version imprimable
Bonjour,
Encore et toujours un problème. Est il possible d'ajouter un bouton dans une cellule d'un StringGrid ? Si oui comment ?
je crois, j'ai vu dans une autre discussion que tu peux utiliser le composant TAdvStringGrid que tu peux trouver ici lien
Perso, j'ai jamais testé, mais essaye, sinon regarde ce fil de discussion peut être que ça pourra t'aider http://www.developpez.net/forums/sho...d.php?t=132853
Bonne continuation
J'ai un autre problème avec le StringGrid. Je le rempli par une requete SQL puis ensuite par une condition j'aimerai changer la cellule de couleur. Je n'y arrive pas du tout.
voilà, ça devrait t'aider
http://www.developpez.net/forums/sho...d.php?t=132652
ou
http://www.developpez.net/forums/showthread.php?t=45514
Salut
C'est parce que tu n'as pas encore le réflexe de chercher dans la :faq: qui est une mine d'or.
Cette QR traite du sujet.
@+ Claudius
Si si je suis aller voir dans la FAQ mais ça ne résoud pas mon problème parce que dans la FAQ c'est à la création de la Grid qu'il fait le tout moi c'est une fois que c'est créé.
je ne sais pas si c'est abordé dans la FAQ cl@udius, mais il peut aussi utiliser le canvas avec l'instruction eput être non?
Code:
1
2 MaStringGrid.Canvas.Brush.Color := Tab_color[Ligne];
La dans ce que tu fais tu ne lui indique pas la cellule à changer.
Voici mon code si ça peu vous aidez, c'est à la place de sgQual.Cells[3,Ligne] := 'DEFAUT'; que je voudrais changer la cellule de couleur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 procedure TfrmQual.MiseJour; var Ligne, zLong, NbEnr: integer; j, k: integer; Def : boolean; begin dtmBanc.qQual.close; Ligne := 1; dtmBanc.qQual.Params[0].AsString := edDossier.Text; dtmBanc.qQual.Open; dtmBanc.qQual.First; NbEnr := dtmBanc.qQual.RecordCount; sgQual.RowCount := NbEnr + 1; sgQual.Cells[0,0] := 'N°Banc'; sgQual.Cells[1,0] := 'Nom Opérateur'; sgQual.Cells[2,0] := 'Date/Heure'; sgQual.Cells[3,0] := 'Détails'; sgQual.Cells[4,0] := 'Rapport'; while not dtmBanc.qQual.Eof do begin sgQual.Cells[0,Ligne] := dtmBanc.qQualNUMERO_BANC.AsString; dtmBanc.qLopera.Close; dtmBanc.qLopera.Params[0].AsString := dtmBanc.qQualNOM_OPERATEUR.AsString; dtmBanc.qLopera.Open; if not dtmBanc.qLopera.Eof then sgQual.Cells[1,Ligne] := dtmBanc.qLoperaOPERATEUR.AsString else sgQual.Cells[1,Ligne] := ''; if dtmBanc.qQualDEB_DATE_HEURE.AsString <> '' then begin sgQual.Cells[2,Ligne] := dtmBanc.qQualDEB_DATE_HEURE.AsString; sgQual.Cells[3,Ligne] := 'DEBUT'; end else begin sgQual.Cells[2,Ligne] := dtmBanc.qQualFIN_DATE_HEURE.AsString; sgQual.Cells[3,Ligne] := 'FIN'; sgQual.Cells[4,Ligne] := 'RAPPORT'; j := 1; k:= 26; Def := False; while (j <=20) and not (Def) do begin if dtmBanc.qQual.FieldByName('DB'+IntToStr(k)+'DEF'+IntToStr(j)).AsInteger <> 0 then Def := True; if (j = 20) and (k <> 28) then begin j := 1; k := k + 1; end; j := j + 1; end; if Def then sgQual.Cells[3,Ligne] := 'DEFAUT'; end; Ligne := Ligne + 1; dtmBanc.qQual.Next; end; end;
Attends je fais des teste et j'edite mon message
Non non, l'évènement OnDrawCell est appelé à chaque fois qu'une cellule a besoin d'être (re)dessinée.
Examine bien le code exemple de la FAQ, que tu dois adapter à ta situation.
Notamment ces lignes:
@+Code:
1
2
3
4
5
6 // ... Brush.Color := $FFE0FF; // Définit la couleur de la cellule // ... TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]); // Dessine le contenu de la cellule. // ...
regarde le bout de code suivantpar exemple:
ce code fait partie de la procedure onDrawCell comme te l'a montré cl@udiusCode:
1
2
3
4
5
6 if ((Acol=1) and (Arow=4)) or ((Acol=5) and (Arow=5)) then begin stringgrid1.canvas.brush.color:=clred; //choix couleur remplissage stringgrid1.canvas.fillrect(rect); //remplissage du rectangle end;
et normalement il fait bien ce que tu veux
et il modifie la cellule
Donc si je change la valeur à l'intérieur de ma cellule il va la redessiner c'est ça ?
Oui c'est ça :D
L'évènement OnDrawCell est appelé à chaque fois qu'une cellule est modifiée, ou lorsqu'elle doit être redessinée (parce qu'elle était recourverte par ex.).
Quand je fais ça, tout mon Grid est coloré en rouge.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TfrmQual.sgQualDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Def then begin With Sender As TStringGrid Do With Canvas Do Begin brush.color:=clred; //choix couleur remplissage fillrect(Rect); //remplissage du rectangle TextOut(Rect.Left,Rect.Top,sgQual.Cells[ACol,ARow]); end; end; end;
essaye avec le bout de code que je t'ai donné, ça fait exactement ce que tu demande, ça colorie la cellule.
en effet ça colorie mais pas la bonne.
ben là il faut que tu modifie les aArow et Acol de façon à c eque tu aies la bonne celulle, si tu veux la cellule 1, c'est à dire colonne 1 et ligne 1 comme coordonnées, tu met Acol=1 et Arow=1
oui mais c'est variable ce n'est jamais les memes collone puisque c'est une condition sur le résultat d'une requete sql.
Effectue ton test sur le contenu de la cellule, par exemple:
@+Code:
1
2 if Cells[ACol, ARow] = 'DEFAUT' then //...