Edge on a Tedit

Asked

Viewed 775 times

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?

  • 1

    The component itself has an edge, it would not be the case to just change edge style of bsSingle for bsNone?

2 answers

0

The component itself has an edge, you can control bsSingle edge style for bsNone. But for this I should put all the Tedit with the style bsNone, if this is not the case you can also use a Tshape.

Add a Tshape on top of Tedit so it gets 1 pixel larger in all directions. Estate Brush define Style as bsClear and the property Pen change the color as intended to be displayed.

Then control with ShapeX.Visible := True/False as needed.

0

you can check if when your Tedit.Text is different from empty you disable the edge and also click the cancel button.

if TEdit.Text <> '' then
  TEdit.BorderStyle := bsNone;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.