0
I need to put an edge on the Tedit of a record, when this field is required and is empty at the time of saving the record.
I have already put the edge, but I’m not able to disable it when the field is filled or the registration canceled.
Below follows the code I use to create this border.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBCtrls, Mask;
type
TEdit = class(StdCtrls.TEdit)
procedure MessagePaint(var Msg: TWMPaint); message WM_PAINT;
procedure SetBorder(AColor: TColor);
procedure PaintEdit(DC: HDC; ARect: TRect; EColor, BColor: TColor);
procedure ChecarValorInvalido(VRequerido: Boolean);
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
procedure WMKEYUP(var Message: TWMPaint); message WM_KEYUP;
private
FPaintedRed: Boolean;
FRequired: Boolean;
FRequeridoOld: Boolean;
FColorBorda : TColor;
public
property Requerido: Boolean read FRequired write FRequired;
end;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// TEdit's metodes
procedure TEdit.SetBorder(AColor: TColor);
var
Canvas: TCanvas;
begin
Canvas := TCanvas.Create;
try
Canvas.Handle := GetWindowDC(Handle);
Canvas.Pen.Style := psSolid;
Canvas.Pen.Color := AColor;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(0, 0, Width, Height);
finally
ReleaseDC(Handle, Canvas.Handle);
Canvas.Free;
end;
end;
procedure TEdit.MessagePaint(var Msg: TWMPaint);
var
DC: HDC;
Rect: TRect;
begin
inherited;
if (Requerido) and (Length(Trim(Text)) = 0) then begin
FPaintedRed := true;
DC := GetWindowDC(Handle);
try
Windows.GetClientRect(Handle, Rect);
PaintEdit(DC, Rect, clWindow, clRed);
finally
ReleaseDC(Handle, DC);
end;
end
else
FPaintedRed := false;
end;
procedure TEdit.PaintEdit(DC: HDC; ARect: TRect; EColor, BColor: TColor);
var
WindowColor: TColor;
BorderColor: TColor;
begin
WindowColor := EColor; // Color of TEdit
BorderColor := BColor; // Border Color of TEdit
if not Enabled then begin
WindowColor := clBtnFace;
BorderColor := clBtnShadow;
end;
InflateRect(ARect, 4, 4);
Brush.Color := WindowColor;
Windows.FillRect(DC, ARect, Brush.Handle);
SetBorder(BorderColor);
end;
procedure TEdit.ChecarValorInvalido(VRequerido: Boolean);
begin
Requerido := VRequerido;
FRequeridoOld := VRequerido;
if Requerido and (Length(Trim(Text)) = 0) then begin
if not FPaintedRed then
Invalidate;
end
else if FPaintedRed then
Invalidate;
end;
procedure TEdit.CMTextChanged(var Message: TMessage);
begin
inherited;
ChecarValorInvalido(FRequeridoOld);
end;
procedure TEdit.WMKEYUP(var Message: TWMPaint);
begin
inherited;
ChecarValorInvalido(FRequeridoOld);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.ChecarValorInvalido(True);
end;
end.
Previously in the function that draws the rectangle I put this way Canvas.Rectangle(ClientRect)
, working correctly, but the rectangle was only inside Edit.
Someone has a solution to this situation?
The component itself has an edge, it would not be the case to just change edge style of
bsSingle
forbsNone
?– Junior Moreira