Справочник по компонентам Delphi. Часть 1
Страница 14. Положение, размеры и выравнивание элементов управления


 

Положение, размеры и выравнивание элементов управления

О каждом визуальном компоненте должно быть известно, где он будет показан и какой будет иметь размер. Свойство

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: Integers-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; rO, 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;

rO := ClientWidth/ClientHeight;

rl := LastPos.X/LastPos.Y;

r2 := LastPos.X/(ClientHeight - LastPos.Y);

with Panell do if rl < rO then if r2 < rO

then Align := alLeft else

Align := alBottom else if r2 < rO

then Align := alTop else Align := alRight;

Formi.EnableAlign;
end;
end;
 
 
« Предыдущая статья   Следующая статья »