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. #21
    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
    L'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGrid_Select.DefaultDrawing := false;
    en fin de procedure ne sert à rien.

    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 ?
    Effectivement le lien n'était pas fait. Mes colonnes s'affichent bien à nouveau mais pas de case à cocher en vue
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #22
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    "Toutes les variables ne sont pas liées"
    Tient cela confirme que c'est bien ORACLE !
    Est-ce MIN(0) est possible que donne le SQL sur PL/SQL ou TOAD

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select colxcol, cdexent,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

    Citation Envoyé par juju1988 Voir le message
    Effectivement le lien n'était pas fait. Mes colonnes s'affichent bien à nouveau mais pas de case à cocher en vue


    Il faudrait que tu reprennes nos différentes approches !
    Tu peux les combiner

    DefaultDrawing à false via l'inspecteur
    un SQL bidon + 3 Columns dans le DBGrid bien liées comme il faut
    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

  3. #23
    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
    Tient cela confirme que c'est bien ORACLE !
    Est-ce MIN(0) est possible que donne le SQL sur PL/SQL ou TOAD

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select colxcol, cdexent,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




    Il faudrait que tu reprennes nos différentes approches !
    Tu peux les combiner

    DefaultDrawing à false via l'inspecteur
    un SQL bidon + 3 Columns dans le DBGrid bien liées comme il faut
    ^^ Ouais encore fait ma blonde !

    Alors la requête fonctionne bien dans PL/SQL j'ai bien ma troisième colonne rempli de 0. Mais si je met ma requête dans le code et en ayant bien mon defaultdrawing à false je n'ai tjs rien dans ma colonne à l'affichage...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  4. #24
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Surtout que cela a été mentionné dans Comment formater l'affichage d'un champ dans un TDBGrid ?
    ce n'est pas ce tuto dont Juju1988 parlait au départ, je n'ai pas regardé les autes tutos

    L'histoire des variables non liées ne serait en rapport avec les paramètres de ta requête par hasard ? est-ce qu'elles sont toutes affectées via ParamByName() ou est-ce ta requête est un ensemble détail d'une autre requête ?

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

  5. #25
    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
    Voici le code complet, mes paramètres sont récupérés de mon premier datagrid (voir pièce jointe au début du topic :

    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
      x_cli := DBGrid_affich.Fields[0].AsString;
      x_tournee := DBGrid_affich.Fields[1].AsString;
      if DBGrid_affich.Fields[2].AsString = 'ROUTE' then
        x_transport := 'RO'
      else if DBGrid_affich.Fields[2].AsString = 'MARITIME' then
        x_transport := 'MA'
      else if DBGrid_affich.Fields[2].AsString = 'AERIEN' then
        x_transport := 'AE';
     
     
      q_select.Close; q_select.SQL.Clear;
      q_select.SQL.Add('SELECT colxcol, cdexent,0 AS regrouper FROM ENTXRES E JOIN COLXRES C ON 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;
     
      q_select.Open;
    Windows XP
    Delphi 7

    WinDev Mobile 17

  6. #26
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Il manque un WHERE, il semble...

    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
      with q_select do
      begin
        Close; 
        SQL.Text :=     
          'SELECT colxcol, cdexent,0 AS regrouper FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL '#10+
          'WHERE CODXENT =:cod '#10+
          'and TOUXENT =:tou '#10+
          'and MARXENT =:mar '#10+
          'and (refxcol is not null) group by cdexent, colxcol';
     
        ParamByName('cod').AsString := x_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        Open;
     end;
    devrait être un peu mieux...
    Selon tes dires, il est possible de mettre en place une relation maître/détails mais si le code marche, on ne va pas se compliquer la vie.

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

  7. #27
    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
    Effectivement il manquait le where mais bon même comme ça ça ne change rien...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  8. #28
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu as bien crée une colonne dans le DBGrid_select pour lire regrouper ?

    Fait un test vite fait
    pose un nouveau tdbgrid affecte lui un nouveau datasource et associe lui la q_select
    Ne touche à rien de plus, laisse tout le reste par défaut pas besoin de faire du joli
    lance ton code qui fait le q_select.Open();
    est-ce que ce nouveau tdbgrid affiche bien tout y compris les zéros ?

    Après, une fois les zéros OK, fait lui son propre DrawCell (n'utilise pas celui que tu as codé pour DBGrid_select sauf si tu maitrise bien le paramètre Sender et le transtypage)

    A mon avis à force de jouer, tu as touché à trop de truc qui font merdé un truc qui doit fonctionner du 1er coup !
    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

  9. #29
    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
    Alors j'ai fait tout comme tu as dit :

    - Nouveau dbgrid
    - Nouveau datasource
    - DataSource associé a q_select

    ==> Les 0 s'affichent.

    J'ai quand même mis la même procédure dans le drawCell (juste pour voir et parce que je n'en ai jamais testé d'autres) et j'ai toujours mes 0 mais pas de case à cocher...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  10. #30
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Alors j'ai fait tout comme tu as dit :
    ==> Les 0 s'affichent..
    Bonne Nouvelle

    Citation Envoyé par juju1988 Voir le message
    J'ai quand même mis la même procédure dans le drawCell (juste pour voir et parce que je n'en ai jamais testé d'autres) et j'ai toujours mes 0 mais pas de case à cocher...
    mais ta drawCell touche DBGrid_select et non le nouveau dbgrid !

    Soit tu modifie la drawCell pour gérer le Sender
    Soit tu copie-colle la drawCell vers un nouveau gestionnaire dans lequel tu remplace DBGrid_select par dbgrid1
    Tu associe ce nouveau gestionnaire à dbgrid1
    Et j'espère que cela fonctionnera !

    Pour info voici la variante avec Sender et imgCheck (0 = non coché, 1 =coché)

    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
    30
     
    procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      with Sender as TDBGrid do
      begin
        // On ne prend en compte que la colonne REGROUPER
        if sameText(Column.FieldName, 'REGROUPER') then
        begin
          { On efface la cellule }
          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,
              Column.Field.AsInteger; // 0 = non coché, 1 coché
     
            );
        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
          DefaultDrawColumnCell(Rect, DataCol, Column, State);
        end;
      end;
    end;
    pour gérer la coche sur le double clic, je te laisse traduire ce code c++ delphisé à l'arrache, là je dois partir ... a demain !

    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
    //---------------------------------------------------------------------------
    void __fastcall TDBManipForm::DBGridCDSBasicsDblClick(TObject *Sender)
    begin
      if (Sender.InheritsFrom(__classid(TDBGrid)))
      begin
        TPoint CursorPos = Mouse.CursorPos;
        TDBGrid* Grid = ((TDBGrid*)Sender);
        CursorPos = Grid.ScreenToClient(CursorPos);
        TGridCoord Coord = Grid.MouseCoord(CursorPos.x, CursorPos.y);
        TField *Field = Grid.Columns.Items[Coord.X].Field;
     
        if sameText(Field.FieldName, 'REGROUPER') then
        begin
          TDataSetState KeepState = Field.DataSet.State;
          if ((KeepState != dsEdit) && (KeepState != dsInsert))
            Field.DataSet.Edit();
          Field.AsBoolean = ! Field.AsBoolean;
          if ((KeepState != dsEdit) && (KeepState != dsInsert))
            Field.DataSet.Post();
        end
      end
    end
    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

  11. #31
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Je reprends le code initial:
    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;
    si cela ne fonctionne pas, il faut vérifier que :
    - la détection du champ REGROUPER est effective (j'ai un doute si 0 s'affiche) -> placer un point d'arrêt devant "DBGrid_select.Canvas.FillRect(Rect);" la détection sera immédiate à l'exécution bien qu'un peu pénible,
    - le code de dessin est valide, pour ça, faire un essai séparé sur le canevas de la fiche.

    @+

    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. #32
    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
    Yahoooo ^^ ça marche Shai ^^ merciii
    Merci tout le monde !!

    Je vous met la photo en pièce jointe tellement c'est beau ^^

    Encore merci

    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
    procedure TFS42.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      with Sender as TDBGrid do
      begin
        // On ne prend en compte que la colonne REGROUPER
        if sameText(Column.FieldName, 'REGROUPER') then
        begin
          { On efface la cellule }
          Canvas.FillRect(Rect);
          { Cochée ou Pas ?}
     
          dmImages.imgCheck.Draw(DBGrid1.Canvas,
              Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2),
              Rect.Top,
              Column.Field.AsInteger // 0 = non coché, 1 coché
     
            );
        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
          DefaultDrawColumnCell(Rect, DataCol, Column, State);
        end;
      end;
    end;
    Images attachées Images attachées  
    Windows XP
    Delphi 7

    WinDev Mobile 17

  13. #33
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Grillé de peu , j'allais proposer ce code
    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
    30
    31
     
    // Gestion affichage de la grille 
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var r : TRect;
    begin
    if Datacol=2 then
     begin
      r.Top:=Rect.Top+1;
      r.Bottom:=Rect.Bottom-1;
      r.Left:=Rect.Left+1;
      r.Right:=Rect.Right-1;
      DrawFrameControl((Sender as TDBGrid).Canvas.Handle,r,DFC_BUTTON,
      IfThen(ZQuery1.FieldByName('REGROUPER').asInteger=1,       // <<<<<<  ici la condition >>>>>>
      DFCS_CHECKED,DFCS_BUTTONCHECK));
     end
    else DBGrid1.DefaultDrawColumnCell(Rect,Datacol,Column,State);
    end;
     
    // Gestion de la case a cocher
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
    if Column.FieldName='REGROUPER' then
     begin
       ZQuery1.Edit;
       if ZQuery1REGROUPER.AsInteger=0
         then ZQuery1REGROUPER.AsInteger:=1
         else ZQuery1REGROUPER.AsInteger:=0;
       ZQuery1.Post;
     end;
    end;
    Images attachées Images attachées  
    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

  14. #34
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Petite optimisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
      if Column.FieldName='REGROUPER' then
      begin
        ZQuery1.Edit;
        ZQuery1REGROUPER.AsInteger:= 1 - ZQuery1REGROUPER.AsInteger;
        ZQuery1.Post;
      end;
    end;
    Ca m'embêtait de n'avoir rien à dire

    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. #35
    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
    Petite optimisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
      if Column.FieldName='REGROUPER' then
      begin
        ZQuery1.Edit;
        ZQuery1REGROUPER.AsInteger:= 1 - ZQuery1REGROUPER.AsInteger;
        ZQuery1.Post;
      end;
    end;
    Je ne comprend pas votre façon d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        ZQuery1.Edit;
        ZQuery1REGROUPER.AsInteger:= 1 - ZQuery1REGROUPER.AsInteger;
        ZQuery1.Post;
    ZQuery1 c'est ma q_select et Zquery1REGROUPER ? On peut mettre .AsInteger sur une requête ?

    EDIT :
    Pourquoi faire un - ?

    Moi j'aurais fait un truc du genre (qui ne fonctionne pas forcément) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        q_select.Edit;
        q_select.FieldByName('REGROUPER').AsInteger:= 1;
        q_select.Post;
    Windows XP
    Delphi 7

    WinDev Mobile 17

  16. #36
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    C'est avec des Champs persistants
    C'est l'inspecteur d'objet qui permet de créer des champs avec des objets associés !
    Oublie cette approche

    Cela donne pour toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if Column.FieldName='REGROUPER' then
      begin
        q_select.Edit;
        q_select.FieldByName('REGROUPER').AsInteger:= 1 - q_select.FieldByName('REGROUPER').AsInteger;
        q_select.Post;
      end;
    Pour le 1 - REGROUPER il faut juste dérouler les clics :
    1er clic 1 - 0 -> 1 ,
    2nd clid 1 - 1 -> 0,
    3e clic 1 - 0 -> 1 ,
    ...
    le IfThen (unité math) est peut-être un peu plus simple

    Column donne accès à son Field
    Field donne accès à son DataSet (q_select)
    Cela donne un code plus facilement réutilisable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
     if Column.FieldName='REGROUPER' then
      begin
        Column.Field.DataSet.Edit;
        Column.Field.AsInteger := IfThen(Column.Field.AsInteger = 0, 1, 0);
        Column.Field.DataSet.Post;
      end;
    end;
    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

  17. #37
    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
    Oui c'est e que j'ai fait le premier code, mais à quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Column.Field.AsInteger:= IfThen(Column.Field.AsInteger = 0, 1, 0);
    ??

    Et la deuxième méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if Column.FieldName='REGROUPER' then
      begin
        Column.Field.DataSet.Edit;
        Column.Field.AsInteger:= IfThen(Column.Field[2] = 0, 1, 0);
        Column.Field.DataSet.Post;
      end;
    end;
    ça me dit la classe n'a pas de propriété par défaut. Aucune version surchargée de IfThen ne peut être appelée avec ces arguments...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  18. #38
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Oui c'est e que j'ai fait le premier code, mais à quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Column.Field.AsInteger:= IfThen(Column.Field.AsInteger = 0, 1, 0);
    ??
    C'est pour cocher au clic pour que REGROUPER change de valeur comme une case à cocher !
    Tu alternes coché pas coché coché pas coché ... sinon je ne vois pas à quoi c'est la CheckBox

    Pourquoi ajouter [2], laisse le Column.Field qui fonctionne parfaitement !
    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

  19. #39
    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
    Si je laisse tout normal comme tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Column.FieldName='REGROUPER' then
      begin
        Column.Field.DataSet.Edit;
        Column.Field.AsInteger := IfThen(Column.Field.AsInteger = 0, 1, 0);
        Column.Field.DataSet.Post;
      end;
    ça me dit "Aucune version surchargée de 'IfThen' ne peut être appelée avec ces arguments."
    Windows XP
    Delphi 7

    WinDev Mobile 17

  20. #40
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Pourquoi passer par une fonction sur un calcul aussi élémentaire ?
    Encore si l'on avait l'opérateur de sélection du langage C, je comprendrais.

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

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 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