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 :

Empêcher le focus d'un TEdit


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut Empêcher le focus d'un TEdit
    Bonjour,

    Je cherche à interdire le focus à un TEdit sans utiliser la propriété Enabled, car elle change le layout et empêche l'affichage du hint.

    J'ai essayé ceci mais ça marche à moitié car le contrôle précédent perd quand même le focus...
    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
     
      TmyEdit = class(TEdit)
      private
        FNoFocus: Boolean;
      proteced
        procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
      public
        function CanFocus: Boolean; override;
        procedure SetFocus; override;
      published
        property NoFocus: Boolean; read FNoFocus write FNoFocus default False;
      end;
     
    implementation
     
    procedure TmyEdit.WMSetFocus(var Message: TWMSetFocus);
    begin
      if not FNoFocus then inherited;
    end;
     
    function TmyEdit.CanFocus: Boolean;
    begin
      if not FNoFocus then Result := False else Result := inherited CanFocus;
    end;
     
    priocedure TmyEdit.SetFocus;
    begin
      if not FNoFocus then inherited;
    end;
    Frédéric
    On ne me la fait pas à moi !

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour.

    Une solution possible lorsque votre TEdit reçoit le focus (message WMSetFocus par exemple) et que vous ne voulez pas que ce dernier le reçoive, utilisez alors la méthode SelectNext pour transmettre le focus au contrôle suivant ou précédent dans la liste des TabOrder.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Merci pour votre réponse, mais si il n'y que ce control sur la form, ça ne marche pas non plus...

    Il faudrait pouvoir rester sur le control actif.

    Frédéric
    On ne me la fait pas à moi !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Ah contourné les comportements windows c'est la misère, solution de contournement :

    Tu mets ton Edit dans un Panel, ce panel tu le mets à Enabled à False, le Edit reste graphique actif (puisque tu le souhaite, ce qui pourra choquer l'utilisateur de ne pouvoir cliquer dans un champ, donc génère de la maintenance donc à éviter ...), mais le hint ne s'affiche, soit, facile suffit de l'afficher nous même

    Tu peux très bien faire ajouter un petit code dans le OnIdle de ton Application, cette fonction (que je viens de pondre pour l'occasion)

    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
     
    var
      HintWindowForDisabledControl: THintWindow = nil;
      LastDisabledControl: TControl = nil;
     
    procedure ManageHintWindowForDisabledControl();
    var
      Control: TControl;
      MousePoint, ClientPoint: TPoint;
    begin
      if Assigned(Screen.ActiveForm) and Screen.ActiveForm.Active then
      begin
        if GetCursorPos(MousePoint) then
        begin
          ClientPoint := Screen.ActiveForm.ScreenToClient(MousePoint);
          Control := RecurseControlAtPos(Screen.ActiveForm, ClientPoint, True, True);
          if Assigned(Control) then
          begin
            if Control <> _LastDisabledControl then
            begin
              _LastDisabledControl := Control;
              _HintWindowForDisabledControl.ReleaseHandle();
              if Control.ShowHint and (Control.Hint <> '') and not RecurseIsEnabled(Control) then
              begin
                _HintWindowForDisabledControl.Color := clInfoBk;
                _HintWindowForDisabledControl.ActivateHint(Rect(MousePoint.X, MousePoint.Y, MousePoint.X + _HintWindowForDisabledControl.Canvas.TextWidth(Control.Hint) + 8, MousePoint.Y + _HintWindowForDisabledControl.Canvas.TextHeight(Control.Hint)), Control.Hint);
              end;
            end;
          end
          else
            _HintWindowForDisabledControl.ReleaseHandle()
        end;
      end;
    end;
     
    initialization
      HintWindowForDisabledControl := HintWindowClass.Create(nil);
     
    finalization
      HintWindowForDisabledControl.Free();
    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
    function RecurseControlAtPos(Control: TWinControl; Pos: TPoint; AllowDisabled, AllowWinControls: Boolean): TControl;
    var
       Recurse: TControl;
    begin
       Result := nil;
       repeat
          Recurse := Control.ControlAtPos(Pos, True, True);
     
          if Assigned(Recurse) then
             Result := Recurse;
     
          if Recurse is TWinControl then
          begin
             Pos := Recurse.ScreenToClient(Control.ClientToScreen(Pos));
             Control := TWinControl(Recurse);
          end else
          begin
             Recurse := nil;
          end;
       until Recurse = nil;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function RecurseIsEnabled(AControl: TControl): Boolean;
    begin
      Result := False;
      repeat
        if Assigned(AControl) then
        begin
          Result := AControl.Enabled;
          AControl := AControl.Parent;
        end;
      until not Assigned(AControl) or not Result;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Placer le Tedit dans un Tpanel sa enabled a false

  6. #6
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Merci Shailetroll pour ton code.

    Je pris directement un TPanel, c'est plus simple
    On ne me la fait pas à moi !

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Ah oui, si ce n'est que pour afficher du texte, un label ou un panel suffit ou encore un StaticText, le panel permet de faire l'effet boite ... je pensait que l'état disnabled n'était pas permanent, ... qu'il te fallait pouvoir le bloquer de temps en temps tout en conservant le layout et le hint ...

    Effectivement, j'ai fourni un code pour gérer le Hint sur le composant disabled, d'ailleurs, je l'ai utilisé dans un des mes programmes à peine 1 heure après, eh, un travail bien fait, autant qu'il serve ... cela m'évitera quelques clics durant mes tests d'une appli que les hint s'affiche malgré le disabled ... j'avais déjà fait pour une autre appli mais le code était beaucoup plus long (Thread et autre délire) et gèrait du HTML pour le contenu du Hint ... un code plus conci c'est moins de maintenance ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Focus sur un TEdit
    Par looping dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2008, 20h44
  2. gestion de la perte de focus dans un TEdit
    Par PtiteDéveloppeuse dans le forum Composants VCL
    Réponses: 19
    Dernier message: 07/04/2008, 14h41
  3. Réponses: 5
    Dernier message: 06/05/2007, 18h52
  4. Comment mettre le focus sur un TEdit
    Par El-Diablo- dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/04/2007, 16h07
  5. Comment empêcher le 'bip' d'un TEdit ?
    Par Sydaze dans le forum Composants VCL
    Réponses: 13
    Dernier message: 15/06/2005, 09h12

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