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

Composants VCL Delphi Discussion :

Quel est l'événement à traiter lorsqu'on veut détecter un click sur la colonne du dgindicator ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 341
    Points : 150
    Points
    150
    Par défaut Quel est l'événement à traiter lorsqu'on veut détecter un click sur la colonne du dgindicator ?
    Je pense que l'intitulé du sujet est assez détaillé, mais je vais préciser ma pensée.
    Lorsque j'ai l'option dgIndicator à true, j'ai bien sûr une petite colonne à gauche avec l'indicateur de l'enregistrement en cours et de son état.
    Le problème, c'est que si l'utilisateur clique dans cette colonne pour sélectionner ou non un enregistrement (avec dgmultiselect à true), je n'arrive pas à traiter cet événement spécifique.
    Si l'utilisateur clique dans n'importe quelle cellule, je traite l'événement par un OnCellClick, mais si l'utilisateur clique sur cette "fausse colonne" indicator à gauche, le OnCellClick ne le capte pas.
    Je n'ai pas trouvé d'événement OnClick sur le TBGrid.
    Et même un on MouseDown n'est pas pris en compte sur cette zone ...

    Quelqu'un saurait ce qu'il faut faire ?

    Merci d'avance.

    Bien cordialement.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    C'est à prendre en compte via OnScoll du DataSet

    Quel est le réel besoin fonctionnel ?
    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. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 341
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Merci de t'intéresser ... ;o)

    En fait, lorsque l'utilisateur clique sur une ligne avec control appuyé, il sélectionne plusieurs lignes, avec au fur et à mesure l'affichage de la somme d'un champ, et, si plus d'une ligne est sélectionnée, un bouton apparaît permettant de "grouper" les lignes en leur affectant un numéro de groupe.
    Mais, lorsqu'on clique sur la colonne du dgIndicator, cela sélectionne ou déselectionne les lignes cliquées, mais je ne capte pas cet événement dans le OnCellClick qui me permet pas de mettre à jour la somme et tout le reste de la procedure.
    Et là ils sont arrivés à me grouper une seule ligne ! alors que je définis que le bouton ne soit accessible que si plusieurs lignes sont sélectionnées, mais comme je n'intercepte pas ce click, ça ne met pas à jour le enabled du bouton ... et donc ... il faudrait toujours penser comme un utilisateur lambda et pas comme un programmeur ...
    Et je me suis aperçu à cette occasion que si on clique sur la ligne de titre, ça sélectionne/désélectionne aussi la ligne en cours, comme si on cliquait sur la ligne elle-même !

    Ca ne passe pas non plus par le OnMouseDown

    J'ai trouvé une solution de substitution à l'instant en passant par le OnMouseUp et en testant sur la largeur de la colonne indicator et la hauteur de la première ligne (de façon empirique en cherchant à tâton ces valeurs car je ne peux pas en l'état consulter ces propriétés qui sont protected)

    Je verrai si je peux dériver une classe pour consulter ces propriétés, mais pour l'instant ça protège des fausses manoeuvres....

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 341
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est à prendre en compte via OnSrcoll du DataSet
    Alors le OnScroll du Dataset n'est pas adapté car si on sélectionne/déselectionne sans changer d'enregistrement, il n'y a pas de scroll ... donc il y a action sur le selected mais je ne capte pas l'info ...

    En fait il faudrait un "OnChangeSelectedRows.count" ... mais je ne sais pas comment faire ...

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Essaye un TAction OnUpdate associé à ton bouton.

    Et puis le OnExecute / OnClick peut vérifier le Count avant de faire la fusion, mieux vaut toujours contrôler au niveau business et ne jamais faire confiance à la Vue pour ses controles, une logique indispensable en n-Tiers.

    EDIT : Confirmé !
    TActionList, Action1 associé au Button, le OnUpdate ci-dessus, le OnExecute remplace le OnClick

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Action1Update(Sender: TObject);
    begin
      Action1.Enabled := DBGrid1.SelectedRows.Count > 0;
    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

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 341
    Points : 150
    Points
    150
    Par défaut
    Encore un truc que je n'ai jamais utilisé ...
    Pas si simple à comprendre, mais en fait ça revient à ce que j'étais en train de faire avec un TTimer ...
    Pour la peine je vais utiliser le Taction pour apprendre.
    Il faut que je modifie un peu avec un flag pour ne pas exécuter sans cesse la procédure qui est appelée, mais seulement lorsque le count change ...

    Merci pour avoir attiré mon attention sur ce composant que je ne connaissais pas.

    Ca a l'air de fonctionner, mais je ne sais toujours pas comment détecter un click sur la colonne dgindicator ;o)

Discussions similaires

  1. Le newbie est toujours là : traiter un événement dans une classe ?
    Par L'AMI Yves dans le forum Général Python
    Réponses: 20
    Dernier message: 03/12/2018, 09h33
  2. Réponses: 5
    Dernier message: 04/05/2016, 15h33
  3. Réponses: 4
    Dernier message: 30/04/2013, 18h57
  4. Réponses: 6
    Dernier message: 13/11/2007, 12h06
  5. Réponses: 2
    Dernier message: 26/07/2006, 13h52

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