IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Affecter une couleur à des enregistrements


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut Affecter une couleur à des enregistrements
    Bonjour,

    Dans un DBGrid, j'essaie d'associer une couleur à chaque enregistrement selon un autre champ, disons le champ catégorie.

    Dans une table access j'enregistre donc la catégorie et la couleur.

    Dans l'évènement OnDrawColumnCell je n'arrive pas à convertir le nombre de la couleur pour l'associer à ma catégorie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          Dbgrid1.Canvas.Font.color := clYellow;
          Dbgrid1.Canvas.Brush.Color := DM.tblEvenementsCOULEUR.Value ???
    Si quelqu'un peut m'aider d'avance merci!

    Bonne journée

    Cordialement, codial

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    d'abord il te faut le test sur le champ (sauf si tu l'as omis volontairement), puis je me demande sur le type du champs "DM.tblEvenementsCOULEUR" !!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    quel genre de test je peux faire puisqu'il faut associer les couleur à chaque catégorie ??

    DM.tblEvenementsCOULEUR.Value est un integer!

    Cordialement

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    couleur est une constante prédéfinie elle ne prend pas des valeurs arbitraires donc dans ta table la couleur doit être renseignée telle quelle, tu peux jeter un oeil dans l'aide delphi pour ça.
    le test se fait sur la catégorie, exemple
    si categorie = 1 alors couleur = jaune;
    si categorie = 2 alotrs couleur = bleu;
    et ainsi de suite.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Stocker une couleur sous forme d'entier ne pose pas de problème.
    Je pense que l'erreur se situe plus au niveau de Value qui renvoi un variant impossible à convertir en TColor.

    J'essayerais plutôt d'utiliser AsInteger à la place de Value ou au minimum de passer par un StrToInt(xxx.Value).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    merci pour vos réponse. Entre temps, j'ai écrit ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if DBPlanning.DataSource.DataSet.FieldByName('couleur').Value > 0 then
          DBPlanning.Canvas.Brush.color :=  tcolor('$' + IntToStr(DM.tblEvenementsCOULEUR.Value));
    Ce code repère bien les enregistrements concernés mais n'affecte pas la bonne couleur, à savoir dans mon exemple le jaune. De plus chaque champ à une couleur différente.
    J'ai essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tcolor('$' + IntToStr(DM.tblEvenementsCOULEUR.asInteger))
    mais celà me renvoie le même problème.

    pour Just-Soft
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    si categorie = 1 alors couleur = jaune;
    si categorie = 2 alotrs couleur = bleu;
    je ne peux pas car les catégories sont lues dans la table, aussi je ne peux les écrire en dur dans le code.

    Une idée pour modifier cette ligne?

    Cordialement, codial

  7. #7
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Et un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dbgrid1.Canvas.Brush.Color := DM.tblEvenementsCOULEUR.AsInteger
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonsoir sat83,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dbgrid1.Canvas.Brush.Color := DM.tblEvenementsCOULEUR.AsInteger
    effectivement celà fonctionne mais surligne en noir au lieu du jaune les enregistrements concernés????

    Il doit y avoir une autre astuce je pense !!! Mais laquelle ?

    Cordialement, codial

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    mais peux-tu nous dire la valeur de DM.tblEvenementsCOULEUR.AsInteger, si elle vaut zéro (0) alors c'est bien le noir.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Dans mon enregistrement il y a le nombre de la couleur et la catégorie.
    Dans mon DBGrid les bonnes lignes sont sélectionnées mais en noir.

    En revanche, j'ai testé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if DBPlanning.DataSource.DataSet.FieldByName('couleur').Value > 0 then
          DBPlanning.Canvas.Brush.Color := 65535;   //DM.tblEvenementsCOULEUR.AsInteger;
    et là, à l'ouverture du DBGrid, j'ai bien les bonnes lignes en jaunes.

    Je pense que mon problème vient de la conversion de DM.tblEvenementsCOULEUR.AsInteger; pour affecter la bonne couleur à gauche de ma ligne.

    Il me manque quelque chose..... Mais quoi ???

    Cordialement, codial

  11. #11
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Dans ce cas autant définir ton champ couleur dans la base de données comme entier pour ne pas passer par la conversion.
    En plus, met un showmessage pour savoir le contenu de ta variable à l'instant de l'exécution de la ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if DBPlanning.DataSource.DataSet.FieldByName('couleur').Value > 0 then
    DBPlanning.Canvas.Brush.Color := DM.tblEvenementsCOULEUR.AsInteger;
    ShowMessage(DM.tblEvenementsCOULEUR.AsInteger);
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Dans ma base le champ 'coiuleur' est déja un entier long sous la forme 65535

    J'ai déja fait un showmessage et il me renvoie bien 65535.

    Cordialement

  13. #13
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par codial Voir le message
    Bonjour,

    Dans ma base le champ 'coiuleur' est déja un entier long sous la forme 65535

    J'ai déja fait un showmessage et il me renvoie bien 65535.

    Cordialement
    Bizarre c'est le moins qu'on puisse dire. Une dernière chose, tu déclare une variable locale dans ta procédure que tu lui affecte la valeur du champs couleur puis tu la passe à ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cl : integer;
    ..
    cl := DM.tblEvenementsCOULEUR.AsInteger;
    ShowMessage(DM.tblEvenementsCOULEUR.AsInteger);
    if DBPlanning.DataSource.DataSet.FieldByName('couleur').Value > 0 then
    DBPlanning.Canvas.Brush.Color := cl;
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    tu as vu ce topique
    surtout
    // On applique les modifications.
    TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  15. #15
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    // On applique les modifications.
    TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
    mais pourquoi le cast ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    TColor étant une valeur Hexadécimale , cela vaudrait peut-être la chandelle d'essayer un formatage ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    A ce niveau là, il n'y a qu'une chose qui puisse être fausse:

    DBPlanning.DataSource.DataSet <> DM.tblEvenements

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Just-Soft, j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cl : integer;
    ..
    cl := DM.tblEvenementsCOULEUR.AsInteger;
    ShowMessage(DM.tblEvenementsCOULEUR.AsInteger);
    if DBPlanning.DataSource.DataSet.FieldByName('couleur').Value > 0 then
    DBPlanning.Canvas.Brush.Color := cl;
    mais celà revient au même, mes champs sont en noirs.

    Pour edam
    j'ai vu le topic et je sais faire car les couleurs sont dans le code, donc pas de problème.

    SergioMaster ta remarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TColor étant une valeur Hexadécimale , cela vaudrait peut-être la chandelle d'essayer un formatage ?
    Elle rejoint ce que je pense mais je ne trouve pas comment faire le formatage qui puisse être accepté par DBPlanning.Canvas.Brush.Color := !!!

    Cordialement, codial

  19. #19
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Un vieux code que j'ai utilisé il y a très longtemps pour colorier les ligne d'une grille suivant une valeur d'une colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    var Coul : tColor;
    begin
      if AppParams.ApplyColor  then
      begin
        Coul := ClWindow;
        with dsetSav, qryColorbyStatus do
        begin
            if FieldByName('DS_STATUS').AsString = 'N' then Coul := TColor(FieldByName('CL_N').AsInteger);
            if FieldByName('DS_STATUS').AsString = 'P' then Coul := TColor(FieldByName('CL_P').AsInteger);
         .....
        end;
        GrdSav.Canvas.brush.Color := Coul;
      end;
    End;
    Mes couleurs etant enregistrer sous format entier dans la base en castant en Integer via Integer(cbColorbox.Selected).
    Es ça marche.
    On progresse .....

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour Andry,

    Merci pour le code, j'essaie de l'adapter mais pourrait tu préciser les variables dsetSav, qryColorbyStatus et m'expliquer AppParams.ApplyColor que je n'ai pas apparemment.

    Cordialement, codial

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/12/2009, 13h44
  2. [Validator] affecter une couleur aux champs en erreur
    Par alexandre7 dans le forum Struts 1
    Réponses: 15
    Dernier message: 23/05/2009, 15h09
  3. Réponses: 2
    Dernier message: 30/03/2007, 12h55
  4. Réponses: 9
    Dernier message: 28/10/2005, 13h48
  5. [D7] affecter une couleur à un TLabel
    Par raoulmania dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/09/2005, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo