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 OnKeyDown capricieux


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 401
    Points : 300
    Points
    300
    Par défaut Evénement OnKeyDown capricieux
    Bonjour,
    J'ai un fiche (delphi 10.1, pb sous windows 10, 8,7...) avec des TSpeedButton, des TButton et un TImageViewer de la GR32.
    Le but est d'afficher des photos et de changer de photo par les TButtons. Jusque là pas de soucis !
    Ayant un bouton image suivante et un image précédente, j'ai voulu utiliser en plus ou en parallèle des boutons les flèches du clavier.
    Pour cela j'ai mis le KeyPreview de la fiche à True et j'ai traité les touches des flèches dans le OnKeyDown.
    Cela ne fonctionne pas : l'appui sur les les flèches change le TButton qui a le focus et le OnKeyDown ne part pas.
    Dans un autre mode de fonctionnement de cette fiche (diaporama) je masque le Panel qui contient tous les TButtons et miracle OnKeyDown fonctionne.
    Si je ré-affiche mes TButtons, tant que je n'en ai pas cliqué un, le OnKeyDown est OK des que j'ai cliqué sur un des boutons, l'événement ne part plus !!

    Comment puis-je faire ?
    Merci

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    J'ai fait un exemple simple en D7 et je ne rencontre pas le problème (mais je n'ai peut être pas tout saisi ...)

    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
    48
    49
    50
    51
    52
    53
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons;
     
    type
      TForm1 = class(TForm)
        Btn_Precedent: TSpeedButton;
        Btn_Suivant: TSpeedButton;
        procedure Btn_PrecedentClick(Sender: TObject);
        procedure Btn_SuivantClick(Sender: TObject);
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    { =============================================================== }
    procedure TForm1.Btn_PrecedentClick(Sender: TObject);
    begin
       ShowMessage('Photo précédente') ;
    end;
    { =============================================================== }
    procedure TForm1.Btn_SuivantClick(Sender: TObject);
    begin
      ShowMessage('Photo suivante') ;
    end;
    { =============================================================== }
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key=VK_RIGHT) then
      begin
        Btn_SuivantClick(Self) ;
      end;
    if (Key=VK_LEFT) then
      begin
        Btn_PrecedentClick(Self) ;
      end;
    end;
    { =============================================================== }
    end.
    Les touches clavier et les SpeedButtons répondent parfaitement.

    A+
    Charly

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 401
    Points : 300
    Points
    300
    Par défaut
    Effectivement je n'ai pas été assez clair.
    Le pb n'est pas lié aux speedbuttons qui sont sur la form mais aux TButtons.
    Les speedbuttons servent à d'autres besoins (affichages des exif ....) et les TButtons pour avancer ou reculer.
    Par contre ta remarque peut être pertinente, il suffirait peut être que je remplace les TButtons par des TSpeedButtons. J'essaierais ce soir !

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    j'ai remplacé les TSpeedbuttons par des TButtons et cela fonctionne bien de la même façon, à condition de neutraliser la tabulation : il faut mettre Tabstop à False pour les 2 boutons.

    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
    48
    49
    50
    51
    52
    53
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Btn_Precedent: TButton;
        Btn_Suivant: TButton;
        procedure Btn_PrecedentClick(Sender: TObject);
        procedure Btn_SuivantClick(Sender: TObject);
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    { =============================================================== }
    procedure TForm1.Btn_PrecedentClick(Sender: TObject);
    begin
       ShowMessage('Photo précédente') ;
    end;
    { =============================================================== }
    procedure TForm1.Btn_SuivantClick(Sender: TObject);
    begin
      ShowMessage('Photo suivante') ;
    end;
    { =============================================================== }
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key=VK_RIGHT) then
      begin
        Btn_SuivantClick(Self) ;
      end;
    if (Key=VK_LEFT) then
      begin
        Btn_PrecedentClick(Self) ;
      end;
    end;
    { =============================================================== }
    end.
    Essaye mon exemple pour voir (Form1, Btn_Precedent et Btn_Suivant avec TabStop à False)

    A+
    Charly

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Autre possibilité, tu peux utiliser les évènements OnEnter des TButtons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    { =============================================================== }
    procedure TForm1.Btn_SuivantEnter(Sender: TObject);
    begin
       ShowMessage('Photo suivante - On Enter') ;
    end;
    { =============================================================== }
    procedure TForm1.Btn_PrecedentEnter(Sender: TObject);
    begin
       ShowMessage('Photo précédente - On Enter') ;
    end;
    { =============================================================== }
    Cela évite de mettre les TabStop à False

    A+
    Charly

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 401
    Points : 300
    Points
    300
    Par défaut
    OK Charly le pb est bien sur le TabStop.
    J'ai remplacé les TButton par des TSpeedButton et j'ai bien le fonctionnement recherché.
    Effectivement le fait de mettre le TabStop à False fait la même chose.
    Ton idée de se servir du OnEnter je n'y avait pensé ! A garder en mémoire. On y pense (moi j'y pense) plus tôt pour les composants de saisie de texte que pour les boutons.

    Merci de ton aide. Problème résolu !!
    Bernard

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

Discussions similaires

  1. JvWizard et evenement OnkeyDown d'un controle
    Par Andry dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/01/2006, 07h24
  2. [FLASH MX 2004] [Key] Evenement onKeyDown
    Par freegreg dans le forum Flash
    Réponses: 2
    Dernier message: 08/07/2004, 17h38
  3. Evenement Change
    Par PierDIDI dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2002, 10h08
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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