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 :

Dans un TCustomControl, je n'arrive pas à capter les flèches par OnKeyDown


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 407
    Billets dans le blog
    1
    Par défaut Dans un TCustomControl, je n'arrive pas à capter les flèches par OnKeyDown
    Bonjour,

    Je suis sous W11 avec Delphi 6 Personal Edition.

    J'essaie de créer un nouveau contrôle dérivé de TCustomControl.
    Je joins un fichier ZIP contenant le projet complet.

    J'arrive à le créer et à dessiner mon contrôle (rudimentaire) dans le canvas qui apparaît à l'écran.
    J'arrive à capter le click gauche et mousedown ce qui me permet, dans le OnClick, de connaître les coordonnées du click.
    Dans on mémo séparé, j'affiche les coordonnées du click lors de l'évènement OnClick, coordonnées mémorisées lors du OnMouseDown.
    J'arrive à détecter les touches frappées par OnKeyPress et à identifier un caractère normal, Return (#13) ou Delete (#8).

    Mais, je n'arrive pas à détecter les flèches (droite, gauche, haut, bas) qui sont interceptées avant d'arriver dans mon contrôle, au niveau de Form1.
    Le curseur se déplace alors dans la Form1 d'un contrôle à l'autre, ou dans le mémo.
    J'ai essayé de modifier le ControlStyle de mon TCustomContrôle (ControlStyle := ControlStyle +[csClickEvents,csCaptureMouse,csAcceptsControls],
    mais cela n'a aucune influence sur le traitement des flèches.
    J'ai même essayé de modifier KeyPreview de la Form1 (valeurs True et False), mais le comportement reste inchangé.
    Je peux détecter dans OnKeyDown même Shift, Ctrl, Alt, mais pas les flèches. C'est frustrant !

    Comment est-ce que je peux obtenir le passage des flèches dans mon TCustomControl de sorte que le OnKeyDown les détecte ?
    Voici une capture montrant mon programme après un clic , la frappe de "a", puis un autre clic à un endroit différent, puis la frappe de la touche Return:
    Nom : Capture d'écran 2025-11-29 130438.png
Affichages : 107
Taille : 15,0 Ko
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour ,

    Je pense qu'il faut intercepter le message WM_GETDLGCODE jette un coup d’œil sur le lien
    Les clés de direction la tab et l'entrée sont interceptés par la fiche pour changer le focus vers un autre contrôle ou la validation des données
    https://www.developpez.net/forums/d2.../#post12098836

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 407
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mist2024 Voir le message
    Bonjour ,

    Je pense qu'il faut intercepter le message WM_GETDLGCODE jette un coup d’œil sur le lien
    Les clés de direction la tab et l'entrée sont interceptés par la fiche pour changer le focus vers un autre contrôle ou la validation des données
    https://www.developpez.net/forums/d2.../#post12098836
    Merci ! Je vais essayer cela.

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 670
    Billets dans le blog
    1
    Par défaut WM_GETDLGCODE
    Nom : Video_2025_11_29-1_edit_0.gif
Affichages : 73
Taille : 354,1 Ko

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    unit TCustomControl_Unit;
     
    interface
     
    uses
      Windows, Messages, SysUtils, StrUtils, Classes, Types, Controls, Graphics,
      Dialogs;
     
    type
      TMyControl = class(TCustomControl)
      private
        fLastClick: TPoint;
        fKey: Char;
        procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
      protected
        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
          X, Y: Integer); override;
        procedure KeyDown(var Key: Word; Shift: TShiftState); override;
        procedure KeyPress(var Key: Char); override;
      published
        constructor Create(aOwner: TComponent); override;
        destructor Destroy; override;
        procedure Paint; override;
        property OnClick;
        property OnMouseDown;
        property OnKeyPress;
        property LastClick: TPoint read fLastClick write fLastClick;
        property Key: Char read fKey write fKey;
      end;
     
    implementation
     
    constructor TMyControl.Create(aOwner: TComponent);
    begin
      inherited Create(aOwner);
      if aOwner is TWinControl then
        Parent := TWinControl(aOwner);
      Width := 300;
      Height := 200;
      TabStop := True;
      ControlStyle := ControlStyle + [csClickEvents, csCaptureMouse,
        csAcceptsControls];
      Color := clWindow;
      Invalidate;
    end;
     
    destructor TMyControl.Destroy;
    begin
      inherited Destroy;
    end;
     
    procedure TMyControl.MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
    begin
      inherited MouseDown(Button, Shift, X, Y);
      if Button = mbLeft then
      begin
        fLastClick := Point(X, Y);
     
        if Assigned(OnMouseDown) then
          OnMouseDown(Self, Button, Shift, X, Y);
     
        if Assigned(OnClick) then
          OnClick(Self);
      end;
    end;
     
    procedure TMyControl.WMGetDlgCode(var Msg: TWMGetDlgCode);
    begin
      inherited;
      Msg.Result := Msg.Result or DLGC_WANTARROWS or DLGC_WANTCHARS;
    end;
     
    procedure TMyControl.KeyDown(var Key: Word; Shift: TShiftState);
    begin
      inherited KeyDown(Key, Shift);
      ShowMessage('KeyDown=' + IntToStr(Key));
      case Key of
        VK_LEFT:
          begin
            //
          end;
        VK_RIGHT:
          begin
            //
          end;
        VK_UP:
          begin
            //
          end;
        VK_DOWN:
          begin
            //
          end;
      end;
    end;
     
    procedure TMyControl.KeyPress(var Key: Char);
    begin
      inherited KeyPress(Key);
      fKey := Key;
      if Assigned(OnKeyPress) then
        OnKeyPress(Self, Key);
    end;
     
    procedure TMyControl.Paint;
    begin
      Canvas.Brush.Color := clRed;
      Canvas.Pen.Color := clBlack;
      Canvas.Pen.Width := 3;
      Canvas.FillRect(Canvas.ClipRect);
      Canvas.Rectangle(Canvas.ClipRect);
    end;
     
    end.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  5. #5
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 407
    Billets dans le blog
    1
    Par défaut
    Merci à vous deux !

    Oui, ça marche. Je récupère les 4 flèches et je peux les distinguer. C'est parfait. Le TAB n'est pas capté par cette astuce, mais je n'en ai pas besoin.

    Pour moi, le problème est résolu. Merci !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour capturer le TAB ajouter DLGC_WANTTAB dans le résultat de de message WM_GETDLGCODE, c'est à toi de définir les touches dont tu as besoin selon le type du contrôlé que tu envisages créer par exemple un edit simple ligne n'a pas besoin de Tab ni les touches de direction

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2019, 21h17
  2. [MySQL] je n'arrive pas affiche les donnees se trouvant dans la bdd
    Par vainqueur Bulambo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/05/2019, 11h27
  3. Réponses: 2
    Dernier message: 22/01/2009, 17h29
  4. Réponses: 3
    Dernier message: 28/05/2007, 08h47
  5. Réponses: 2
    Dernier message: 19/02/2006, 13h22

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