- •Пустая форма и ее модификация
- •Настройка Delphi
- •Имена в Delphi
- •Изменение свойств формы
- •Размещение нового компонента
- •Реакция на события
- •Модификация формы
- •Обработчик события OnClick
- •Динамическое изменение свойств компонента
- •Некоторые итоги
- •Событие OnActivate
- •Событие OnClose
- •Событие OnCloseQuery
- •Событие OnCreate
- •Событие OnDestroy
- •Событие OnHide
- •Событие OnPaint
- •Событие OnResize
- •Событие OnShow
- •Свойства класса tComponent
- •Методы класса tComponent
- •Свойства класса tControl
- •Методы класса tControl
- •События класса tControl
- •Свойства класса tWinControl
- •Методы класса tWinControl
- •События класса tWinControl
- •Свойства класса tApplication
- •Методы класса tApplication
- •События класса tApplication и их обработка
- •Свойства класса tStrings
- •Методы класса tStrings
- •Размещение фрейма на палитре компонентов
События класса tControl
В классе TControl, в отличие от предшествующих ему в иерархии, описаны не только свойства и методы, но и следующие события:
Таблица 3. События класса TControl |
|
Событие |
Описание |
property OnClick: TNotifyEvent; |
Событие при щелчке на компоненте и некоторых других действиях пользователя. |
property OnDblClick: TNotifyEvent; |
Событие при двойном щелчке на компоненте. |
property OnDragDrop: TDragDropEvent; type TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object; |
Событие при отпускании перетаскиваемого компонента. |
property OnDragOver: TDragOverEvent; type TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object; |
Событие при перетаскивании объекта над компонентом. |
property OnEndDrag: TEndDragEvent; type TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object; |
Событие при окончании или прерывании перетаскивания. |
property OnMouseDown: TMouseEvent; type TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; |
Событие при нажатии кнопки мыши над объектом. |
property property OnMouseMove: TMouseMoveEvent; type TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object; |
Событие при перемещении указателя мыши над объектом. |
property OnMouseUp: TMouseEvent; |
Событие при отпускании нажатой кнопки мыши над объектом. |
property property OnStartDrag: TStartDragEvent; type TStartDragEvent = procedure(Sender: TObject; var DragObject: TDragObject) of object; |
Событие при начале перетаскивания объекта. |
Потомком TComponent является класс TControl - элемент управления Windows. Все то, что видит (или может увидеть) пользователь в клиентской области формы во время выполнения, порождено от класса TControl. Заметим, чтоклиентская область - вся рабочая поверхность окна Windows, исключая заголовок, полосу меню и обрамление. Таким образом, потомки TControl являются визуальными компонентами. Далее будем называть их, как принято в Windows,элементами управления, или, где это уместно, просто элементами.
Напомним, что определить владельца компонента можно, воспользовавшись свойством Owner, а свойство Parentтипа TWinControl позволяет узнать его родителя.
Элемент управления может обрабатывать сообщения Windows. Чтобы послать собственной функции обработки элемента сообщение Windows вида Msg с параметрами WParam и LParam, можно воспользоваться методом:
function Perform (Msg, WParam: Word; LParam: LongInt): LongInt; .
С каждым элементом управления связан некий текст, который может играть роль заголовка или редактироваться. В зависимости от роли текст может содержаться в свойствах:
property Caption: TCaption; TCaption = string[255];
либо
property Text: TCaption; .
He задумываясь о том, в каком именно свойстве содержится текст, получить доступ к нему можно посредством методов:
function GetTextBuf (Buffer: PChar; BufSize: Integer): Integer;
procedure SetTextBuf (Buffer: PChar);
function GetTextLen: Integer;
Все три метода работают, посылая в собственную функцию-обработчик сообщений объекта (через вызов методаPerform) сообщения Windows вида: WM_GETTEXT, WM_SETTEXT и WM_GETTEXTLENGTH.
Курсор, который будет устанавливаться на компоненте, определен свойством:
property Cursor: TCursor; TCursor = -32768..32767; .
О курсорах мы говорили при изучении класса TScreen.
У каждого элемента есть два свойства, отражающие его стиль и состояние. Первый из них - набор флагов, управляющих поведением компонента:
property ControlStyle: TControlStyle;
TControlStyle = Set of (csAcceptsControls, csCaptureMouse,
csDesignInteractive, csClickEvents, csFramed,
csSetCaption, csdpague, csDoubleClicks,
csFixedWidth, csFixedHeight); .
Их описание приведено в следующей таблице:
Таблица 1. Описание флагов TControlStyle |
|
Флаг |
Описание |
csAcceptsControls |
Может содержать другие (дочерние) элементы управления. Таким свойством обладают не все элементы: обладающие им элементы называются группирующими. |
csCaptureMouse |
Может получать сообщения от мыши. |
csDesignlnteractive |
Транслирует нажатия правой кнопки мыши в нажатия левой во время разработки приложения. |
csFramed |
Имеет обрамление (черным прямоугольником единичной толщины). |
csSetCaption |
Позволяет при изменении имени менять синхронно и свойство Text (если Text не был явно переустановлен). |
csOpaque |
Фон элемента непрозрачен. Это означает, что при пересечении нескольких компонентов на экране компонент, расположенный под ним, виден не будет. |
csClickEvents |
Воспринимает щелчки мышью. |
csDoubleClicks |
Воспринимает двойные щелчки мышью. Если этот флаг отсутствует, двойные щелчки воспринимаются как простые. |
csFixedWidth csFixedHeight |
Имеет фиксированную ширину или высоту соответственно. Она не изменяется при масштабировании компонента. |
Набор флагов, отражающих состояние элемента, описывается свойством:
property ControlState: TControlState;
TControlState = Set of (csLButtonDown, csClicked,
csPalette, csReadingState, csAlignmentNeeded,
csFocusing, csCreating); .
Они означают следующее:
Таблица 2. Описание флагов TControlState |
|
Флаг |
Описание |
csLButtonDown |
Над элементом в данный момент нажата левая кнопка мыши. |
csClicked |
Если элемент может воспринимать щелчки мышью, этот флаг устанавливается, пока кнопка мыши находится в нажатом состоянии. |
csPalette |
Элемент поддерживает собственную палитру и должен получать извещения о перерисовке в необходимых случаях. |
csReadingState |
Элемент в данный момент читается из потока. |
csAlignmentNeeded |
Элемент требует выравнивания относительно родительского компонента. |
csFocusing |
В данный момент происходит получение элементом фокуса ввода. |
csCreating |
Элемент создается (этот флаг в настоящий момент не задействован). |
Свойства ControlStyle и ControlState можно читать для получения информации об элементе управления, но изменять их стоит только тогда, когда вы четко представляете, к чему это приведет.
Подавляющее большинство элементов управления имеет собственное всплывающее меню, появление которого связано с нажатием правой кнопки мыши. Доступ к нему возможен через свойство:
property PopupMenu: TPopupMenu; .
О каждом визуальном компоненте должно быть известно, где он будет показан и какой будет иметь размер. Свойство:
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:
свойства, методы и события класса TWinControl. Класс TWinControl является базовым абстрактным классом для всех оконных компонентов Delphi, то есть для тех компонентов, которые:
могут получать фокус во время выполнения приложения. Другие компоненты могут отображать данные, но пользователь не может общаться с компонентом с помощью клавиатуры, если это не оконный компонент;
могут содержать другие компоненты, то есть быть компонентами-контейнерами, компонентами-родителями других, дочерних компонентов;
имеют дескрипторы окна.
Новые компоненты редко создаются непосредственно на основе TWinControl. Обычно они основываются на производных классах, таких, как TCustomControl, имеющий канву и обработку сообщений прорисовки, или на более специализированных классах типа TButtonControl, TCustomComboBox, TCustomEdit или TCustomListBox.
