How To Modify the Behaviour of a Component without Subclassing

I needed links "à la" IE for a form. So I basically needed a TLabel but "TabStopable" and the TStaticText qualifies for that. But it doesn't draw a FocusRect when focused. Here is my solution.

interface

type
  TStaticText = class(StdCtrls.TStaticText)
  private
    procedure DrawFocusRect;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMSetFocus); message WM_KILLFOCUS;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;

// all the components of that form will inherited from my modified
// TStaticText

  TDataBrowseForm = class(TForm)
    Label1: TStaticText;
    Label2: TStaticText;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

....

implementation

....

procedure TStaticText.DrawFocusRect;
var
  DC: HDC;
begin
  DC := GetDC(Handle);
  try
    Windows.DrawFocusRect(DC, Rect(1, 1, Width-1, Height -1));
  finally
    ReleaseDC(Handle, DC);
  end;
end;

procedure TStaticText.WMKillFocus(var Message: TWMSetFocus);
begin
  inherited;
  DrawFocusRect;
end;

procedure TStaticText.WMPaint(var Message: TWMPaint);
begin
  inherited;
  if Focused then
    DrawFocusRect;
end;

procedure TStaticText.WMSetFocus(var Message: TWMSetFocus);
begin
  inherited;
  DrawFocusRect;
end;
sample.gif

 

Share this article!

Follow us!

Find more helpful articles: