Страница 14 из 39 Положение, размеры и выравнивание элементов управления О каждом визуальном компоненте должно быть известно, где он будет показан и какой будет иметь размер. Свойство 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; |