Récupérer couleur / police dans une cellule de DBGrid

BernieNoel68 Messages postés 92 Date d'inscription vendredi 12 octobre 2007 Statut Membre Dernière intervention 20 novembre 2009 - 27 nov. 2008 à 11:29
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 28 nov. 2008 à 14:11
Bonjour a tous!

J'ai un petit problème pour récupérer la couleur et la police d'une cellule dans un DBGrid.

Je m'explique : pour rendre l'affichage plus agréable dans mon DBGrid je modifie la couleur et la police en fonction de la valeur d'un champ (via OnDrawColumnCell)

<code class="delphi_keyword1">-------------------------------------------------------------------------
procedure
TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const
Rect: TRect;
DataCol:
Integer
; Column: TColumn; State: TGridDrawState);
begin


If
TDBGrid(Sender).DataSource.DataSet.FieldByName(
'MonChamp
'
).AsInteger=
1
Then
    begin
//
alors
on
met
la
cellule
de
la
ligne
à
clRed et la police en clWhite

TDBGrid(Sender).Canvas.Brush.Color := clRed;
</code>
      TDBGrid(Sender).Canvas.Font.Color  := clWhite;

    end <code class="delphi_keyword1">else
    begin 
//
Sinon
on
met
la
cellule
à
clWhite et la police en clBlack

</code>
      TDBGrid(Sender).Canvas.Brush.Color := 
clWhite;

      TDBGrid(Sender).Canvas.Font.Color  := clBlack;

    end
;
<code class="delphi_comment2">//
On
applique
les
modifications.

TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
end
;
</code>
<code class="delphi_keyword1">-------------------------------------------------------------------------
</code>

Jusque là pas de problème tout fonctionne!

Pour un export, je souhaite récupérer la valeur des champs (de ce coté la pas de problème, j'arrive a exporter le contenu de mon DBGrid)
mais je souhaiterais récupérer également la couleur des cellules et la police!

J'ai essayé pas mal de truc, mais je n'arrive pas!

Avez vous une idée?

Merci d'avance!

8 réponses

beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
28 nov. 2008 à 00:23
salut,

comment parcours-tu les enregistrements pour l'export :

par un ?

while not Dataset.Eof do
begin
  fonction d'export du record;
  Next;
end;

dans ce cas, tu dois faire les mêmes test que dans l'évènement
DBGrid1DrawColumnCell



pour spécifier la couleur de la cellule et de la police.


Luc.






                
0
BernieNoel68 Messages postés 92 Date d'inscription vendredi 12 octobre 2007 Statut Membre Dernière intervention 20 novembre 2009 1
28 nov. 2008 à 08:37
Merci de ta reponse! En effet ca aurait été la solution logique, mais ca ne va pas dans mon cas malheureusement.

Le but est de faire une fonction générique d'export pour un DBGrid :

<code class="delphi_keyword1">procedure
TForm1.ExportDBGrid( aGrid: TDBGrid );
begin
</code>while not aGrid.DataSource.Dataset.Eof do
begin
  //fonction d'export du record;
  Next;
end;
end;


Donc je ne connait pas les critères de coloration du DBGrid et c'est bien là le problème! Il faudrait que je puisse les retrouver dynamiquement.

Si queluqu'un a une idée je suis preneur!
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 nov. 2008 à 12:01
bonjour,
une idée comme ça..
pourquoi ne pas boucler sur les records du dbgrid lui même ?

cantador
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
28 nov. 2008 à 12:07
je suis entrain de bosser la dessus, cantador:

procedure TFM_DOCFOU.ACT_OOExecute(Sender: TObject);
  procedure TestCells;
  var
    sl: TStringList;
    i_row, i_col: integer;
    f_colenter: TNotifyEvent;
  begin
    i_row := 0;
    i_col := 0;
    sl := TStringList.Create;
    try
      DGD_TRFDOC.DataSource.DataSet.First;
      f_colenter := DGD_TRFDOC.OnColEnter;
      DGD_TRFDOC.OnColEnter := DGD_TRFDOCColEnter;
      try
        while not DGD_TRFDOC.DataSource.DataSet.Eof do
        begin
          for i_col := 0 to DGD_TRFDOC.Columns.Count - 1 do
          begin
            DGD_TRFDOC.SelectedIndex := i_col;
            sl.Add(format('ligne %d colonne %d texte %s', [i_row, i_col, DGD_TRFDOC.SelectedField.AsString]));
            // je ne trouve pas de propriété ou de méthode renvoyant la cellule active, on trouve bien la colonne (selectedindex) mais pas la cellule
          end;
          DGD_TRFDOC.DataSource.DataSet.Next;
          Inc(i_row);
          i_col := 0;
        end;
      finally
        DGD_TRFDOC.OnColEnter := f_colenter;
      end;
      sl.SaveToFile('toto.txt');
    finally
      sl.Free;
    end;
  end;
begin
  SCB_TRI.ItemIndex := 3;
  SCB_TRIClick(Self);
  with DTB_TRFDOC do
  begin
      TestCells;
  end;
end;
0

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

Posez votre question
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
28 nov. 2008 à 12:27
j'ai regardé l'implémentation de TCustomGrid dans l'unité Grids.
Il n'y a pas de notion de cellule active dans les propriétés privées ou protégées.
Il faudrait réécrire un composant en y ajoutant cette notion, mais bonjour le boulot, et puis la routine de BernieNoel68 ne serait plus indépendante...

j'abandonne,
Luc.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 nov. 2008 à 13:32
et pourquoi pas un transtypage :

  TStringGrid(DBgrid1).Cells[ACol, ARow]

cantador
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
28 nov. 2008 à 13:45
property


Cells
[ACol, ARow: Integer]: string;

renvoie une chaîne de caractères et non pas une référence à une cellule

luc
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 nov. 2008 à 14:11
hé oui..le TDBGrid est trop pauvre en ce domaine...

avec Le TcxGrid on a en revanche :

procedure TFAffaire.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin

et
procedure TFAffaire.cxGrid1DBTableView1StylesGetContentStyle(
  Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
  AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
begin

cantador
0
Rejoignez-nous