Ver Mensaje Individual
  #7  
Antiguo 30-12-2022
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El truco al que te refieres utiliza el evento OnDrawColumnCell de un StringGrid. Tu te estas refiriendo a un TEdit que no tiene ese evento. En ese caso debes hacer un subclasing y capturar el mensaje WM_PAINT o escribir un componente derivado que pinte el texto a tu gusto. Ten en cuenta que lo que hay que hacer es pintar y eso hay que hacerlo cuando toca, es decir, cuando Windows va a pintar.


En cierta ocasión contesté una pregunta sobre cómo cambiar el texto cuando un EDIT está deshabilitado y puse un ejemplo de un nuevo componente derivado de TEdit aquí: cambiar fuente de TEdit en modo ReadOnly


Transcribo el código por si te sirve para tomar ideas de lo que tú luego realmente pretendas hacer:


Código Delphi [-]
unit NewEdit; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls; 

type 
  TNewEdit = class(TEdit) 
  private 
    DColor: COLORREF; 
  protected 
    procedure WndProc(var Message: TMessage); override; 
  public 
    procedure SetDisableColor(Color: COLORREF); 
  published 
    { Published declarations } 
  end; 

procedure Register; 
                                             
implementation 

procedure TNewEdit.WndProc(var Message: TMessage); 
var 
  ps: PAINTSTRUCT; 
  DC: HDC; 
begin 
  if (Message.Msg = WM_PAINT) and (not IsWindowEnabled(Handle)) then 
  begin 
    DC:= BeginPaint(Handle, ps); 
    SetTextColor(DC, DColor); 
    SelectObject(DC, SendMessage(Handle, WM_GETFONT, 0, 0)); 
    TextOutA(DC, 1,1, PChar(Text), Length(Text)+1); 
    EndPaint(Handle, ps); 
  end; 
  inherited WndProc(Message); 
end; 

procedure TNewEdit.SetDisableColor(Color: COLORREF); 
begin 
  DColor:= Color; 
  Invalidate; 
end; 

procedure Register; 
begin 
  RegisterComponents('Samples', [TNewEdit]); 
end; 

end.


La parte donde pinta el texto es esta:
Código Delphi [-]
  if (Message.Msg = WM_PAINT) and (not IsWindowEnabled(Handle)) then 
  begin 
    DC:= BeginPaint(Handle, ps); 
    SetTextColor(DC, DColor); 
    SelectObject(DC, SendMessage(Handle, WM_GETFONT, 0, 0)); 
    TextOutA(DC, 1,1, PChar(Text), Length(Text)+1); 
    EndPaint(Handle, ps); 
  end;

Como verás, este código no usa la VCL sino que está escrito con API de Windows. La condición para activar el pintado es indiferente, pones la que te haga falta y puedes complicar esa parte hasta donde llegue tu imaginación.

La técnica del Subclasing es buena idea si se va a hacer para casos aislados. En caso contrario es mejor escribir un componente.



Saludos.

Última edición por escafandra fecha: 30-12-2022 a las 02:40:37.
Responder Con Cita