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

Lazarus Pascal Discussion :

Comment modifier Font.color d'un TEdit disabled


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Comment modifier Font.color d'un TEdit disabled
    Bonjour,

    N'y a-t-il pas un moyen simple de modifier la Font.Color d'un TEdit lorsque celui-ci est déclaré "Enabled := False;" ?

    Merci.
    Cordialement. Gilles

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 302
    Points
    11 302
    Billets dans le blog
    6
    Par défaut
    Bonjour, c'est amusant en effet !

    La propriété couleur est bien changée, mais le contrôle n'est pas modifié.

    Pour obtenir le changement de couleur, il faut qu'il soit enabled. A condition de le mettre ReadOnly, il sera repeint et non modifiable, mais n'aura pas l'aspect d'un contrôle disabled...

    Et il n'y a pas de OwnerDraw...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Le ReadOnly ne me convient pas car je ne vois pas comment empêcher le TEdit de prendre le Focus et ensuite d'empêcher de sélectionner son Text. Donc avec ReadOnly, l'ergonomie est moyenne.

    Il existe une piste en Delphi. Je voulais savoir s'il n'y avait pas plus simple... sachant qu'il est possible également d'utiliser un TStaticText.

    Cordialement. Gilles
    Dernière modification par Invité ; 02/04/2012 à 15h51.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour, comme j'ai eu un petit peu de temps tantôt, je me suis intéressé au TEdit dérivé de la piste Delphi mentionnée ci-dessus... Sous Windows avec quelques modifications, cela fonctionne avec Lazarus. Sous Nux ce n'est pas encore cela.
    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
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    unit lzEdit;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources,
      StdCtrls, {Tedit}
      Graphics, {TColor}
      LCLIntf,
      LCLType {TPaintStruct},
      LMessages,
      Dialogs;
     
    type
      TlzEdit = class(TEdit)
      private
       { Private declarations }
       FDisabledColor: TColor;
       FDisabledTextColor: TColor;
       procedure WMPaint(var msg: TLMPaint); message LM_PAINT;
       procedure WMEraseBkGnd(var msg: TLMEraseBkGnd); message LM_ERASEBKGND;
       procedure SetDisabledColor(const Value: TColor); virtual;
       procedure SetDisabledTextColor(const Value: TColor); virtual;
      protected
       { Protected declarations }
      public
       { Public declarations }
       constructor Create(aOwner: TComponent); override;
       destructor  Destroy; override;
      published
        { Published declarations }
       property DisabledTextColor: TColor
                read FDisabledTextColor
                write SetDisabledTextColor default clGrayText;
       property DisabledColor: TColor
                read FDisabledColor
                write SetDisabledColor default clWindow;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Additionlz',[TlzEdit]);
    end;
     
    constructor TlzEdit.Create(aOwner: TComponent);
    begin
      inherited;
      FDisabledColor := clWindow;
      FDisabledTextColor := clGrayText;
    end;
     
    destructor TlzEdit.Destroy;
    begin
     inherited Destroy;
    end;
     
     
    procedure TlzEdit.SetDisabledColor(const Value: TColor);
    begin
     if FDisabledColor <> Value then begin
      FDisabledColor := Value;
      if not Enabled then Invalidate;
     end;
    end;
     
    procedure TlzEdit.SetDisabledTextColor(const Value: TColor);
    begin
     if FDisabledTextColor <> Value then begin
      FDisabledTextColor := Value;
      if not Enabled then Invalidate;
     end;
    end;
     
     
    procedure TlzEdit.WMEraseBkGnd(var msg: TLMEraseBkGnd);
    var
      Canvas: TCanvas;
    begin
     if Enabled then
      inherited
     else begin
      Canvas := TCanvas.Create;
      try
       Canvas.Handle :=  msg.DC;
       SaveDC(msg.DC);
       try
        Canvas.Brush.Color := FDisabledColor;
        Canvas.Brush.Style := bsSolid;
        Canvas.Fillrect(ClientRect);
        msg.Result := 1;
       finally
        RestoreDC(msg.DC, - 1);
       end;
      finally
       Canvas.free
      end;
     end;
    end;
     
    procedure TlzEdit.WMPaint(var msg: TLMPaint);
    var
      Canvas : TCanvas;
      PS : TPaintStruct;
      CallEndPaint: Boolean;
      R : TRect;
    begin
     if Enabled then
      inherited
     else begin
      CallEndPaint := False;
      Canvas := TCanvas.Create;
      try
       if msg.DC <> 0 then begin
        Canvas.Handle := msg.DC;
        PS.fErase := True;
       end else begin
        BeginPaint(Handle, PS);
        CallEndPaint:= True;
        Canvas.Handle := PS.hdc;
       end;
       if PS.fErase then Perform(LM_ERASEBKGND, Canvas.Handle, 0);
       SaveDC(Canvas.Handle);
       try
        Canvas.Brush.Style := bsClear;
        Canvas.Font := Font;
        Canvas.Font.Color := FDisabledTextColor;
        R := ClientRect;
        R.Top := ClientRect.Top +1; { BorderStyle <-> bsSingle Bug ?}
        R.Left := ClientRect.Left +1;
        if Alignment = taLeftJustify then begin
          DrawText(Canvas.Handle, PChar(Text), Length(Text), R,
          DT_VCENTER or DT_LEFT);
    //    DT_SINGLELINE or DT_VCENTER or DT_LEFT  or DT_END_ELLIPSIS);
        end else if Self.Alignment = taRightJustify  then begin
          DrawText(Canvas.Handle, PChar(Text), Length(Text), R,
          DT_SINGLELINE or DT_RIGHT)
         end
         else if Alignment = taCenter  then begin
          DrawText(Canvas.Handle, PChar(Text), Length(text), R,
          DT_SINGLELINE or DT_CENTER)
         end
         else begin{cas normalement impossible}
          DrawText(Canvas.Handle, PChar(Text), Length(Text), R,
          DT_SINGLELINE or DT_LEFT);
         end;
         // Canvas.TextOut(1, 1, Text);
       finally
        RestoreDC(Canvas.Handle, - 1);
       end;
      finally
       if CallEndPaint then EndPaint(Handle, PS);
       Canvas.Free
      end;
     end;
    end;
     
    end.
    Hormis le portage sous Nux, plusieurs autres problèmes se posent parce que notamment, d'origine, le TEdit contient des "curiosités". Il suffit par exemple pour s'en convaincre de placer dedans un texte avec quelques espaces d'une longueur plus importante que celle du canvas visible, puis de choisir l'alignement à droite (avec Enabled = True). Le rendu n'est pas conforme à celui que l'on obtient avec un DT_RIGHT. D'autre part, en code, la propriété BorderStyle ne semble pas accepter 'bsSingle'. Enfin, le TEdit ne gère pas le DT_END_ELLIPSIS ?

    Sous Nux, la couleur s'applique aux bords du TEdit seulement semble-t-il... Je verrai cela de plus près demain. Mais si quelqu'un(e) voit une grosse bourde dès maintenant, merci de me la signaler.

    Cordialement. Gilles
    Dernière modification par Invité ; 03/04/2012 à 19h34.

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

    A priori sous gtk2 cela se présente mal si j'en crois le fil de cette discussion. La dernière réponse indique une solution potentielle.

    J'ai donc mis à jour ma version : svn co http://svn.freepascal.org/svn/lazaru...ts/customdrawn

    Le résultat est un peu décevant. La palette de composant apparaît bien. L'inspecteur objet du TCDEdit est "pauvre" par rapport au TEdit classique. De plus, je n'ai jamais réussi à compiler avec ce composant.


    Si j'ai bien compris, les Lazarusiens (une partie) essaye de s'exonérer encore plus des contraintes d'affichage des OS mais le projet est évidemment moins développé que la branche "initiale"... Donc, on arrive ici aux limites avec le cas du TEdit. Rien de grave dans mon cas, un TEdit disabled peut facilement être remplacé par un TStaticText avec l'apparence recherchée.

    Gilles
    Dernière modification par Invité ; 04/04/2012 à 10h58.

Discussions similaires

  1. [WD18] comment modifier color d'un texte sous forme image
    Par missoumsoft dans le forum WinDev
    Réponses: 11
    Dernier message: 18/12/2013, 17h33
  2. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  3. [jar] Comment modifier un fichier jar
    Par newfsch dans le forum JBuilder
    Réponses: 5
    Dernier message: 18/07/2004, 14h25
  4. comment modifier une texture?
    Par tibyann dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 15h27
  5. [ClassPath] Comment modifier le classpath d'eclipse?
    Par Elmilouse dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/04/2004, 18h32

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