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 :

[Creation composant visuel] Problème avec le focus


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut [Creation composant visuel] Problème avec le focus
    Bonjour à tous

    J'ai un probleme avec la création d'un bouton "personnalisé", descendant de TCustomControl (donc de TWinControl, pour le focus, le handle et le doublebuffered entre autres) ... Et j'ai un probleme avec le focus ...

    Je n'arrive pas à faire en sorte qu'il le prenne tout seul, le seul moyen c'est de faire un SetFocus par une autre procedure, aucun interet donc ...

    J'ai essayé de rajouter le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    private
      procedure CMFocusChanged(var Msg: TMessage); message CM_FOCUSCHANGED;
    ...
     
    procedure CMFocusChanged(var Msg: TMessage);
    begin
      inherited;
      ShowMessage('FocusChanged');
      If Focused Then
        ShowMessage('Focused');
    end;
    Mais pareil, le code de la procedure (au complet, que ce soit avant ou apres le If) n'est appellé que part un SetFocus, jamais quand je clic sur mon bouton ... Aucun message donc ..

    Par ailleurs si je pose plusieurs composants sur ma form avec mon bouton personnalisé, quand je fais tab il ne prend jamais le focus

    Comment faire pour gérer le focus d'un composant maison :

    Merci par avance

    Ingham

    Edit: En rajoutant TabStop := True dans le Create de mon composant, j'arrive a lui faire gagner le focus avec Tab, mais lorsque j'y clic dessus il ne le prend toujours pas G du rater quelque chose

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Ce qui m'intrigue .. c'est qu'a la base, je pense que setFocus est bien la fonction qui est appellé pour affecter le focus ... manuelement ou par le systeme.

    Cela viendrais donc d'ailleur ?

  3. #3
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Je sais pas
    Sinon je pourrais faire un SetFocus; dans le message MouseDown, mais ça ferait un peu trop "rafistolé avec du scotch"

    Voici le type de mon bouton si ca peut aider

    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
     
      TIngButton = class(TCustomControl)
      private
        { Private declarations }
        FState         : TIngBtnState;
        FExitedPressed : Boolean;
        FProperties: TIngButtonProperties;
        { Procedures }
        Procedure WMMouseEnter(Var Msg: TWMMouse); Message CM_MOUSEENTER;
        Procedure WMMouseLeave(Var Msg: TWMMouse); Message CM_MOUSELEAVE;
        procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
        procedure CMFocusChanged(var Msg: TMessage); message CM_FOCUSCHANGED;
        procedure SetProperties(const Value: TIngButtonProperties);
      protected
        { Protected declarations }
        Procedure Paint; Override;
        Procedure Click; Override;
        Procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Override;
        Procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Override;
        Procedure MouseMove(Shift: TShiftState; X, Y: Integer); Override;
        procedure CreateParams(var Params: TCreateParams); override;
        {Procedures persos}
        Procedure DrawBevel(cCnvs: TCanvas);
        Procedure DrawGradients(cCnvs: TCanvas);
        Procedure DrawFinalis(cCnvs: TCanvas);
        Procedure DrawText(cCnvs:TCanvas);
      public
        { Public declarations }
        Constructor Create(AOwner: TComponent); Override;
        Destructor Destroy; override;
      published
        { Published declarations }
        Property Font;
        Property Properties: TIngButtonProperties read FProperties write SetProperties;
        { Events }
        Property OnClick;
      end;
    Merci pour ta réponse rapide en tout cas

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    La je sais pas .... :/

    Eventuelement .. tu n'as pas acces aux source des libs borland ? ca aide bien dans ces cas .. pour voir comment est gere le focus des boutons par exemple.

  5. #5
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Si justement, j'ai meme regardé le code source de différents boutons personnalisés comme le mien (le TJvXPButton par exemple, de la JVCL Beta 3) mais apparement pour eux le message CM_FOCUSCHANGED suffit, même pas besoin de mettre le TabStop := True

    Ou alors j'ai raté quelque chose mais je sais pas quoi

    Merci de t'interesser a mon probleme en tout cas

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Donc ca confirme ce que je supposait (qui etait assez logique en somme) : SetFocus est applé pour changer le focus d'un objet. que ce soit par toi ou par le systeme.

    Tu as essayé de surcharger la MEthode SetFocus pour y ajouter ton code ?
    Je suis pas un expert des messages, mais il me semble qu'une fois le message intercepté, il soit supprimé .... autrement dit je suis pas sur que 2 procedure / Fonction peuvent repondre simultanement au meme message.
    Si c'est le cas, L'interception du message par ta procedure empeche le systeme de reagir au changement du focus, et seul ta procedure sera lancee.

    C'est peut etre un peu vague .... :/

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Attention, appeler ShowMessage dans CM_FOCUSCHANGE est une très maivaise idée : car la ShowMessage va... détruire le focus de ton composant afin de le récupérer sur la fenêtre de dialogue !

    Pour faire ce genre de test, pose un label sur la fiche et modifie son caption. ( on le caption de la fiche en elle-même )

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Effectivement ... pour eviter certains troubles du aux showmessages dans les test, j'utilise meme une ListBox pour garder la trace de plusieurs "ShowMEssages" ...

  9. #9
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Le showmessage je l'ai rajouté ici pour illustrer
    Voici le vrai code de l'évenement:
    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
     
    procedure TIngButton.CMFocusChanged(var Msg: TMessage);
    begin
      inherited;
      If Focused Then
      Begin
        FState := ibsFocused;
        Invalidate;
      End
      Else If not (FState = ibsNormal) Then
      Begin
        FState := ibsNormal;
        Invalidate;
      End;
    end;
    Si FState est a ibsFocused, le bouton doit afficher un contour bleu

    Mais apparement ce n'est pas Windows qui gere les changements de focus, donc j'ai simplement rajouté un SetFocus dans le MouseDown (en plus du TabStop := True) et ca marche comme je veux pour l'instant

    Merci a vous 2

  10. #10
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Non c'est Windows qui gère le focus... ce qui est étrange, c'est que tu aies eut besoin de de la faire à la main.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/05/2008, 15h08
  2. composant image: problème avec setUrl
    Par sky_perrinos dans le forum NetBeans
    Réponses: 1
    Dernier message: 13/01/2008, 01h09
  3. Composant graphique, problème avec la méthode OnPaint
    Par mrrenard dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/10/2007, 16h32
  4. [CONCEPTION MCD] Problème avec les clés composées
    Par fabriceMerc dans le forum Schéma
    Réponses: 3
    Dernier message: 14/02/2005, 09h43
  5. Problème avec des composants non déclarés
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/01/2005, 11h17

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