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 :

[Curseur] de TEdit disparaît


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut [Curseur] de TEdit disparaît
    Bonjour,

    J'ai utilisé l'exemple de l'Edit cadrant ses données à droite puisé dans la FAQ Delphi (Interface, Composants, Divers 4.4.2).

    J'ai modifié ce modèle pour une utilisation particulière et l'ai installé en nouveau composant :
    Lorsque le composant détient le focus, je fais cadrer ses données à gauche, à droite lorsqu'il ne le détient plus.

    Le mécanisme fonctionne bien.., seulement le curseur de l'Edit disparaît complétement. L'instruction " SendMessage(NewEdit.Handle, EM_SETSEL, Value1, Value2) " ne sélectionne aucun caractère de l'Edit.

    Voici un extrait de code du nouveau composant :


    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
    Type TNewEdit = class(TEdit)
    private
    ...
        FTextAlign: TAlignment;
        FOnEnter: TNotifyEvent;
        FOnExit: TNotifyEvent;
        procedure SetTextAlign(Value: TAlignment);
      protected
      procedure DoEnter;override;
        procedure DoExit;override;
      public
        constructor Create(AOwner: TComponent); override;
      published
        property TextAlignment: TAlignment read FTextAlign write SetTextAlign;
    end;
     
    implementation
     
    procedure TNewEdit.CreateParams(var Params: TCreateParams);
    const
     Alignments: array[TAlignment] of Word = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin
     inherited CreateParams(Params);
     Params.Style := Params.Style or Alignments[TextAlignment];
    end;
     
    procedure TNewEdit.SetTextAlign(Value: TAlignment);
    begin
      if FTextAlign <>Value then
        Begin
         FTextAlign := Value;
         RecreateWnd;
       End;
    end;
     
    procedure TNewEdit.DoEnter;  // déclarée override
    begin
      inherited DoEnter;
      BiDiMode:= bdLeftToRight;
      TextAlignment:= taLeftJustify;
    end;
     
    procedure TNewEdit.DoExit;  // déclarée override
    begin
      inherited DoExit;
      if not (csFocusing in ControlState) then
        begin
          BiDiMode:= bdRightToLeft;
          TextAlignment:= taRightJustify;
        end;
    end;
    ...
    end.
    Après recherches, je n'ai pas trouvé la solution, aussi si un membre éclairé a la clé...

    Merci.

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut Re: [CURSEUR] de TEdit disparaît
    Citation Envoyé par jp Louis
    Après recherches, je n'ai pas trouvé la solution, aussi si un membre éclairé a la clé...
    Pourquoi un membre éclairé, un rédacteur ça te vas pas ?

    Essaie tout d'abord en plaçant le inherited DoExit; à la fin, des fois que ce serait lui qui se chargerait du curseur (ça m'étonnerait m'enfin).

    Sinon essaie ceci :
    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
    unit NewEdit;
     
    uses
      Controls, Messages;
     
    const
      CM_UPDATETEXTALIGN = WM_USER+564; // nombre aléatoire
     
    type
      TNewEdit = class(TEdit)
      private
        FTextAlign : TAlignment;
        FOnEnter : TNotifyEvent;
        FOnExit : TNotifyEvent;
        procedure SetTextAlign(Value : TAlignment);
      protected
        procedure DoEnter; override;
        procedure DoExit; override;
        procedure UpdateTextAlign(var Msg : TMessage); message CM_UPDATETEXTALIGN;
      public
        constructor Create(AOwner : TComponent); override;
      published
        property TextAlignment : TAlignment read FTextAlign write SetTextAlign;
    end;
     
    implementation
     
    procedure TNewEdit.CreateParams(var Params: TCreateParams);
    const
      Alignments: array[TAlignment] of Word = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin
      inherited CreateParams(Params);
      Params.Style := Params.Style or Alignments[TextAlignment];
    end;
     
    procedure TNewEdit.SetTextAlign(Value: TAlignment);
    begin
      if FTextAlign <> Value then
      begin
        FTextAlign := Value;
        PostMessage(Handle, CM_UPDATETEXTALIGN, 0, 0);
          // Surtout PostMessage et pas SendMessage
      end;
    end;
     
    procedure TNewEdit.DoEnter;  // déclarée override
    begin
      inherited DoEnter;
      BiDiMode:= bdLeftToRight;
      TextAlignment:= taLeftJustify;
    end;
     
    procedure TNewEdit.DoExit;  // déclarée override
    begin
      inherited DoExit;
      if not (csFocusing in ControlState) then
      begin
        BiDiMode:= bdRightToLeft;
        TextAlignment:= taRightJustify;
      end;
    end;
     
    procedure TNewEdit.UpdateTextAlign(var Msg : TMessage);
    begin
      RecreateWnd;
    end;
     
    end.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut CURSEUR de TEdit disparaît
    Bonjour,

    Merci à sjrd. Tout fonctionne alors correctement avec le code fourni.

    La solution est dans la procédure SetTextAlign qui appelle la fonction PostMessage(Handle, ...). et l'ajout d'une procédure UpdateTextAlign.

    A propos de la boutade sur le rédacteur,

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

Discussions similaires

  1. position curseur dans Tedit
    Par AlfredKr dans le forum Débuter
    Réponses: 7
    Dernier message: 17/08/2011, 20h06
  2. Positionner le curseur dans TEDIT ?
    Par colorid dans le forum Langage
    Réponses: 3
    Dernier message: 27/06/2008, 23h10
  3. Positionner le curseur dans TEdit
    Par Drooxy dans le forum Delphi
    Réponses: 2
    Dernier message: 09/12/2006, 12h04
  4. position curseur dans TEdit
    Par bandit boy dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/03/2006, 16h53
  5. Curseur d'un TEdit
    Par Guile dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/05/2003, 18h33

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