На этом шаге мы продолжим изучение некоторых событий и методов класса
TControl.
Полный перечень свойств, методов и событий приведен на шаге 16.
О каждом визуальном компоненте должно быть известно, где он будет
показан и какой будет иметь размер. Свойство:
property BoundsRect: TRect;
определяет прямоугольник, содержащий координаты верхнего левого и правого
нижнего углов
компонента в системе координат клиентской области родительского элемента.
Для формы верхний
левый угол выражен в системе координат экрана.
Также можно установить положение и размер компонента, изменяя координаты
верхнего левого
угла, длины и ширины методом:
procedure setBounds (ALeft, ATop, AWidth, AHeight: Integer);.
К каждой из этих величин есть и раздельный доступ во время разработки с
помощью свойств:
property Left: Integer; property Top: Integer; property Width: Integer; property Height: Integer; .
Другое свойство задает прямоугольник, определяющий положение и размеры
клиентской области
окна элемента управления:
property ClientRect: TRect; .
Эта величина доступна только для чтения. Если необходимо переустановить
размеры клиентской области, нужно воспользоваться парой свойств:
property ClientHeight: Integer; property ClientWidth: Integer; .
Свойство ClientOrigin задает положение начала клиентской области
относительно экрана:
property ClientOrigin: TPoint; .
Если же нужно связать с координатной системой экрана произвольную точку,
пользуйтесь парой
методов (не путать с одноименными функциями Windows API):
function ClientToScreen (const Point: TPoint): TPoint; function ScreenToClient (const Point: TPoint): TPoint; .
Очень важную часть работы по управлению размерами и расположением
элементов выполняет свойство:
property Align: TAlign; .
Оно определяет выравнивание компонента относительно границ родителя.
Может принимать одно из
предопределенных значений:
TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);:
- alNone - выравнивание отсутствует;
- alTop, alBottom, alLeft, alRight - выравнивание происходит по
соответствующей стороне
родителя; - alClient - компонент занимает все пространство клиентской области
родителя.
Выравнивание гарантирует, что при изменении размеров родителя
относительная позиция дочернего
элемента не меняется. Это свойство имеет приоритет над
простым изменением положения и
размеров. Если новые координаты элемента противоречат способу его
выравнивания (например,
перемещение вверх при alBottom), изменения отвергаются и элемент
возвращается к первоначальным
координатам. Свойство Align незаменимо при организации панелей
инструментов и
строк состояния: они могут перемещаться и видоизменяться вместе с
содержащей их
формой.
Для временного отключения действия свойства Align предназначены
методы:
procedure DisableAlign; procedure EnableAlign; .
Эти методы управляют возможностью выравнивания потомков данного
элемента, они должны вызываться
в паре. Для восстановления выравнивания элементов в соответствии с
Align есть
метод:
procedure Realign; .
В следующем примере использование методов DisableAlign и
EnableAlign позволяет
настроить выравнивание панели (компонента TPanel) по тому краю
формы, на который
пользователь перетащит ее мышью.
Внешний вид приложения показан на рисунке 1:
Рис.1. Внешний вид приложения
Приведем текст модуля:
unit Un_Al; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; procedure FormCreate(Sender: TObject); procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Moving: Boolean; //Флаг разрешения/запрещения перетаскивания. implementation {$R *.dfm} //Задание начальных значений. procedure TForm1.FormCreate(Sender: TObject); begin Panel1.Align := alBottom;//Выравнивание по умолчанию. Moving := False;//Перетаскивания нет. end; //Начало перетаскивания. procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not Moving then begin Form1.DisableAlign; //Запретить выравнивание. Moving := True; //Перетаскивание началось. end; end; //Процесс перетаскивания. procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Moving then with Panel1 do begin //Вычисление новых координат панели. Left := Left + X - Width div 2; Top := Top + Y - Height div 2; //Их вывод. Panel1.Caption := Format('%d,%d',[Left, Top]); end; end; //Завершение перетаскивания. procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var LastPos : TPoint; r0, rl, r2 : real; begin if Moving then begin Moving := False; Panel1.Caption := ' '; //Вычисление новых координат. LastPos := Point(Panel1.Left + X, Panel1.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 Panel1 do if rl < r0 then if r2 < r0 then Align := alLeft else Align := alBottom else if r2 < r0 then Align := alTop else Align := alRight; Form1.EnableAlign; //Включить выравнивание. end; end; end.
Текст этого примера можно взять здесь.
На следующем шаге мы рассмотрим активность и видимость элементов
управления.