Tcolumns [Résolu]

Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
- 13 déc. 2012 à 14:07 - Dernière réponse :
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
- 14 déc. 2012 à 11:51
Bonjour,

Dans l'événement OnDrawColumnCell d'un DBGrid
j'effectue la coloration des lignes en fonction des valeurs contenu dans la 1ère colonne "CyDBadvG.Columns[0]"

Par contre si en runtime la colonne est déplacée, la colonne[0] ne correspond plus à celle que je veux.

Comment faire ceci :

DBgrid.Columns["index de la colonne dont fieldName ='MAcolonne']

autrement que par un boucle qui parcours toutes les colonnes pour trouver l'index de 'MaColonne' ?

Merci.
Jean
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
13 déc. 2012 à 15:42
3
Merci
ben voilà..

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  MyColor: Tcolor;

begin

  if gdSelected in State then
    TDBGrid(Sender).Canvas.Brush.Color := clGreen

  else

  begin

    if TDBGrid(Sender).DataSource.DataSet.FieldByName('MyColumn').Value = 1384 then

      TDBGrid(Sender).Canvas.Brush.Color := clLime
    else
      TDBGrid(Sender).Canvas.Brush.Color := MyColor;

  end;

  TDBGrid(Sender).DefaultDrawColumnCell(rect, datacol, column, state);

end;



testé avec table 'orders' de la démo..

cantador

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
14 déc. 2012 à 11:41
3
Merci
En fait, lorsque la DBGrid est dessinée, les enregistrements qui vont visualisés vont être parcourus en interne, sans que tu t' en rendes compte (pas de AfterScroll).
Donc, lorsque la DBGrid te renvoie l' événement OnDrawColumnCell, tu peux lire la valeur des champs de la table car le curseur est sur l' enregistrement qui est en train d' être peinds.

a+



Composants Cindy pour Delphi
Faites une donation.

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
13 déc. 2012 à 15:19
0
Merci
bonjour,

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  MyColor: Tcolor;
begin
  MyColor := DBGrid1.Canvas.Brush.Color;

  if Column.FieldName = 'MyColumn' then
    if (Column.Field.AsString = '1384') then
    begin
      DBGrid1.Canvas.Brush.Color := clGreen;
      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      DBGrid1.Canvas.Brush.Color := MyColor;
    end;
end;



bon ça colorise une case..

cantador
Commenter la réponse de cs_cantador
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
13 déc. 2012 à 21:06
0
Merci
Bonsoir Cantador,

Merci, j'ai testé cela marche impécable !

Mais je ne comprend pas pouquoi ??

OnDrawColumnCell est appelé pour peindre une Cell.

Mais pourquoi TDBGrid(Sender).DataSource.DataSet.FieldByName('MyColumn').Value = 1384 pointe sur la meme ligne que la Cellule à peindre alors que la Cellule n'est pas sélectionnée (pas le record en cours) ?

Jean
Commenter la réponse de jderf
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
13 déc. 2012 à 22:40
0
Merci
Bon j'ai beau relire l'aide, je ne vois pas cette notion de pointeur. Mais je supposes et je testerai que lors des événements OnCellClick et OnDrawDataCell c'est la même chose.
C'est d'ailleurs bien pratique.
Dans un TStringGrid OnDrawCell, le lien pour lire les cellules de la même ligne et clair puisqu'il y a le paramêtre Arow.

Bonne soirée à tous.

Jean
Commenter la réponse de jderf
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
13 déc. 2012 à 23:27
0
Merci
TDBGrid(Sender).DataSource.DataSet.FieldByName('MyColumn').Value = 1384;

on fige ici par l'intermédiaire du FieldName (nom du champ )la colonne qui va servir à tester la valeur..

1384, c'est le reste d'un test sur la table "orders".

tu peux même colorier une ligne sur deux (plus difficile à écrire..)

merci de cliquer sur "réponse acceptée" si
mes réponses te conviennent.

cantador
Commenter la réponse de cs_cantador
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
14 déc. 2012 à 09:02
0
Merci
Bonjour Cantador,

Oui, cela je l'avais bien compris, mais pour moi DataSet.FieldByName('MyColumn').Value remonte la valeur du record en cours dans le DataSet et ne correspond pas forcement à la ligne de la Cellule a repeindre.

Certainement un truc qui m'échappe encore dans le fonctionnement du DBgrid

Merci

Jean
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
14 déc. 2012 à 10:23
0
Merci
"DataSet.FieldByName('MyColumn').Value remonte la valeur du record en cours dans le DataSet et ne correspond pas forcement à la ligne de la Cellule a repeindre"

À ton avis, comment le DBGrid arrive à visualiser la valeur des champs de plusieurs enregistrements alors que le curseur pointe sur un seul enregistrement?

A+

Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
14 déc. 2012 à 11:15
0
Merci
Bonjour Mauricio,

Oui, mais ce qui me gène c'est qu'en ecrivant cela
TDBGrid(Sender).DataSource.DataSet.FieldByName('MyColumn').Value il n'y a aucune notion de ligne

Comment savoir sur qu'il ligne il est ?
J'ai pas vu un truc du genre DBGrid.Arow ou DBGrid.CurrentRow

Bon c'est pas bien grave maintenant que je sais qu'il se débrouille. Je résonne sans doute trop en matrice comme dans une StringGrid.

Bonne journée.

Jean
Commenter la réponse de jderf
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
14 déc. 2012 à 11:26
0
Merci
TDBGrid(Sender).DataSource.DataSet.FieldByName('MyColumn').Value

cette instruction comme te l'indique Mauricio, traite TOUTES les valeurs
des enregistrements situés dans MyColumn.

il n'y a donc pas besoin de notion de Row ici.

si tu veux des Row et des Col, choisis le TcxGrid ou peut-être
les composants Grid développés justement par Mauricio.


cantador
Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
14 déc. 2012 à 11:49
0
Merci
quoique..................

si on inhibe :

{ if gdSelected in State then
TDBGrid(Sender).Canvas.Brush.Color := MyColor
else }

ça marche quand même
et bien sûr si on déplace la colonne aussi


cantador
Commenter la réponse de cs_cantador
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
14 déc. 2012 à 11:51
0
Merci
Merci Mauricio,

C'est bien que j'en avais déduit vu que le code de Cantador fonctionné. Dans l'aide de Delphi, je n'avais pas compris cette notion. Le fait que tu l'écrive clairement me rassure sur ce mécanisme et j'ai donc pas a m'en soucier. J'ai appris une chose de plus.

Merci à tous les deux pour vos précision.
Jean
Commenter la réponse de jderf

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.