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 FMX Delphi Discussion :

Form.OnKeyDown inopérant suite à un edit


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 243
    Par défaut Form.OnKeyDown inopérant suite à un edit
    Bonjour à tous,

    Dans une app Android, j'ai du code qui se déclenche sur l'event Form1.OnKeyDown.

    L'event se déclenche correctement... Je clique sur des boutons, l'event se déclenche toujours... Je clique sur un edit, puis un bouton, l'event ne se déclenche plus!

    Avec VCL, la solution serait simple avec un KeyPreview à true, mais KeyPreview n'existe pas avec FMX pour Android!

    Aussi bien un bouton qu'un edit peuvent garder le focus...

    Pourquoi est-ce que le clic d'un bouton n'empêche pas le fonctionnement de l'event Form1.OnKeyDown, mais qu'un edit court-circuite l'event Form1.OnKeyDown?

    Si au démarrage de l'app, on ne donne pas explicitement le focus à un objet, qui a le focus?

    Est-ce qqn à une explication à proposer?

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Hello

    Par défaut c'est la fiche qui a le focus sur les mobiles ou le composant ayant le TabOrder le plus bas dans toute la hiérarchie.

    Quand un champ de saisir prend le focus il traite les touches, du coup l'événement ne remonte pas au niveau de la fiche. Il faut le faire à la main si tu veux appeler le onKeyDown de la fiche.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 243
    Par défaut
    Citation Envoyé par pprem Voir le message
    Hello

    Par défaut c'est la fiche qui a le focus sur les mobiles ou le composant ayant let aborder le plus bas dans toute la hiérarchie.

    Quand un champ de saisir prend le focus il traite les touches, du coup l'événement ne remonte pas au niveau de la fiche. Il faut le faire à la main si tu veux appeler le onKeyDown de la fiche.
    Hello pprem,

    Quand tu dis le faire à la main, tu penses à quoi?

    Est-ce que je pourrai déclencher l'event form1.onKeyDown avec une commande du style "form1.keydown"?

    Sur clic de l'edit, l'edit prend le focus OK... Mais quand je clique ensuite sur un bouton, c'est le bouton qui prend le focus, non? Pourquoi alors est-ce que le form1.onKeyDown ne se déclencherait pas à nouveau (comme discuté après démarrage de l'app, je peux cliquer sur tous les boutons que je veux, l'event form1.OnKeyDown se déclenche toujours)?

    J'ai aussi essayé de redonner le focus à la form, mais cela ne fonctionne pas les form1.SetFocused(form1), form1.SetFocused(self) plantent à la compilation, form1.SetFocused(form1.Focused) est accepté mais je n'ai pas le résultat escompté...

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Les événements sont juste des pointeurs sur des méthodes, donc tu peux directement l'appeler comme n'importe quelle méthode/procédure/fonction.

    Par mesure de prudence il est préférable de vérifier que c'est pas nil avant au cas où.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if assigned(onkeydown) then onkeydown(jesaisplusquelsparametresdetete);

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 243
    Par défaut
    Bon, je dois avouer je suis dans le flou complet...

    J'ai trouvé par hasard un cas qui évite le problème mais je n'arrive pas à comprendre le pourquoi du comment.

    J'ai donc 3 scenario possibles:

    1. Je lance l'app, clic sur des boutons et mon form1.onKeydown va tjrs se déclencher
    2. Je lance l'app, et dès que je clique sur un edit, c'est terminé...Je peux cliquer sur tous les boutons de l'app (ou forcer le focus sur un objet de la form par un setfocus), la form1.onKeydown ne fonctionnera plus
    3. Le cas magique: Je lance l'app, et dès que je clique sur edit, la form1.onKeydown ne fonctionne plus... Avec ShowMessage, j'affiche un message qui doit être validé par le clic du bouton OK, la situation se débloque et le form1.onKeydown se remet à fonctionner!!!


    Est-ce que qqn peut expliquer ce comportement?

    Est-ce que qqn saurait comment le "singer" via code?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Tout d'abord, je me suis permis de déplacer la discussion vers Composants FMX. Même si l'intitulé est un peu ambigu (à cause de "composants"), le sujet est bien FMX et non sur L'EDI Delphi.

    N'étant pas fan de form.Keydown, j'ai tendance à éviter. Je ne saurais pas répondre exactement à la question ni répondre aux arcanes du "pourquoi ?", sauf peut-être que le TEdit fait appel au clavier virtuel (normalement) et que cela à peut-être une relation. Il me semble que dans ce cas OnVirtualKeyBordHidden pourrait servir pour appeller Keydown
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm18.FormVirtualKeyboardHidden(Sender: TObject;
      KeyboardVisible: Boolean; const Bounds: TRect);
    begin
     FormKeydown(Sender, // autres paramètres à définir) 
    end;

    J'ai aussi la souvenance d'avoir lu il y a peu un article qui parlait d'évènements FMX et qui pourrait peut-être répondre à la question "singe" je n'ai pas la référence mais des articles sur les FMX Events cela ne doit pas courrir les rues. Ce serait peut-être une piste

  7. #7
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Citation Envoyé par Anselme45 Voir le message
    Est-ce que qqn peut expliquer ce comportement?
    Que le Edit intercepte tout est normal.

    Qu'une fois qu'il a perdu le focus la fiche ne redéclenche pas le onKeyDown est anormal. Le fait que ça réagisse suite à l'affichage d'un ShowMessage veut probablement dire qu'il y a un truc en interne dans le fonctionnement de la gestion du clavier qui ne reprend pas la valeur standard et comme il ne doit pas y avoir des tonnes de développeurs avec des claviers sur des appareils Android ayant besoin d'intercepter les touches en dehors d'un champ de saisie, il est probable que ce défaut n'ait jamais été décelé.

    Si ça le fait sur la 10.4.2, il faut le rapporter sur QP avec un exemple. Comme ici je n'ai pas de clavier bluetooth à connecter sur un smartphone, je ne peux faire le test et fournir un code d'exemple pour qu'Embarcadero fasse les vérifications nécessaires.

Discussions similaires

  1. [Forms] Erreur FRM-10142 de Forms 10i Developer Suite
    Par marioBross2 dans le forum Connexions aux bases de données
    Réponses: 2
    Dernier message: 17/09/2012, 18h09
  2. [Forms]Erreur FRM-10142 de Forms 9i Developer Suite
    Par ambe_fr dans le forum Forms
    Réponses: 1
    Dernier message: 20/04/2007, 16h29
  3. Réponses: 1
    Dernier message: 16/03/2007, 10h30
  4. Obtenir la forme d'une suite de Caret dans une chaîne
    Par Sergejack dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 11/10/2006, 16h15

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