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 :

[Tbutton] Interdire le focus à un bouton


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut [Tbutton] Interdire le focus à un bouton
    Bonjour,
    dans ma longue quête de modification de boutons, j'aimerais savoir si vous voyez une solution pour interdire à un bouton de prendre le focus.

    la propriété TabStop est inutile car au MouseDown, le bouton prend le focus
    elle ne sert que pour la procédure TControl.findNextControl qui va chercher le prochain control avec TabStop=True;

    le TSpeedButton le fait naturellement car héritant de TGraphicControl plutôt que TWinControl pour un TButton, mais j'aimerais quand même trouver comment faire (j'ai un gros travail fait sur un héritage de TButton, je ne saurais pas tout refaire en repartant d'un TSpeedButton)

    Merci d'avance !

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je ne sais pas si tu veux éviter qu'un TWinControl prenne le Focus lorsque tu cliques dessus (sinon en mettant Enabled à False .
    Mais est-ce que tu ne pourrais pas dans le MouseDown relever le contrôle qui a le focus, et le lui redonner dans le MouseUp ?

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Merci Rsc, pendant 4 heures je viens de plancher la dessus et j'arrive quasiement à ton idée.
    ma solution fonctionne donc je la poste ici pour que ça puisse servir à d'autres et leur économiser les 4 heures pénibles que je viens de passer

    Sur mon nouveau composant j'intercepte tous les changements de focus de la fiche
    si c'est mon composant qui reçoit le focus alors je le renvoie à l'envoyeur (sauf si mon bouton est tout seul sur sa fiche)

    le problème est qu'en faisant cela je cours circuite les mouseDown et les click
    j'intercepte donc le message du mouseup pour lui dire qu'il fasse un click, et le tour est joué !

    voici le code
    déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Type
      TGTISpeed = Class(TbitBtnWithColor) //Modif SLE
      private
        FControlEncours : TWincontrol; //Stock le dernier control qui avait le focus
      protected
        procedure CMFocusChanged(var Message:TCMFocusChanged);Message CM_FocusChanged;
        procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
      public
        Constructor create(AOwner : TComponent); override;
     
      end;
    Implémentation :
    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
    Constructor TGTISpeed.create(AOwner : TComponent);
    begin
    inherited;
    TabStop:=false;
    end;
     
    procedure TGTISpeed.CMFocusChanged(var Message:TCMFocusChanged);
    begin
    //Si le focus vient sur le GTISpeed alors on renvoie le focus à l'envoyeur
    if Message.sender=Self then
      begin
        if FcontrolEncours <> nil then
          begin
            //Vu qu'on a Tabstop a False, si on prend le focus c'est forcément par un MouseDown
            //On est obligé de le simuler ici sinon il est intercepté
            MouseDown(mbLeft,[],0,0);
            FControlEnCours.setFocus
          end
        else
          Message.sender:=nil;
      end
    else //Sinon on stock le nouvel envoyeur potentiel
      FControlEncours:=Message.sender;
    end;
     
    procedure TGTISPeed.WMLButtonUp(var Message: TWMLButtonUp);
    begin
      Self.Click; //Si on relève le bouton on considère qu'on a cliqué (obligatoire pour la gestion du non focus)
    end;

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Ca m'a l'air pas mal du tout

  5. #5
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Après quelques tests, ma solution précédente ne fonctionne plus à partir du 2ème clic sur le même bouton (mouarf) il faut donc remplacer la procédure CMFocusChanged par ce code ci :

    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
    procedure TGTISpeed.CMFocusChanged(var Message:TCMFocusChanged);
    var
    CtlTmp : TWincontrol; //Pour stocker temporairement FControlEnCours
    begin
    //Si le focus vient sur le GTISpeed alors on renvoie le focus à l'envoyeur
    if not (FControlEnCours is TGTISpeed) then
      begin
      if Message.sender=Self then
        begin
          if (FcontrolEncours <> nil) then
            begin
              //Vu qu'on a Tabstop a False, si on prend le focus c'est forcément par un MouseDown
              //On est obligé de le simuler ici sinon il est intercepté
              MouseDown(mbLeft,[],0,0);
              CtlTmp:=FControlEnCours;
              FControlEnCours:=Message.sender;
              CtlTmp.setFocus;  //On est obligé de faire comme ça sinon SetFocus relance la procédure et
            end;                //on ne stockait jamais la nouvelle valeur de FControlEncours
        end
      else
        begin   //Si sender est un TGTISpeed, il ne pas non plus prendre le focus, donc on le stock pas
          if not (Message.sender is TGTISpeed) then
            begin
              FControlEnCours:=Message.sender;
            end;
        end;
      end
        else
          begin //Si FControl = Nil on doit quand meme stocker quelque chose
                //Sinon on aura un access violation à l'entrée dans la fiche
            FcontrolEncours:=Message.Sender;
          end;
     
    end;
    Bonne journée !

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

Discussions similaires

  1. pb gestion focus + clique bouton
    Par stephsoux59 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/11/2007, 14h09
  2. Forcer focus sur bouton
    Par delph1983 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/06/2007, 17h01
  3. Focus sur bouton
    Par delph1983 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/06/2007, 14h55
  4. Réponses: 5
    Dernier message: 17/06/2006, 16h32
  5. choisir le focus du bouton dans une MessageBox?
    Par sher56 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/10/2005, 01h30

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