La première méthode (soustraction) ne fonctionne pas. Et la deuxième du coup si on clique ça coche et si on reclique ça décoche ?
La première méthode (soustraction) ne fonctionne pas. Et la deuxième du coup si on clique ça coche et si on reclique ça décoche ?
Windows XP
Delphi 7
WinDev Mobile 17
ouais c'est l'idée. Il s'agit d'une bascule, cela simule le fonctionnement d'une case à cocher.
La soustraction, ca fonctionne à condition de s'assurer que la valeur initiale est 0 ou 1. L'idée est d'employer une suite définie par récurrence, X(n+1) = 1 -X(n), le premier terme X(0) conditionne les autres.
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."
C'est effectivement l'idée !
Si tu n'aime pas le changement de la coche au Click,
j'ai fourni une variante C++ Delphisé que je te laisse corriger pour gérer le changement de la coche sur le Double Click,
c'est un peu plus retord car il faut manuellement calculé la colonne
élémentaire pour toi mais pas pour juju !
Perso, comme je code en C++, j'écrirais naturellement
Column->Field->AsInteger = ! Column->Field->AsInteger;
car ! c'est toujours le not logique contrairement à Delphi ou cela change logique\bit-à-bit, en C++, le bit-à-bit c'est ~
à la limite peut-être
Column->Field->AsInteger = Column->Field->AsInteger ? 0 : 1;
Mais je me débrouille pour que la colonne fantome soit un BIT ou TinyInt(1) respectivement avec le provider DBExpress pour Sybase ou MyDAC pour MySQL sont malin pour transformer le BIT ou TinyInt(1) en TBooleanField permettant d'écrire directement
Column->Field->AsBoolean = ! Column->Field->AsBoolean;
Et là pas d'amguïté !
Enfin en Delphi, j'écrirais ceci avec AsInteger
Column.Field.AsInteger := Integer(not LongBool(Column.Field.AsInteger));
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
C/C++ font la confusion entre booléen et entier, point de vue de pascalien.Perso, comme je code en C++, j'écrirais naturellement
Column->Field->AsInteger = ! Column->Field->AsInteger;
car ! c'est toujours le not logique contrairement à Delphi ou cela change logique\bit-à-bit, en C++, le bit-à-bit c'est ~
ça donne une expression trop compliqué par rapport à l'objectif.Enfin en Delphi, j'écrirais ceci avec AsInteger
Column.Field.AsInteger := Integer(not LongBool(Column.Field.AsInteger));
L'opérateur de sélection dont je parlais, inexistant en Delphi et c'est dommage car il rendrait parfois service.à la limite peut-être
Column->Field->AsInteger = Column->Field->AsInteger ? 0 : 1;
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."
C'est bien vrai ! un double cast, ce n'est pas très lisible !
si l'on est pas habitué le 1 - x ne l'est pas plus d'où l'ajout de commentaire pour indiquer que c'est juste une permutation true\false
raison de plus que le champ DB soit fortement type BOOL pour que le provider fournisseur un TBooleanField !
En XE3, IfThen est marqué inline même si la documentation ne le précise pas !
Du coup, cela se rapproche du ?, cela économise le CALL ...
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
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."
Non non c'est parfait comme principeCitation:
Envoyé par juju1988 Voir le message
Et la deuxième du coup si on clique ça coche et si on reclique ça décoche ?
C'est effectivement l'idée !
Si tu n'aime pas le changement de la coche au Click,
j'ai fourni une variante C++ Delphisé que je te laisse corriger pour gérer le changement de la coche sur le Double Click,
c'est un peu plus retord car il faut manuellement calculé la colonne
J'ai utilisé ton :
Mais pas de changement non plus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Enfin en Delphi, j'écrirais ceci avec AsInteger Column.Field.AsInteger := Integer(not LongBool(Column.Field.AsInteger));
Windows XP
Delphi 7
WinDev Mobile 17
Retire le DrawCell !
Regarde si cela passe de 0 à 1 et l'inverse !
Si cela change 0\1 c'est un bug du Draw
Si cela ne change pas ... euh, décidément tu n'as pas de bol !
Est-ce que q_select est modifiable ?
le résultat d'un SQL est parfois en lecture seule et refuse le Edit !
Est-ce que DBGrid1CellClick est bien lié à DBGrid1 OnCellClick ?
Attention au Edit\Post, en général, je ne les force pas,
je conserve l'état en cours via Column.DataSet.State;
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
DrawCell retiré et ça ne change pas je vais m'arracher les cheveux... sinon tant pis je ne dessine pas de case à cocher mais je fais un X dans la cellule à chaque clic...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TFS42.DBGrid_selectDblClick(Sender: TObject; Column : TColumn); begin (* if Dbgrid_select.Fields[2].AsInteger = 0 then showmessage('toto'); *) if Column.FieldName='REGROUPER' then begin Column.Field.DataSet.Edit; Column.Field.AsInteger := Integer(not LongBool(Column.Field.AsInteger)); Column.Field.DataSet.Post; end; end;
Windows XP
Delphi 7
WinDev Mobile 17
cela ne change pas ... euh, décidément tu n'as pas de bol !
Est-ce que q_select est modifiable ?
le résultat d'un SQL est parfois en lecture seule et refuse le Edit !
Est-ce que DBGrid1CellClick est bien lié à DBGrid1 OnCellClick ?
ou
DBGrid_selectDblClick lié à DBGrid_selec.OnCellClick ?
Attention au nommage !
DBGrid_selectDblClick c'est plutôt OnDblClick
DBGrid_selectCellClick c'est plutôt OnCellClick
Tu vas t'y perdre !
Il n'y a pas de Sender pour OnCellClick !
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
je viens de penser à un truc, l'ensemble de données est un TQuery ?
Par défaut, les TQuery ne sont pas modifiables, auquel il faut mettre en place la plomberie pour rendre les mises à jour possibles.
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."
Ne t'inquiète pas, je l'ai évoqué dès ma 1ere réponse :Mais vu les prototype de gestionnaire fourni, à mon avis, c'est qu'il ne sont pas lié à leur eventAu besoin le TClientDataSet fournira ce cache si tu Query n'en fourni pas !
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
Voici mes deux procédures sur le dbgrid_select....
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 // // Procédure permettant de dessiner case à cocher dans les colonnes d'un DBGrid // 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; // Gestion de la case à cocher : Au double clic on coche ou on décoche la case // procedure TFS42.DBGrid_selectDblClick(Sender: TObject; Column : TColumn); begin (* if Dbgrid_select.Fields[2].AsInteger = 0 then showmessage('toto'); *) if Column.FieldName='REGROUPER' then begin Column.Field.DataSet.Edit; Column.Field.AsInteger := Integer(not LongBool(Column.Field.AsInteger)); Column.Field.DataSet.Post; end; end;
Correct ou non ?
Windows XP
Delphi 7
WinDev Mobile 17
Pensez à utiliser les tags dans le titre.
Avant de poser une question reportez-vous à la FAQ Delphi
Respectez les règles du forum.
Aïe là ça provient de deux tables donc c'est foutu...
Windows XP
Delphi 7
WinDev Mobile 17
Il suffit juste de mettre en CacheUpdates (enfin dans mon cas en utilisant les ZEOSDBO , j'ai rajouté un UpdateSQL) pas de quoi fouetter un chat
si les champs ont été définis dans le datasource , bien vérifier que le champ ne soit pas en Readonly (par défaut c'est le cas).
j'avais également ôter , les options dgEditing de la dbgrid
as-tu la possibilité d'utiliser des composants tiers ? la smdbgrid (gratuite) te permettrait de faire cela en très peu de temps
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
Non je n'ai rien d'autre. Et je suis prise par le temps il faut que je résolve le problème aujourd'hui ça fait déjà une journée que je suis dessus je vais me faire taper sur les doigts pour les délais
Je vais écrire un X dans ma colonne tant pis ça ira plus vite. Merci à tous pour votre aide
Windows XP
Delphi 7
WinDev Mobile 17
par TQuery , on entends bien la même chose , a savoir le TQuery du BDE ?
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
Oui c'est ça
Windows XP
Delphi 7
WinDev Mobile 17
bon , alors j'ai fait un test avec le BDE et donc TQuery en rajoutant un TUpdateSQL cela fonctionne nickel pour la même demo que ce que j'ai illustré .
je ne reviens pas sur le fait que BDE est Obsolète
je vais faire un essai avec 2 tables liées après ce post (le temps que je trouve dans ma BDD quelque chose qui correspondrait)
[edit]
fait , ma query comprend 2 tables liées et pourtant ça fonctionne
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager