Как нарисовать рамку фокуса

Для начала нужно создать объект TShape в событии OnCreate формы и придать ему свойства:
uses
{ ... }, ExtCtrls;
var
Form1: TForm1;
focusRect: TShape;
{ ... }
procedure TForm1.FormCreate(Sender: TObject);
begin
focusRect := TShape.Create(self) ;
focusRect.Shape := stRectangle;
focusRect.Visible := false;
focusRect.Brush.Style := bsClear;
focusRect.Pen.Style := psDot;
focusRect.Pen.Color := clRed;
focusRect.Pen.Width := 1;
Screen.OnActiveControlChange:= ActiveControlChange;
end;
Примечание: переменная focusRect типа TShape объявляется в объявлении переменной формы. Теперь, когда фокус переходит от одного управления к другому, мы также передвигаем рамку фокуса.
Мы будем использовать процедуру ActiveControlChange, обрабатывая событие OnActiveControlChange глобального объекта Screen.
private
{ Private declarations }
procedure ActiveControlChange(Sender: TObject);
{ ... }
procedure TForm1.ActiveControlChange(Sender: TObject);
begin
with focusRect do
begin
Parent := Screen.ActiveControl.Parent;
Top := Screen.ActiveControl.Top - 2;
Height := Screen.ActiveControl.Height + 4;
Left := Screen.ActiveControl.Left - 2;
Width := Screen.ActiveControl.Width + 4;
Visible := true;
end;
end;
Размеры объекта focusRect подстраиваются под размеры активного управления, как мы и написали выше в коде. Ну и наконец, нужно освободить память при закрытии приложения. Никогда не забывайте делать это!
procedure TForm1.FormDestroy(Sender: TObject); begin Screen.OnActiveControlChange:= nil; focusRect.Free; end;
Комментарии