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 :

Evénement pour empêcher la perte de focus sur TEdit


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut Evénement pour empêcher la perte de focus sur TEdit
    Bonjour à tous,

    Je souhaiterais implémenter un évènement sur un composant de type TEdit qui serait déclenché avant la perte de focus dans les cas possible :

    Appui sur la touche TAB ou ENTREE
    Clic sur un autre composant de la fiche
    Etc…

    Le but étant d’avoir une procédure avec une variable de type booléenne CanClose/CanExit que je puisse fixer. Si je fixe cette variable à VRAI, je perds le focus sur mon composant et je vais sur le suivant mais si je fixe la variable à faux, je fais apparaitre une bulle d’aide et je reste sur mon composant.

    Apparemment il n’y a rien de déjà fait ni dans la VCL ni dans la JVCL…

    Pouvez-vous m’aider SVP ?

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    Je souhaiterais implémenter un évènement sur un composant de type TEdit qui serait déclenché avant la perte de focus
    je pense a l'evenement onexit

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut
    Merci tarekk73 pour ta réponse,

    L'évènement OnExit a été ma première idée. Le problème c'est qu'il est déclenché une fois que le composant a déjà perdu le focus. En pratique si je clique sur un autre composant de la fiche, l'autre composant a son évènement OnEnter déclenché (avec activation du focus) puis l'évènement OnExit du composant que je viens de quitter est déclenché.

    En clair, si je remet le SetFocus à mon composant d’édition dans l'évènement OnExit, je ne fait qu'une "bidouille" puisque concrètement :
    - le composant perd le focus,
    - un autre le prends
    - puis le composant initial le récupère.

    Merci pour ton idée mas ce n'est pas exactement ce que je souhaite faire.

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Peut-être avec un TApplicationEvents, qui surveillerait le message qui va bien.
    Plus qu'à trouver le bon.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut
    Lung, merci pour ta proposition.

    Je ne connaissais pas le TApplicationEvents mais je vais piocher et je vous tiens au courant.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    mais si je fixe la variable à faux, je fais apparaitre une bulle d’aide et je reste sur mon composant.
    attention! si vous fixer le focus sur un composant l'application sera bloqué.
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Edit1Exit(Sender: TObject);
    begin
    edit1.SetFocus;
    end;

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Quand je suis dans cette situation, j'utilise les lignes de code suivantes :

    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
     
    type
      private
        FTest: Boolean;
        procedure wmKEYDOWN(var Message :TMessage); message WM_KEYDOWN;
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FTest := True;
    end;
     
    procedure TForm1.Edit1Exit(Sender: TObject);
    begin
      if FTest then
        PostMessage(Handle, WM_KEYDOWN, 0, 0);
    end;
     
    procedure TForm1.wmKEYDOWN(var Message: TMessage);
    begin
      Edit1.SetFocus;
    end;
    Ainsi, tu peux décider de perdre ou pas le focus. Pour connaître le composant de retour, il est possible d'utiliser le Tag de chaque composant.

    Tu adaptes ça à ta situation réelle.

    Test fait avec Delphi 7 et Windows 7 x64

    A+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut
    Tout d'abord, merci à tarekk73, Lung et seabs pour leurs idées et propositions.

    J'ai finalement réussis à faire ce que je voulais selon le principe suivant :

    1. J'intercepte tous les messages Windows avant qu'ils ne soient envoyés aux composants de ma fiche.
    2. Si le focus est donné à un composant que je dois contrôler et que je détecte un message Windows qui peut faire quitter le composant (clic de souris, tabulation, etc.) j'effectue mes contrôles.
    3. Si les contrôles échouent je dis à Windows que j'ai déjà traité son message et l'action (clic, etc) reste sans effet.

    Dans la pratique, ce n'est pas si compliqué. J'ai créé une procédure TraiteMessages avec les mêmes paramètres que le type TMessageEvent.
    L'astuce principale étant l'utilisation du paramètre Handled qui permet de dire à Windows que le message à déjà été traité.
    Les messages sont redirigés via l’événement OnMessage de la variable globale Application.

    Voici un exemple trivial de la mise en pratique.

    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
     
    procedure TMainForm.TraiteMessages(var Msg: TMsg; var Handled: boolean);
    begin
      if AdvEdit1.SetFocus then
        // Tentative de sortie du composant...
        if (Msg.message = WM_LBUTTONDOWN) or (Msg.message = WM_RBUTTONDOWN) or
           (Msg.message = WM_LBUTTONDBLCLK) or (Msg.message = WM_RBUTTONDBLCLK) or
           ((Msg.message = WM_KEYDOWN) and ((Msg.wParam = VK_TAB) or (Msg.wParam = VK_RETURN))) then
          Handled:= TryStrToInt(AdvEdit1.Text, Value); // Sortie autorisé que si le contrôle est OK
    end;
     
    procedure TMainForm.FormShow(Sender: TObject);
    begin
      Application.OnMessage:= TraiteMessages;
    end;
     
    procedure TMainForm.FormHide(Sender: TObject);
    begin
      Application.OnMessage:= nil;
    end;

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

Discussions similaires

  1. Perte du focus sur fenetre d'impression PDF
    Par madevilts dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/05/2011, 16h49
  2. Perte de focus sur une fenêtre modale
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 07/01/2011, 14h32
  3. perte de focus sur une appli a cause dun script le controlant
    Par william wallace dans le forum VBScript
    Réponses: 6
    Dernier message: 27/12/2010, 17h06
  4. Perte du focus sur l'application
    Par ithel dans le forum Flex
    Réponses: 1
    Dernier message: 15/10/2009, 13h24
  5. JTable perte de Focus sur une Cellule
    Par La_Bande_A_Zozo dans le forum Composants
    Réponses: 1
    Dernier message: 25/07/2007, 17h32

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