Справочник по компонентам 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;