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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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  

  2. #2
    Membre Expert

    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
    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.

  3. #3
    Membre éclairé
    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
    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é.

  4. #4
    Membre Expert

    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
    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]

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 115
    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 éclairé
    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
    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)

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 115
    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 Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 573
    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."

  9. #9
    Membre éclairé
    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
    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...

+ Répondre à la discussion
Cette discussion est résolue.

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