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

 Delphi Discussion :

Dessiner case à cocher dans DBGrid


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Dessiner case à cocher dans DBGrid
    Bonjour à tous,

    Je cherche à dessiner une case à cocher dans une colonne d'un DBGrid. J'ai suivi ce tutoriel. Je l'avais déjà utilisé par le passé.

    Mon DBGrid contient 3 colonnes, il est lié à un DataSource ds_select lui même relié à une requête q_select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      q_select.Close; q_select.SQL.Clear;
      q_select.SQL.Add('select distinct colxcol, cdexent from ENTXRES, COLXRES where NUMXENT=NUMXCOL');
      q_select.SQL.Add('and CODXENT =:cod');
      q_select.SQL.Add('and TOUXENT =:tou');
      q_select.SQL.Add('and MARXENT =:mar');
      q_select.SQL.Add('and (refxcol is not null) group by cdexent, colxcol');
      q_select.ParamByName('cod').AsString := x_cli;
      q_select.ParamByName('tou').AsString := x_tournee;
      q_select.ParamByName('mar').AsString := x_transport;
    Cette requête me rempli donc les deux premières colonnes de mon DBGrid. Je veux que la troisième comporte donc ma case à cocher.

    J'ai bien créé ma procédure sur le DrawColumnCell :

    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
    procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
     
      // On ne prend en compte que la colonne REGROUPER
    if sameText(Column.FieldName, 'REGROUPER') then
      begin
        { On efface la cellule }
        DBGrid_select.Canvas.FillRect(Rect);
        { Cochée ou Pas ?}
     
        dmImages.imgCheck.Draw(DBGrid_select.Canvas,
            Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2),
            Rect.Top,
            Ord(Column.Field.AsString = '0')              //au lieu de Ord(monDB.Fields[3].AsString = '0')   sinon me coche toutes les cases sur la recherche
          );
      end
      { si column ne correspond pas à une case à cocher, }
      { on ne s'occupe pas du dessin de la cellule, on }
      { transmet donc à DefaultDrawColumnCell }
      else
      begin
        DBGrid_select.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
    end;
    Et j'ai mon datamodule avec mon imgList (imgCheck) qui comporte deux images une non cochée et une cochée.

    Mais vu que ma troisième colonne n'est pas liée à ma requête comment dois-je faire pour la remplir avec ma case à cocher vide ?

    Je vous met en pièce jointe mon écran affichage. La case à cocher est à mettre dans le tableau à droite troisième colonne.

    Merci d'avance
    Images attachées Images attachées  
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Il faut ajouter un champ calculé à ta requête q_select de type "boolean".
    Tu pourras relier ce champ à ta case à cocher. Voir également l'événement OnCalcFields de q_select qui te permet d'initialiser le ou les champs calculés.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par Pascal Jankowski Voir le message
    Il faut ajouter un champ calculé à ta requête q_select de type "boolean".
    Tu pourras relier ce champ à ta case à cocher. Voir également l'événement OnCalcFields de q_select qui te permet d'initialiser le ou les champs calculés.
    Comment ça un champ calculé ? (j'ai cherché sur google mon ami mais ça ne parle que de Access)
    Parce que dans mon image List la valeur 0 correspond à une case décochée et la valeur 1 à un champ coché.
    Windows XP
    Delphi 7

    WinDev Mobile 17

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Q_Select est bien un composant déposé sur ta fiche ?
    Si c’est le cas, alors double click dessus ou click droit et sélectionne « Nouveau champ ».

    A partir de ce nouveau dialogue tu peux créer ton champ calculé.
    Tu as également la possibilité d’ajouter les champs de données de ta requête.

    C'est une petite couche de persistance offerte avec les composants de type TQuery. Tu peux ensuite vérifier que ces nouveau champs sont déclarés dans le code source de ton unité.

    Pour accéder à OnCalcField, tu vas simplement dans l’inspecteur d’objets pour ton Q_Select dans la section événement.

    [Edit]
    En tapant "Delphi champ calculé" dans Google, il y a de nombreuses références.

    par exemple : http://docwiki.embarcadero.com/RADSt...p_calcul%C3%A9
    [/Edit]
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Au pire, tu bidouille ton SQL pour fournir une valeur par défaut à REGROUPER et faire en sorte que cette colonne existe sans effort !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('select distinct colxcol, cdexent, 0 AS REGROUPER from ENTXRES, COLXRES where NUMXENT=NUMXCOL');
    Cela fonctionne sur MySQL ou Sybase de fournir ce genre de colonne bidon, à voir sur ton sgbd (oracle ?)

    REGROUPER sera la colonne où tu dessineras la CheckBox !
    Il pourra accueillir la modification (ne pas oublier Edit\Post)
    D'ailleurs, mieux vaut un mode en cache, ou Post ne modifie qu'en mémoire !
    Au besoin le TClientDataSet fournira ce cache si tu Query n'en fourni pas !

    Si tu veux dessiner un CheckBox du thème voir DrawFrameControl :
    dbgrid + checkbox pour multi selection
    Gestion CheckBox TCRDBGrid

    Il y avait une bidouille pour créer un champ même à partir d'un SQL !
    En modifiant DefaultFields à false, et en gérant soit même la création des colonnes AVANT de faire le OPEN du SQL
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Au pire, tu bidouille ton SQL

    Code :
    Sélectionner tout - Visualiser dans une fenêtre à part

    ('select distinct colxcol, cdexent, 0 AS ChampPourSelection from ENTXRES, COLXRES where NUMXENT=NUMXCOL');

    ChampPourSelection sera la colonne où tu dessineras la CheckBox !
    Il pourra accueillir la modification (ne pas oublier Edit\Post)
    D'ailleurs, mieux vaut un mode en cache, ou Post ne modifie qu'en mémoire !
    Au besoin le TClientDataSet fournira ce cache si tu Query n'en fourni pas !
    Alors j'ai mis la requête comme tu m'as dit mais ça ne change rien je n'ai pas de case à cocher qui apparait ... Est ce que j'aurais oublié quelque chose ??

    Q_Select est bien un composant déposé sur ta fiche ?
    Si c’est le cas, alors double click dessus ou click droit et sélectionne « Nouveau champ ».

    A partir de ce nouveau dialogue tu peux créer ton champ calculé.
    Tu as également la possibilité d’ajouter les champs de données de ta requête.

    C'est une petite couche de persistance offerte avec les composants de type TQuery. Tu peux ensuite vérifier que ces nouveau champs sont déclarés dans le code source de ton unité.

    Pour accéder à OnCalcField, tu vas simplement dans l’inspecteur d’objets pour ton Q_Select dans la section événement.
    Oui c'est un composant déposé sur ma fiche.
    Oui ok mais je vois pas où tu veux en venir, que dois je mettre dans le OnCalcField ? Je vais regarder ton lien...


    EDIT :

    J'ai mis ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFS42.q_selectCalcFields(DataSet: TDataSet);
    begin
      DBGrid_select.Fields[2].AsInteger := 0;
    end;
    après avoir créer mon champ... mais cela me fait une erreur de violation d'accès...

    Je pensais passer mon champ à 1 au moment où l'utilisateur cocherait la case (si j'arrive à voir cette case à cocher..bien sûr)
    Windows XP
    Delphi 7

    WinDev Mobile 17

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Alors j'ai mis la requête comme tu m'as dit mais ça ne change rien je n'ai pas de case à cocher qui apparait ... Est ce que j'aurais oublié quelque chose ??
    Si tu as défini tes champs en DesignTime comme le propose Pascal Jankowski, cela annule la méthode par bidouille SQL

    C'est deux méthodes opposées !

    Ton champ ChampPourSelection ou REGROUPER (note que j'avais changé le nom en relisant tes réponses) affichera un 0 partout
    A toi dans le OnDrawColumnCell de dessiner via dmImages ou DrawFrameControl selon le contenu de REGROUPER, il sera accessible en AsInteger (mieux que AsString)

    Consulte cet exemple avec un TClientDataSet en C++Builder, ne soit pas effrayé, remplace { } par begin end et -> par . et tu auras presque un code Delphi

    Relit ton sujet Problème de déclaration de 2011 où l'on avait amélioré ta fonction AfficheCaseSav
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si tu as défini tes champs en DesignTime comme le propose Pascal Jankowski, cela annule la méthode par bidouille SQL

    C'est deux méthodes opposées !

    Ton champ ChampPourSelection ou REGROUPER (note que j'avais changé le nom en relisant tes réponses) affichera un 0 partout
    A toi dans le OnDrawColumnCell de dessiner via dmImages ou DrawFrameControl selon le contenu de REGROUPER, il sera accessible en AsInteger (mieux que AsString)
    Oui mais j'ai d'abord tester ta méthode puis celle de Pascal. Je viens de retester pour être sûr et ça ne m'affiche rien dans ma colonne. Je n'ai pas de 0 non plus...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est peut-être que ton SGBD ne sait pas fournir de colonne par défaut ou alors il traine des trucs dans ton code qui sont parasite

    Je précise qu'il faut
    NI Champs Persistant dans le DataSet
    NI de Columns dans le TDBGrid (ou alors il faut penser à l'ajouter)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour le champ calculé, son type est Boolean, c'est plus logique. (les valeurs entières que prend un boolean est 0 pour False et -1 pour True).

    De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFS42.q_selectCalcFields(DataSet: TDataSet);
    begin
     DataSet.FieldByName('nom_du_champ_calculé').AsBoolean := False;
    end
    Evitera l'erreur de violation
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  11. #11
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 936
    Points
    3 936
    Par défaut
    Salut

    T'aurais pas oublié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultDrawing := False;
    par hasard ?

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est peut-être que ton SGBD ne sait pas fournir de colonne par défaut ou alors il traine des trucs dans ton code qui sont parasite

    Je précise qu'il faut
    NI Champs Persistant dans le DataSet
    NI de Columns dans le TDBGrid (ou alors il faut penser à l'ajouter)
    Je n'ai pas de DataSet.

    J'ai des columns ds le DBGrid... je les ai enlevé et là je n'ai plus rien qui s'affiche. J'ai donc remis mes deux colonnes... mais du coup pas de trace de 3° colonne avec case à cocher. J'ai donc remis ma colonne.
    Windows XP
    Delphi 7

    WinDev Mobile 17

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut

    T'aurais pas oublié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultDrawing := False;
    par hasard ?

    @+
    A mettre où ? Dans le code de DrawColumnCell ?

    Pour le champ calculé, son type est Boolean, c'est plus logique. (les valeurs entières que prend un boolean est 0 pour False et -1 pour True).


    procedure TFS42.q_selectCalcFields(DataSet: TDataSet);
    begin
    DataSet.FieldByName('nom_du_champ_calculé').AsBoolean := False;
    end

    Evitera l'erreur de violation
    Je vais tester...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  14. #14
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 936
    Points
    3 936
    Par défaut
    Non, tu affectes False à la propriété DefaultDrawing du DBGrid (via l'inspecteur d'objet), c'est indispensable pour mettre en oeuvre l'évt DrawColumnCell.
    Vérifies par ailleurs que cette propriété n'est pas modifiée dans le code.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  15. #15
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 936
    Points
    3 936
    Par défaut
    Le petit tuto que tu as mentionné n'en parle pas, c'est curieux.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Non, tu affectes False à la propriété DefaultDrawing du DBGrid (via l'inspecteur d'objet), c'est indispensable pour mettre en oeuvre l'évt DrawColumnCell.
    Vérifies par ailleurs que cette propriété n'est pas modifiée dans le code.

    @+
    Je l'ai mis et je l'ai également remis dans
    procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject;
    const Rect: TRect; DataCol: Integer; Column: TColumn;
    State: TGridDrawState);
    begin

    // On ne prend en compte que la colonne REGROUPER
    if sameText(Column.FieldName, 'REGROUPER') then
    begin
    { On efface la cellule }
    DBGrid_select.Canvas.FillRect(Rect);
    { Cochée ou Pas ?}

    dmImages.imgCheck.Draw(DBGrid_select.Canvas,
    Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2),
    Rect.Top,
    Ord(Column.Field.AsString = '0') //au lieu de Ord(monDB.Fields[3].AsString = '0') sinon me coche toutes les cases sur la recherche
    );
    end
    { si column ne correspond pas à une case à cocher, }
    { on ne s'occupe pas du dessin de la cellule, on }
    { transmet donc à DefaultDrawColumnCell }
    else
    begin
    DBGrid_select.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;

    DBGrid_Select.DefaultDrawing := false;
    end;
    Mais du coup mes lignes du DBGrid sont tout le temps vides...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    as-tu vu ma version d'un checkbox dans un dbgrid ?
    ici
    avantage , pas besoin d'image en plus

    maintenant quelques critiques (constructives ?)
    tout d'abord la requête :
    1 - il me semble que le distinct n'est pas nécessaire s'il y a un group by
    2 - s'il y a deux tables préférer la syntaxe 'moderne' de la jointure pour plus de lisibilité
    3- ajouter le champ de la fameuse case a cocher

    ce qui donnerait quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select colxcol, cdexent,min(0) as regrouper from ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    WHERE CODXENT =:cod
    and TOUXENT =:tou
    and MARXENT =:mar
    and (refxcol is not null) 
    group by cdexent, colxcol
    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

  18. #18
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 936
    Points
    3 936
    Par défaut
    L'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGrid_Select.DefaultDrawing := false;
    en fin de procedure ne sert à rien.
    Mais du coup mes lignes du DBGrid sont tout le temps vides...
    C'est curieux, l'appel à DBGrid_select.DefaultDrawColumnCell aurait dû éviter cela.
    Là pour l'instant, je sèche.
    As-tu vérifié que la routine DBGrid_SelectDrawColumnCell était bien assignée à l'évt DrawColumnCell de DBGrid_select ?

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  19. #19
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Le petit tuto que tu as mentionné n'en parle pas, c'est curieux.
    Surtout que cela a été mentionné dans Comment formater l'affichage d'un champ dans un TDBGrid ?

    Citation Envoyé par juju1988 Voir le message
    Je n'ai pas de DataSet.
    j'utilisais DataSet comme un terme générique, le Query est un DataSet

    Citation Envoyé par juju1988 Voir le message
    J'ai des columns ds le DBGrid...
    Je n'ai jamais trop pratiqué cela, une fois que l'on y a touché, ... pour être sur, je supprime le compo et je remets un DBGrid tout propre, et souvent "par magie" cela fonctionne !

    Idem pour les Query, je ne les pose pas non plus, je les instancies à la volée, je n'ai pas de problème de liste de champ prédéfini non conforme au SQL !

    Les remarques de SergioMaster sont pertinentes, tu as peut-être une erreur SQL que tu masques d'où la grille vide car il n'apprécie pas le trio DISTINCT \ GROUP BY \ 0 as ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    as-tu vu ma version d'un checkbox dans un dbgrid ?
    ici
    avantage , pas besoin d'image en plus

    maintenant quelques critiques (constructives ?)
    tout d'abord la requête :
    1 - il me semble que le distinct n'est pas nécessaire s'il y a un group by
    2 - s'il y a deux tables préférer la syntaxe 'moderne' de la jointure pour plus de lisibilité
    3- ajouter le champ de la fameuse case a cocher

    ce qui donnerait quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select colxcol, cdexent,min(0) as regrouper from ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    WHERE CODXENT =:cod
    and TOUXENT =:tou
    and MARXENT =:mar
    and (refxcol is not null) 
    group by cdexent, colxcol


    Ben je teste sous PL/SQL pour voir déjà mais ça me dit : "Toutes les variables ne sont pas liées" ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select colxcol, cdexent,min(0) as CHECKBOX 
    from ENTXRES E 
    JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL
    WHERE CODXENT =:cod
    and CODXENT =:cod
    and TOUXENT =:tou
    and MARXENT=:mar
    and (refxcol is not null) group by cdexent, colxcol
    Windows XP
    Delphi 7

    WinDev Mobile 17

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

Discussions similaires

  1. case à cocher dans dbGrid pour sélection de ligne ?
    Par TheYoMan dans le forum Débuter
    Réponses: 2
    Dernier message: 24/07/2009, 09h59
  2. case à cocher dans une DBGrid
    Par beambeam dans le forum C++Builder
    Réponses: 9
    Dernier message: 17/05/2009, 13h28
  3. Réponses: 24
    Dernier message: 24/11/2005, 10h28
  4. [excel vba]case à cocher dans excel pour plusieurs lignes
    Par fcoisb dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/03/2005, 11h23
  5. Case à cocher dans une requête
    Par kloss dans le forum Access
    Réponses: 6
    Dernier message: 14/10/2004, 11h44

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