PDA

Ver la Versión Completa : Cambiar el color de la fuente en campos deshabilitados


sur-se
21-09-2006, 11:31:05
Hola.
Cuando deshabilito un campo edit, este adopta un color de fuente gris y me gustaría poder controlarlo para que dejarlo en negro u otro color.
Tengo un componente hecho heredado de él, y me gustaría poder configurar el campo cuando queda deshabilitado.

Un saludo.

Neftali [Germán.Estévez]
21-09-2006, 11:46:25
TEdit deriva de TControl y TControl tiene el procedimiento SetEnabled de acceso a la propiedad Enabled como virtual, por lo tanto deberías poder sobreescribirlo.

Prueba a sobreescribir este procedimiento (override) en tu componente y cambiar el color de la fuente después de llamar al inherited.

¿Me expliqué bien?

sur-se
21-09-2006, 12:25:11
No funciona eso. Es lo primero que hice, pero no va. Parece que al pintar el componente tiene fijado ese color de fuente.
¿La alternativa parece que pasará por pintar yo el texto dentro del campo y con el color del font correcto?

Un saludo.

Neftali [Germán.Estévez]
21-09-2006, 13:18:31
¿La alternativa parece que pasará por pintar yo el texto dentro del campo y con el color del font correcto?

Parece el siguiente paso (a mi así de pronto no seme ocurre otro); Puedes probar con alguno de estos:


procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;


Ambos en TWinControl.

sur-se
21-09-2006, 19:24:22
Bueno, pues al final lo he hecho de la forma siguiente:



type
TMiEdit = class(TEdit)
...

procedure WMPAINT(var Msg : TMessage); message WM_PAINT;

....

procedure TMiEdit.WMPAINT(var Msg: TMessage);
begin
inherited;
if not enabled then Pintar_Texto;
end;

procedure TMiEdit.Pintar_Texto;
var
DC : HDC;
Canvas: TCanvas;
ps: TPaintStruct;
CallEndPaint: Boolean;
R:TRect;
begin
DC := GetWindowDC(Self.Handle);
R:=ClientRect;
CallEndPaint := False;
Canvas:=TCanvas.Create;
try
if DC <> 0 then
begin
Canvas.Handle := DC;
ps.fErase := true;
end
else
begin
BeginPaint(Handle, ps);
CallEndPaint:= True;
Canvas.handle := ps.hdc;
end;
if ps.fErase then Perform(WM_ERASEBKGND, Canvas.Handle, 0);
SaveDC(canvas.handle);
try
Canvas.Brush.Style := bsClear;
Canvas.Font := Font;
Canvas.Font.Color := clBlack;
Canvas.TextRect(R,3,3,text);
finally
RestoreDC(Canvas.Handle, - 1);
end;
finally
if CallEndPaint then
EndPaint(handle, ps);
Canvas.Free;
ReleaseDC(Self.handle,DC);
end;
end;



Así va bien.
Salu2.