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

C++Builder Discussion :

Récupérer la couleur d'une celule d'un DBGrid


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut Récupérer la couleur d'une celule d'un DBGrid
    Bonjour a tous!

    Pour un affichage coloré de mon DBGrid, je colore les cellules pour mettre en avant certains champ (via OnDrawColumnCell ).

    Par contre j'aimerais savoir comment récupérer la couleur des cellules du DBGrid (pour faire un export)? La récupération des données est facile (une simple boucle while sur le TDataSet), mais pour la couleur des cellules je ne vois pas comment faire?

    Pour récupérer la n-ième colonne de la ligne en cours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGrid1->Columns->Items[n]->Field->DisplayText
    Avez-vous une idée pour récupérer le couleur de la cellule? (C'est peut être facile, mais je vois pas!)

    Merci d'avance pour votre aide!

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut sat83
    Je ne sais pas comment tu procede pour colorer tes cellules, mais le principe doit etre le meme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TColor couleur;
     
    // pour colorer
    StringGrid1->Canvas->Brush->Color = TColor(0xFFE0FF);
    // pour recuperer la couleur
    couleur = StringGrid1->Canvas->Brush->Color;
    pour une cellule il faut recuperer le brosse qui a paint la cellule

  3. #3
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Alors pour coloré les cellule de mon DBGrid dans le OnDrawColumnCell je fais par exemple :

    //coloration des lignes dont la valeur de "MonChamp" vaut 2 en vert + mise en italique (le DBGrid est relié à Query1)
    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
    16
    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
    {
     
      if( Query1->FieldByName("MonChamp")->AsInteger == 2 )
      {
         DBGrid1->Canvas->Brush->Color= clGreen ;
         DBGrid1->Canvas->Font->Style = TFontStyles()<< fsItalic ;
      }
     
      try
      {
         DBGrid1->DefaultDrawColumnCell( Rect, DataCol, Column, State );
      }
      catch (...) { /* DO NOTHING */ }
    }
    Par contre pour récupérer la couleur d'une cellule (en parcourant tout mon DBGrid) je n'y arrive pas.

    pour une cellule il faut recuperer le brosse qui a paint la cellule
    Comment recupère t'on une cellule d'un DBGrid?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Pour colorer la cellule selectionner on fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
    if(State.Contains(gdSelected))
    {
    // Les cellules sélectionnées sont en bleue
    StringGrid1->Canvas->Brush->Color = clNavy;
    StringGrid1->Canvas->Brush->Style = bsSolid;
    StringGrid1->Canvas->FillRect(Rect);
    }
    le reste du code
    }
    Je n'ai pas eut le temps de tester, maisc'est quand la cellule est selectionnee que je recuperais la couleur

  5. #5
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Je réexplique ce que je souhaiterais faire :

    J'ai un DBGrid contenant le résultat d'une requête (TQuery). Certaines lignes de ce DBGrid sont en couleurs (via OnDrawColumnCell voir exemple dans mon précedant post).

    Je suis en train de développer une fonction d'export vers Excel du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void DBGridToExcel( TDBGrid * aGrid, AnsiString aDestinationFileName )
    {
      TDataSet *ds ;
      ds = aGrid->DataSource->DataSet ;
      //[...]
      // Export vers EXCEL et sauvegarde du fichier
      //[...]
    }
    Ma fonction fonctionne parfaitement et exporte exactement le contenu de mon DBGrid vers Excel (titres des colonnes, tailles des colonnes, données, etc...)

    Ce que je souhaiterais faire, c'est également prendre en compte la Police (Font) et la couleur de fond de chaque cellule de mon DBGrid pour la reproduire dans Excel.

    La solution serait d'utiliser les même critères utilisés dans le OnDrawColumnCell de mon DBGrid et les mettre dans ma fonction d'Export. Le problème c'est que je souhaite faire un export "générique" d'un DBGrid quelconque, et donc je ne connais pas a l'avance les critères de coloration.

    Donc le problème : J'aimerais savoir comment récupérer la police et la couleur de fond des cellules d'un DBGrid dynamiquement (en gros j'ai un pointeur sur un DBGrid quelconque dont je ne connait rien, et je voudrait récupérer la police et la couleur de fond de chaque cellule).

    Je pense qu'il dois bien avoir un moyen, mais je commence à me demander si c'est possible

    .

  6. #6
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Salut sat83,

    Peut être un début de solution, même si je ne sais pour le moment comment optimiser les retours.

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AnsiString __fastcall GetPropCol(TDBGrid * aGrid, int idx_col, String propTarget);
    .cpp:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    AnsiString __fastcall TForm3::GetPropCol(TDBGrid * aGrid, int idx_col, String propTarget)
    {
    AnsiString result;
    		TColumn *pCol = aGrid->Columns->Items[idx_col];
    		//pCol->Font->Color = clGreen;
    			TPropInfo **propList;
    			int propcount = GetPropList(pCol, propList);
    			for (int i = 0;i < propcount; i ++)
    			{
    				if (propList[i]->Name.operator AnsiString()== propTarget)
    				{
    					try
    					{
    						result = VarToStr( GetPropValue(pCol->Font, propTarget) );
    					}
    					catch(EPropertyError &propError)
    					{
    						//catcher l'erreur sur propriété non dispo
    					}
    				}
    			}
    return result;
    }
    //-------------------------------------------------------
    void __fastcall TForm3::Button12Click(TObject *Sender)
    {
    ShowMessage( GetPropCol(DBGrid1, 0, "Color") );
    }
    En décommentant la ligne " //pCol->Font->Color = clGreen; ", et en changeant les valeurs, on peut voir que les résultats bougent, maintenant comment les interprêter pour les retransmettre a Excel, je ne sais pas pour le moment.

    Mais ... j'espère que tu pourras exploiter ce bout code...
    @+

Discussions similaires

  1. [XL-2010] Récupérer la couleur d'une case excel, pour l'appliquer lors d'une mise en forme
    Par interfector1st dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/06/2015, 00h24
  2. Récupérer les couleurs d'une image
    Par benthebest dans le forum Android
    Réponses: 2
    Dernier message: 06/02/2012, 23h33
  3. Récupérer la couleur d'une cellule et l'affecter à une autre
    Par Prue dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/08/2008, 17h04
  4. Comment donne une couleur a une ligne dans un DBGrid
    Par samy84s dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/09/2005, 23h22
  5. Récupérer la couleur d'une cellule excel par Delphi
    Par teamsebracing dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 05/06/2003, 14h50

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