Справочник по компонентам Дельфи

Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа

Описание работы

Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.

Работа содержит 1 файл

componens.doc

— 980.33 Кб (Скачать)

Есть еще один способ получения подсказки. При смене текста в свойстве Hint, т. е. при смене текущего элемента управления, у Application возникает событие:

(РЙ property OnHint: TNotifyEvent;

Пример:

procedure TFormI.AppHint(Sender: TObject);

begin

Pane 11.Caption:= Application.Hint ;

end;

procedure TFormI.FormCreate(Sender: TObject);

begin

Application.OnHint := AppHint;

end;

В этом примере текст подсказки будет отображаться в строке состояния Panel 1 независимо от значения ShowHint у любого объекта -- лишь бы этот текст был в наличии. Для этого разделяйте подсказку у элементов управления вашего приложения на две части при помощи символа '|' -- краткая информация появится рядом с элементом, а более полная -- в строке состояния.

У других компонентов свойство ShowHint интерпретируется системой так:

когда курсор мыши останавливается над элементом управления или пунктом меню, и приложение не занято обработкой сообщения, происходит проверка, и если ShowHint у элемента или у одного из его родительских элементов в иерархии равно True, то запускается специальный таймер на интервал времени HintPause:

(Pb) property HintPause: Integer;

Интервал времени по умолчанию равен 800 мс. После истечения времени таймера, если мышь осталась над тем же элементом, наступает момент

инициализации окна подсказки. При этом программист может получить управление, предусмотрев обработчик события

(Pl) property OnShowHint: TShowHintEvent ;

TShowHintEvent = procedure (var HintStr: string; var CanShow:

Boolean; var Hintlnfo: THintInfo) of object;

с параметрами:

HintStr -- отображаемый текст;

CanShow -- необходимость (возможность) появления подсказки. Если в переменной CanShow обработчик вернет False, то окно подсказки высвечиваться не будет;

Hintlnfo -- структура, несущая всю информацию о том, какой элемент управления, где и как собирается показать подсказку. Ее тип:

THintInfo = record

HintControl: TControl;

HintPos: TPoint;

HintMaxWidth: Integer;

HintColor: TColor;

CursorRect: TRect;

CursorPos: TPoint;

end;

Для показа окна подсказки необходимо еще, чтобы у элемента управления или у его предков в цепочке строка Hint была непустой. Впрочем, это можно исправить в обработчике OnShowHint, пример:

procedure TFormI.AppShowHint(var HintStr: string; var CanShow:

Boolean; var Hintlnfo: THintInfo);

begin if HintStr='' then

begin

HintStr := Hintlnfo.HintControl.Name;

Hintlnfo.HintColor := ciRed;

CanShow := True ;

end;

end;

Присвоив этот метод обработчику Application.OnShowHint, установив Forml.ShowHint:=True и очистив все строки Hint, получим в качестве подсказки имя каждого элемента.

"Спрятать" окно подсказки можно с помощью метода:

procedure CancelHint;

Без повторного перемещения мыши на текущий элемент оно более не возникнет.

 

Оконные элементы управления

Понятие окна Windows инкапсулировано в потомке TControl -- классе TWinControl. Такой компонент получает соответствующий атрибут _ дескриптор окна, определяемый свойством:

(Ro) property Handle: HWnd;

С помощью этого дескриптора вы можете вызывать функции API Windows, если средств VCL вам недостаточно для решения задачи. Компоненты-потомки TWinControl -- в дальнейшем будем называть оконными элементами управления, а элементы управления, не имеющие дескриптора окна, -- неоконными.

Возможны ситуации, когда компонент уже создан, но еще не имеет дескриптора как окно. Два метода управляют созданием дескриптора:

function HandleAllocated:Boolean;

procedure HandleNeeded;

Первая сообщает о наличии выделенного дескриптора, а вторая при его отсутствии посылает запрос на его выделение. Такой метод должен применяться перед каждой операцией, требующей дескриптора.

Важным свойством TWinControl является то, что он может содержать другие -- дочерние -- элементы управления. Они упорядочены в виде списка. Если быть точным, то списков на самом деле два -- для неоконных и оконных дочерних элементов. Но "видны" они как один объединенный -- сначала первый, потом второй. Методы и свойства для работы с этим списком приведены в таблице:

 

 

(Ro) property Controls[Index: Integer]: TControl;

Содержит список дочерних элементов.

(Ro) property ControlCount: Integer;

Содержит число элементов в списке.

function ContainsControl(Control: TControl): Boolean;

Проверяет наличие элемента в списке.

function ControlAtPos(const Pos: TPoint; AllowDisabled: Boolean): TControl ;

Отыскивает в списке элемент, которому принадлежит заданная точка (в системе координат собственной клиентской области). Флаг AllowDisabled показывает, разрешен ли поиск среди пассивных (свойство Enabled которых равно False) элементов.

procedure InsertControl(AControl: TControl) ;

Вставляет элемент в конец списка.

procedure RemoveControl(AControl: TControl);

Удаляет элемент из списка.

procedure Broadcast(var Message);

Рассылает всем дочерним элементам из списка сообщение Message.


 

С каждым оконным компонентом можно связать контекстную помощь. Контекст помощи -- это индекс, указывающий на определенную информацию в файле справочной системы, связанном с приложением:

property HelpContext: THelpContext;

Когда компонент находится в фокусе, то при нажатии клавиши <F1> загружается система контекстной помощи, и пользователь сразу получает информацию, связанную с заданным контекстом. Если контекст равен нулю, то система пытается отыскать в цепочке родительских компонентов первый, имеющий ненулевой контекст.

Оконный компонент может управлять положением и размерами своих дочерних компонентов.

Прокрутку (скроллинг) элементов на интервал DeltaX, DeltaY осуществляет метод:

procedure ScrollBy(DeltaX, DeltaY: Integer);

Прибегая к вызову этой процедуры, можно при желании осуществить прокрутку нестандартным способом, т. е. без привлечения полос прокрутки. Приведенный ниже фрагмент кода -- составная часть примера IMGSCROL на дискете-- позволяет "тащить" изображение Imagel вслед за мышью с нажатой кнопкой:

type

TMouseState = (msNormal, msDragging);

var

OldPos, NewPos, MaxShift: TPoint;

PMouseState : TMouseState;

procedure TFormI.ScrollMouseDown(Sender: TObject;

Button: TMouseButton;

Shift: TShiftState; X, Y: Integers-begin

MaxShift.X := Imagel.Parent.Width - Imagel.Width;

MaxShift.Y := Imagel.Parent.Height - Imagel.Height;

if (MaxShift.X > 0) and (MaxShift.Y > 0) then Exit;

FMouseState := msDragging;

OldPos := Point(X, Y) ;

Screen.Cursor := crDrag;

end;

procedure TFormI.ScrollMouseMove(Sender : TObject;

Shift: TShiftState; X, Y: Integers-begin

if FMouseState = msDragging then begin

NewPos := Point(X - OldPos.X, Y - OldPos.Y) ;

if Imagel.Left + NewPos.X > 0 then NewPos.X := - Imagel.Left;

if Imagel.Left + NewPos.X < MaxShift.X

then NewPos.X := MaxShift.X - Imagel.Left;

if Imagel.Top + NewPos.Y > 0 then NewPos.Y := - Imagel.Top;

if Imagel.Top + NewPos.Y < MaxShift.Y

then NewPos.Y := MaxShift.Y - Imagel.Top;

Imagel.Parent.ScrollBy(NewPos.X, NewPos. Y) ;

end;

end;

procedure TFormI.ScrollMouseUp(Sender: TObject;

Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

FMouseState -.= msNormal;

Screen.Cursor := crDefault;

end;

Обратите внимание, что прокрутка неоконного компонента Imagel осуществляется посредством вызова Image l.Parent.ScrollBy. Это свидетельствует о том, что конкретный родительский тип для этого безразличен. В примере изображение помещено на панель (TPanel). Впрочем, метод ScrollBy используется также и полосами прокрутки, которые есть в компоненте TScrollingWinControl и его потомках, например, в TForm.

В VCL предусмотрена возможность написания приложений, которые будут сохранять относительный размер и положение при всех разрешениях дисплея. Более подробно эти механизмы описаны в разделе, посвященном формам; для TWinControl упомянем лишь метод

procedure ScaleBy(M, D: Integer);

который изменяет масштаб элемента управления в M/D раз, при этом верхний левый угол остается неподвижным. Так же изменяются и размеры всех дочерних элементов. Соответственно изменяется и масштаб шрифта (свойство Font). Флаги csFixedWidth и csFixedHeight в свойстве ControlStyle предотвращают изменение ширины или высоты.

При изображении большинства оконных элементов управления используют эффект "трехмерности", создающий иллюзию приподнятости или вдавленное™ за счет подбора внешнего вида обрамления. Наличие "трехмерности" задается свойством:

(РЙ property Ctl3D: Boolean;

Нужно уточнить, что это свойство есть не у всех компонентов. Для части компонентов трехмерность реализована средствами VCL; другая же часть (радиокнопки, флажки и др.) требует для создания трехмерного эффекта доступа к библиотеке CTL3DV2.DLL.

Шрифт, которым выводится текст, связанный с элементом управления:

property Font: TFont;

Кисть, используемая для закрашивания рабочей области оконного элемента управления, представлена свойством:

(Ro) property Brush: TBrush;

Она имеет цвет, содержащийся в свойстве Color (по умолчанию clWindow). На уровне TControl оно доступно только по чтению:

property Color: TColor;

Подробно о последних двух типах см. в разделе "Графическая подсистема".

 

Реакция на события от мыши и клавиатуры

Традиционно пользователь может предусмотреть реакцию на нажатие и отпускание любой из кнопок и перемещение курсора мыши. Эти три события обеспечивают интерфейс каждого элемента управления с мышью. Первые два из них имеют формат:

(р^ property OnMouseDown: TMouseEvent;

(Pb) property OnMouseUp: TMouseEvent;

TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer) of object;

Параметры:

Sender -- элемент-источник сообщения (обычно равен Self);

Button -- идентификатор одной из кнопок;

TMouseButton = (mbLeft, mbRight, mbMiddle);

Shift -- множество, которое может содержать элементы:

ssAlt, ssCtrl, ssShift -- в зависимости от состояния этих клавиш;

ssLeft, ssRight, ssMiddle, ssDouble -- в зависимости от нажатия кнопок мыши (ssDouble -- нажать! и правая, и левая кнопки);

X, Y -- координаты нажатия (в системе координат клиентской области получателя).

При перемещении мыши возникает событие:

(Pb) property OnMouseMove: TMouseMoveEvent ;

TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState;

X, Y: Integer) of object;

Использование сообщений от мьшш уже встречалось в примерах, приведенных вьппе (например, см. разд. "Положение, размеры и выравнивание элементов управления").

Два события извещают о щелчке и двойном щелчке левой кнопкой мыши над компонентом:

(pt) property OnClick: TNotifyEvent;

(Pb) property OnDblClick: TNotifyEvent;

Отменить генерацию этих событий можно, удалив флаг csClickEvents из слова состояния элемента (ControlStyle). Для некоторых компонентов (например, кнопок) OnClick возникает еще и при нажатии определенных клавиш на клавиатуре, а также вследствие вызова метода Click.

События, связанные с мышью, могут быть получены потомками TControl. В отличие от них, реакцию на события от клавиатуры могут иметь только оконные элементы управления ("могут", т. к. на уровне TControl и TWinControl эти события только описаны, но не опубликованы). Таким образом, есть компоненты (в том числе в Палитре компонентов), не имеющие связи с этими событиями из-за ее ненадобности. Впрочем, их меньшинство, и материал в этом разделе обобщен вполне обоснованно.

Нажатие и отпускание клавиш клавиатуры могут инициировать следующие события:

§ property OnKeyDown: TKeyEvent;

property OnKeyUp: TKeyEvent;

eyEvent = procedure(Sender: TObject; var Key: Word;

Shift: TShiftState) of object;

Генерация этих событий встроена в обработчики сообщений Windows WMJCEYDOWN, WMJSYSKEYDOWN и WM_KEYUP, WM_SYSKEYUP соответственно. Обработчику передаются:

Sender -- источник сообщения;

Shift -- состояние специальных клавиш и кнопок мыши во время нажатия (отпускания);

Key -- код нажатой клавиши, представляющий собой виртуальный код клавиши Windows (константы вида VK_XX, например, VK_F1, VK_ESCAPE и т. п.). Обратите внимание, что Key является var-параметром; т. е. его значение может быть изменено программистом.

Другое событие, возникающее вследствие нажатия клавиши:

property OnKeyPress :. TKeyPressEvent;

TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;

Это событие возникает при вводе с клавиатуры символа ASCII, т. е. оно не генерируется, например, при нажатии функциональных клавиш или <CapsLock>. Обработчик события вызывается при нажатии буквенных (в т. ч. вместе с <Shift>), цифровых клавиш, комбинаций <Ctri>+<A> .. <Ctd>+<Z> (коды ASCII #1..#26), <Enter>, <Esc>, <Backspace>, <Ctrl>+<Break> (код #3) и некоторых других. Также код ASCII можно сгенерировать, нажав <А11>+<десятичньш код символа> на числовой клавиатуре (Numeric Pad).

Событие OnKeyPress соответствует сообщению Windows WM_CHAR.

Все сообщения клавиатуры поступают тому элементу управления, который в данный момент имеет фокус ввода. Однако из этого правила возможно одно исключение. Если у формы, которая содержит этот элемент управления, свойство

(Pb) property KeyPreview: boolean;

установлено в True, то сначала все три вида сообщений поступают к ее обработчикам, и только потом -- к элементу управления. Если при этом в них обнулить параметр Key, то в элемент сообщение не поступит вообще. В приведенном ниже примере клавиша <F5> резервируется для изменения состояния формы:

procedure TFormI.FormCreate(Sender: TObject);

begin KeyPreview := True;

end;

procedure TFonnl.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin if Key = VK_F5 then

begin

if ssCtrl in Shift then WindowState := wsNormal

else if Shift = [] then

WindowState := wsMaximized;

Key : = 0 ;

end;

end;

 

Фокус ввода

Будучи окнами Windows, TWinControl и его потомки должны управлять фокусом ввода (состоянием, когда они получают и обрабатывают входные сообщения). Они имеют предназначенные для этого методы:

Поскольку оконные и неоконные элементы управления фактически находятся в разных списках, эти операции касаются только элементов соответствующего списка. Оконные элементы всегда имеют приоритет над неоконными: вы можете поместить первый над вторым, наоборот -- никогда.

 

 

function Focused: Boolean-

Показывает, имеет ли элемент в данный момент фокус ввода.

function CanFocus: Boolean;

Возвращает True, если оконный элемент может получить фокус ввода (для этого он и все его родительские оконные элементы управления должны быть активными (Enabled) и видимыми).

procedure SetFocus;

Запрашивает у родительской формы получение фокуса ввода.


 

При получении и утере фокуса оконными компонентами происходят события:

(Pb) property OnEnter: TNotifyEvent;

(Р1э) property OnExit: TNotifyEvent;

TNotifyEvent -- простейшее событие -- извещение, не имеющее параметров. Свойство

(Pb) property TabStop: Boolean;

показывает, есть ли на данном элементе табулостоп. Между элементами формы, у которых TabStop установлено в Тше, можно передвигаться (перемещать фокус ввода) нажатиями клавиш <Tab>/<Shift>+<Tab>. Очередность перехода фокуса определяется специальным списком. Положение элемента управления в родительском списке табулостопов определяется при помощи свойства:

Информация о работе Справочник по компонентам Дельфи