Справочник по компонентам Delphi. Часть 1 - Положение, размеры и выравнивание элементов управления
ОГЛАВЛЕНИЕ
Положение, размеры и выравнивание элементов управления
О каждом визуальном компоненте должно быть известно, где он будет показан и какой будет иметь размер. Свойство
property BoundsRect: TRect;
определяет прямоугольник, содержащий координаты верхнего левого и правого нижнего углов компонента в системе координат клиентской области родительского элемента. Для формы верхний левый угол выражен в системе координат экрана. Также можно установить положение и размер компонента, изменяя координаты верхнего левого угла, длины и ширины методом:
procedure SetBounds(ALeft, АТор, AWidth, AHeight: Integer);
К каждой из этих величин есть и раздельный доступ во время разработки с помощью свойств:
(pb) property Left: Integer; J property Top: Integer; property Width: Integer;
(Pb) property Height: Integer;
Другое свойство задает прямоугольник, определяющий положение и размеры клиентской области окна элемента управления:
(Ro) property ClientRect: TRect;
Эта величина доступна только для чтения. Если необходимо переустановить размеры клиентской области, нужно воспользоваться парой свойств:
property ClientHeight: Integer;
property ClientWidth: Integer;
Свойство ClientOrigin задает положение начала клиентской области относительно экрана:
(Ro) property ClientOrigin: TPoint;
Если же нужно связать с координатной системой экрана произвольную точку, пользуйтесь парой методов (не путать с одноименными функциями Windows API):
function ClientToScreen(const Point: TPoint): TPoint;
function ScreenToClient(const Point: TPoint): TPoint;
Очень важную часть работы по управлению размерами и расположением элементов выполняет свойство:
(Pb) property Align: TAlign;
Оно определяет выравнивание компонента относительно границ родителя. Может принимать одно из предопределенных значений:
TAlign = (aiNone, alTop, alBottom, alLeft, alRight, alClient); aINone — выравнивание отсутствует;alTop, alBottom, alLeft, alRight — выравнивание происходит по соответствующей стороне родителя;
alClient — компонент занимает все пространство клиентской области родителя.
Выравнивание гарантирует, что при изменении размеров родителя относительная позиция дочернего элемента не меняется. Это свойство имеет приоритет над простым изменением положения и размеров. Если новые координаты элемента противоречат способу его выравнивания (например, перемещение вверх при alBottom), изменения отвергаются и элемент возвращается к первоначальным координатам. Свойство Align незаменимо при организации панелей инструментов и строк состояния — они могут перемещаться и видоизменяться вместе с содержащей их формой. Для временного отключения действия свойства Align предназначены методы:
procedure DisableAlign; procedure EnableAlign;
Эти методы управляют возможностью выравнивания потомков данного эле-мекга, они должны вызьшаться в паре. Для восстановления выравнивания элементов в соответствии с Align есть метод:
procedure Realign;
В следующем примере использование методов DisableAlign и EnableAlign позволяет настроить выравнивание панели по тому краю формы, на который пользователь перетащит ее мышью:
procedure TFormI.FormCreate(Sender: TObject);
begin
Panell.Align := alBottom;
Moving := False;
end;
procedure TFormI.PanellMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if not Moving then
begin
Formi.DisableAlign;
Moving := True;
end;
end;
procedure TFonnl.PanellMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer)
begin
if Moving then with Panell do
begin
Left := Left + X - Width div 2;
Top := Top + Y - Height div 2;
Panell.Caption := Format('%d,%d',[Left,Top]);
end;
end;
procedure TFormI.PanellMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
LastPos : TPoint;
r0, rl, r2 : real;
begin
if Moving then
begin
Moving := False;
Panell.Caption := '';
LastPos := Point(Panell.Left + X, Panell.Top + Y);
if LastPos.X<=0 then
LastPos.X := 1;
if LastPos.X>=ClientWidth
then LastPos.X := ClientWidth-1;
if LastPos.Y<=0
then LastPos.Y := 1;
if LastPos.Y>=ClientHeight
then LastPos.Y := ClientHeight-1;
r0 := ClientWidth/ClientHeight;
rl := LastPos.X/LastPos.Y;
r2 := LastPos.X/(ClientHeight - LastPos.Y);
with Panell do
if rl < r0 then
if r2 < r0 then
Align := alLeft
else
Align := alBottom
else
if r2 < r0 then
Align := alTop
else
Align := alRight;
Formi.EnableAlign;
end;
end;