    ЧАСТЬ II 

    Разработка приложений 

    6.    Использование компонентов Delphi 
    7.    Общие элементы управления Win32 
    8.    Создание приложений 

    ГЛАВА 6

    Использование компонентов Delphi 

    Марк Причард 

    На заметку 
    Визуальные компоненты в палитре компонентов Delphi обычно называются 
элементами управления, возможно, потому, что они используются для управления 
прикладной программой. Как и следовало ожидать, из этого правила есть 
исключения: элемент управления OLE/ActiveX может быть невидимым и не 
реагировать на ввод с клавиатуры или мыши! Об элементе управления 
OLE/ActiveX более подробно рассказывается в главах 18-21. 

    компонент— неотъемлемая часть прикладной программы в Delphi. Компоненты 
формируют основу интерфейса пользователя в прикладной программе и позволяют 
быстро и с минимальными усилиями разрабатывать сложные программы с 
дружественным интерфейсом. 
    В окне Delphi содержатся пиктограммы всех главных объектов в объектной 
иерархии. Благодаря этому оно не только красиво выглядит, но и является 
чрезвычайно информативным. 
    Компоненты для разработки интерфейса и системные компоненты называются 
соответственно визуальными и невизуальными. 
    В Компоненты интерфейса (визуальные) видны как во время разработки, так и 
во время выполнения. Они могут отображать данные и воспринимать ввод 
(координаты) мыши. Более сложные визуальные компоненты позволяют вводить 
текст, выбирать элементы списка и выполнять довольно сложную обработку 
событий, связанных с мышью. Эти компоненты описываются ниже в этой главе, 
в разделе "Визуальные компоненты'". 

    Общие свойства и события 

    Благодаря своей чрезвычайной объектной ориентации большинство визуальных 
компонентов Delphi наследует функциональные свойства нескольких объектов— 
TControl, TWinControl и TGraphicControl. В данном разделе рассматриваются 
свойства этих объектов и связанные с ними события. 

    Компоненты для разработки интерфейса 

    Во многих визуальных компонентах определяются свойства и события, 
унаследованные не только от объектов TControl, TWinControl и TGraphicControl. 
Здесь рассматриваются дополнительные свойства и события, а также приводятся 
примеры использования компонентов из палитры компонентов. 

    Системные компоненты 

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

121


122  ?


    • Системные компоненты (невизуальные) видны только во время разработки. 
Вообще, невизуальные компоненты являются абстрактными для выражения большого 
набора связанных функциональных возможностей, называемых оболочками 
(wrappers). Они представляют функции косвенного вызова (callback) системного 
уровня как события компонента и записывают данные сложн ых форматов в свойства 
компонентов. Невизуальные компоненты подробно описаны в разделе "Невизуальные 
компоненты". иЖ™'Ч11 Хотя на первый взгляд это может показаться странным, 
невизуальный компонент может отображать на экране, например, диалоговое окно. 
"Невизуальное" описание просто означает, что компонент не виден во время выполнения. 
    Некоторые страницы палитры компонентов рассматриваются в других главах книги. 

    Страница CommCtrl Data Access Data Controls 

    Глава 7, "Общие элементы управления Win32" 9, "Работа с локальными базами данных" 
10, "Работа с базами данных SQL" 

    На странице палитры компонентов Win3.1 содержится несколько компонентов, 
поддерживаемых в первой версии Delphi. Соответствующие компоненты были 
заменены в следующих версиях, и их не следует использовать в новых проектах. 
    В главах 18-21 описаны компоненты, размещенные на странице ActiveX, а в 
главе 28, "Создание приложений для Web-сервера", — компоненты, находящиеся на 
странице Internet. 

    Визуальные компоненты 

    Раньше графический интерфейс пользователя (GUI) использовал базисные 
экранные элементы наподобие кнопок, полей ввода и списков. В результате 
усовершенствования интерфейса прикладных программ были добавлены кнопки 
панелей инструментов, строки состояния и диалоговые окна с вкладками для 
программ, использующих средства Windows. Операционные системы т ипа Windows 95 
добавили в проект интерфейса популярные ныне раскрывающиеся меню и трехмерные эффекты. 
    В библиотеке компонентов Delphi эти экранные элементы корректно 
преобразованы в элементы управления, которые позволяют включить их в 
прикладную программу. Вы должны позаботиться только об интуитивности и 
функциональности создаваемого интерфейса. 

    Общие свойства и события 

    Как и следовало ожидать, система Delphi — объектно-ориентирована. Это 
позволяет элементам управления совместно использовать базисные наборы 
функциональных возможностей и представлять новое поведение или настраивать 
особенности их родительского типа управления. Учитывая это, элементы 
управления TListBox, TEdit и TButton совместно используют функцио нальные 
возможности их общего предка, TControl. 
    Свойства, методы и события далеко не каждого потомка TControl являются 
доступными. Элементы управления TShape не публикуют свойство Font (Шрифт), 
потому что они не отображают текст. 

    За М 61 Ку 

    Свойства объекта TControl 

    Объект TControl обеспечивает много полезных свойств для всех элементов управления. 

    Align 

    Свойство Align — перечислимое значение, которое определяет позицию 
элемента управления и его размер внутри родительского элемента управления (или 
формы). Полезно соблюдать постоянную относительную позицию элемента 
управления, когда изменяется размер родительского элемента. В строке состояния 
окна редактора кода свойству Align присвоено значение al 
    Bottom. Нижняя часть окна заполняется независимо от его размера или позиции. 

    Глава 6. Использование компонентов Delphi 123 


    Caption 

    Свойство Caption содержит строку для определения метки элемента 
управления. Проиллюстрируем это на элементе управления TButton. Чтобы не 
утруждать пользователя созерцанием невыразительного, с закругленными углами, 
квадрата, установим свойство Caption для указания функции кнопки. На рис. 6.1 
показано стандартное диалоговое окно открытия файла с нес колькими кнопками. 
Свойство Caption кнопки Open равно &0реп. 

    На заметку 
    Подчеркнутые символы в заголовках являются горячими клавишами. Нажать 
обозначенный символ, удерживая при этом клавишу <Alt>, — это все равно что 
щелкнуть мышью на элементе управления. Чтобы определить горячую клавишу, 
поставьте символ & перед выбранным вами символом. 

    Color 

    Целочисленное свойство Color (цвет) определяет базовый цвет управления. 
Хотя и можно создавать некоторые невероятно безвкусные цветовые схемы, в 
стандартных элементах управления и формах свойство Color лучше не 
использовать. Если вы решите изменить цвет элемента управления, учтите, что 
может измениться цветовая схема рабочего стола и панели управл ения. Объекты 
ненормативного цвета не будут гармонично отражаться в новой цветовой гамме. 
Если вы просто изменили свойство Color, пробуйте использовать одно из 
перечислимых значений для различных цветов системы, например clBtnHighlight. 

    Look Ь: 

    На заметку 

    Рис. 6.1. В стандартном диалоговом окне открытия файла используется 
несколько визуальных компонентов 

    Если свойству Color присваивается значение, недоступное в текущей палитре, 
Windows синтезирует цвет (обычно это выглядит просто ужасно!). Старайтесь не 
использовать произвольных цветов, если вы не уверены, что машина пользователя 
поддерживает большое количество цветов. 

    DragCursor и DragMode 

    Эти перечислимые свойства полезны для программирования операций перетащить 
и опустить (drag-and-drop). Свойство DragCursor позволяет определить форму 
указателя мыши, когда он перемещается над элементом управления, в который 
будет помещен перетаскиваемый объект. Свойство DragMode определяет, как Delphi 
обрабатывает начало операции перетаскивания. Е сли оно установлено равным 
dm&utomatic, элемент управления можно переместить в любое время. Если оно 
установлено равным dmManual, нужно вручную начинать и заканчивать процесс перетаскивания. 

    procedure  TForml.ListBoxlClick   (Sender:   TObject); begin if 
ListBoxl.SelCount  >= 2  then 
    ListBoxl.BeginDrag(False) ; end; 

    В этом фрагменте кода свойству DragMode объекта ListBoxl типа TListBox 
присвоено значение dmManual, a свойству MultiSelect — True. Когда пользователь 
щелкает на элементе управления, обработчик события OnClick проверяет, было ли 
выбрано хотя бы два элемента из списка перед началом операции перетаскивания. 
Параметр, переданный методу BeginDrag, опре деляет, начинается ли перемещение 
немедленно (True) или ждет, пока указатель мыши переместится минимум напять 
пикселей (False). 

    124 Часть II. Разработка приложений 


    Font 

    Свойство объекта Font определяет шрифт для заголовка элемента управления 
или свойства текста. 
    Поскольку Font —это свойство объекта, нужно использовать метод Assign, 
чтобы присвоить ему новое значение. В приведенном ниже примере объекту 
назначает новый шрифт (в форме есть компонент TFontDialog, названный fntdlgSelect): 

    Font.Assign(fntdlgSelect.Font); 
    ParentColor, ParentFont и ParentShowHint 

    Эти булевы свойства указывают, что элемент управления должен брать 
значения для свойств Color (Цвет), Font (Шрифт) и ShowHint (Показывать 
подсказку) из родительского элемента управления. Применение этих свойств 
позволяет придать интерфейсу профессиональный вид. 

    PopupMenu 

    Особенно популярны в Windows 95 контекстно-зависимые меню, которые 
позволяют быстро выбирать часто используемую команду. Свойство PopupMenu 
просто определяет активизируемый компонент Т PopupMenu, когда вы щелкаете 
правой кнопкой на элементе управления. 

    Text 

    Свойство Text подобно свойству Caption, в котором оно сохраняет строку, 
определяющую отображаемый элементом управления текст. Свойство Text отличается 
от Caption тем, что Text представляет строку, которую можно непосредственно 
изменять (например, строку элемента управления TEdit) в то время как заголовок 
(свойство Caption) изменяться не может. 

    События TControl 

    События — это специфические сообщения о возникшей ситуации, которое 
перехватываются и обрабатываются, чтобы обеспечить функциональные возможности интерфейса. 
    Поскольку TControl —это визуальный объект, для взаимодействия с ним обычно 
используется мышь. Чтобы приспособиться к этому, TControl поддерживает 
следующие типы событий мыши. 
    •    Selection (Выбор) 
    •    Movement (Движение) 
    •    Drag-and-drop (Перетащить и опустить) 

    Selection 

    Событие Selection вызывается после щелчка кнопкой мыши, когда указатель 
мыши находится над элементом управления. События Selection перечислены ниже. 
    •    Событие OnClick генерируется после щелчка левой кнопкой мыши. 
    Элементы управления могут определять дополнительные ситуации, в которых 
генерируется событие Onclick. Например, для элемента управления TButton после 
нажатия клавиши пробела, когда на нем установлен фокус, генерируется событие OnClick. 

    заметку 
    В Событие OnDblClick генерируется после двойного щелчка на элементе 
управления левой кнопкой мыши в установленный для такого щелчка интервал 
времени. Этот интервал определяет время, в течение которого должен произойти 
второй щелчок, чтобы интерпретироваться именно как двойной, а не как два 
одиночных щелчка. 
    Некоторые элементы управления допускают привязки обоих обработчиков 
событий — для OnClick и 
    ,  OnDblClick. Но не поддавайтесь этому искушению! Объект, который 
выполняет две различные задачи, в заметку 
    зависимости от того, как быстро вы нажимаете кнопку мыши, — неудачный 
выбор в проекте интерфейса. 
    Вместо этого используйте два элемента управления. 
    В События OnMouseDown и OnMouseUp допускают более сложную обработку 
событий мыши. Событие OnMouse-Down генерируется при нажатии любой кнопки мыши, 
a OnMouseUp — когда вы отпускаете кнопку мыши. 
    Вы можете ожидать, что вышеупомянутые события произойдут в предсказуемом 
порядке, например событие OnMouseDown произойдет после события OnMouseUp или 
событие OnClick будет предшествовать событию OnDblClick. Но дело обстоит 
совсем не так. Порядрк?обьт1.йдл?двойного щелчка таков. 
    1.   OnMouseDown.      ' 
    2.   OnClick. 


    Глава 6. Использование компонентов Delphi 125 


    3. OnMouseUp. 
    4. OnDblClick. 
    5. OnMouseDown. 
    6. OnMouseUp. 
    u                                                                          
                                                                               
              Одиночный щелчок просто генерирует события 1-3. 

    пЯ 
    заметку 

    Что бы вы ни думали, этот порядок действительно логический. Событие 
OnMouseDown всегда сопровождается событием OnMouseUp. (Должны же вы в конце 
концов отпустить кнопку!) Имея это в виду, система Delphi может упорядочить 
события в соответствии с приоритетом, а не с последовательностью их 
обнаружения. Событие OnClick более важно, чем OnMouseUp, и до лжно 
обрабатываться первым. Приоритет события OnDblClick выше, чем приоритет 
событий OnMouseDown и OnMouseUp. 
    Delphi также позволяет генерировать события выбора и перемещения вручную в 
любом порядке. Это полезно, когда вы хотите искусственно генерировать 
ситуацию, например нажатие кнопки (элемент управления TButton). Вы можете 
вызывать обработчик события точно так же, как любой другой метод. Следующий 
код показывает это: 

    btnLoad.click(Self) ; 

    Данный оператор обрабатывает событие OnClick для элемента управления 
TButton, названного btnLoad. Событие OnClick имеет тип TNotif yEvent и для 
него необходим параметр Sender. Здесь можно передать только сам объект Self, 
которШГуказывает на ооъектГтГогт, являющийся владельцем объекта btnLoad. При 
вызове обработчика события другого типа, например T 
    KeyEvent, нужно передать ему параметры, которых он ожидает. 

    Перемещение 

    Элементы управления вызывают событие OnMouseMove, когда указатель мыши 
перемещается над областью отображения элемента управления. Обработчик события 
передает координаты указателя мыши. Программы, работающие с изображениями, 
например Paint, используют событие OnMouseMove для отображения в строке 
состояния координат указателя мыши. 

    procedure TFoml.ImagelMouseMove(Sender:   TObject;   Shift:   TShiftState; 
 X,   Y:   Integer) ; 
    begin 
    Panell.Caption   :=   '('+IntToStr(X)+','+IntToStr(Y)+')'; end; 

    Этот фрагмент кода использует событие OnMouseMove элемента управления 
TImage. Оно присваивает свойству Caption элемента управления TPanel, 
именованного Panell, координаты указателя мыши, причем начало координат 
находится в верхнем левом углу элемента управления TImage. 
    Delphi отсылает два дополнительных сообщения перемещения элементу 
управления (CM_MOUSEENTER и CM_MOUSELEAVE). Эти сообщения указывшот"Гкогда 
указатель мыши входит в область отображения элемента управления и выходит из нее. 
    Концепция drag-and-drop 
    Концепция drag-and-drop (перетащить и опустить) позволяет перемещать 
объект в пределах формы и даже в другую прикладную программу. Обычно при этом 
используются следующие два элемента управления. 
    •    Источник. Источник содержит перемещаемый элемент. В прикладной 
программе можно определить перемещаемый элемент либо как весь элемент 
управления (например, изображение), либо только как выбранную часть (например, 
выбранную в текущий момент строку компонента TListBox). 
    •    Приемник. Приемник — элемент управления, на который будет опущен 
элемент-источник. Всю операцию можно выполнить с помощью следующих трех событий. 
    •    Событие OnDragOver вызывается приемником, когда над ним перемещается 
объект. Обработчику события передаются следующие параметры: объект-источник, 
текущее положение указателя мыши и состояние перемещения. 

    126 Часть II. Разработка приложений 

    Это позволяет элементу-приемнику принимать или отклонять элемент-источник. 
Состояние перемещения показывает, вошел ли перемещаемый объект в область 
элемента управления приемникаГг|ё]рёдвигаетсТшГон™в области элемента 
управления приемника или покинул эту область и не был опущен. 
    • Событие OnDragDrop вызывается приемником, когда перемещаемый объект 
опускается на него. Чтобы прикладная программа могла легко обрабатывать 
перемещение и опускание, обработчику события передается исходный объект и 
текущее положение мыши. 
    « Событие OnEndDrag генерируется элементом управления источника, когда 
завершается операция drag-and-drop. Обработчику события передается объект 
приемника и координаты точки, в которой объект был опущен. 
    Некоторые элементы управления определяют дополнительное событие, 
OnStartDrag, генерируемое ис-Совет ]  точником, когда начинается выполнение 
операции drag-and-drop. 
    G 
    События происходят в следующем порядке. 
    1.   OnStartDrag (для источника). 
    2.   OnDragOver (для приемника). 
    3.   OnDragDrop (для приемника). 
    4.   OnEndDrag (для источника). 

    Программирование операций drag-and-drop 

    Чтобы запрограммировать операции drag-and-drop, можно написать два 
обработчика события и установить одно-единственное свойство. Представьте, что 
у вас есть два элемента управления типа TListBox — ListBoxl и ListBox2. 
Убедитесь, что свойство DragMode для ListBoxl установлено равным dmAutomatic; 
это упростит вашу работу — вы не должны.^де1&зайохит,ь ся о вызове BeginDrag. 
    Теперь напишем обработчики событий. Первый обработчик определяет, принята 
ли операция перемещения в элементе управления ListBox2. Ниже приведен текст 
этого обработчика события. 

    procedure  TForml.ListBox2DragOver(Sender,   Source:   TObject; 
    X,   Y:   Integer;   State:   TDragState;   var Accept:   Boolean); begin 
    "—• 
    if  Source  =  ListBoxl   then 
    Accept   :=  True; end; 

    Этот фрагмент кода проверяет, является ли источником объект ListBoxl, и, 
если является, устанавливает параметр Accept равным True. 
    Теперь, когда происходит сближение с объектом ListBox2, попытаемся сделать 
кое-что с опускаемыми элементами. Следующий обработчик события просто 
добавляет выбранный (и перемещенный) элемент из ListBoxl в ListBox2. 

    procedure  TForml.ListBox2DragDrop(Sender,   Source:   TObject; 
    X,   Y:   Integer); begin 
    with  Source  as  TListBox do 
    7 
    TTstBox2.Iterns.Add(Iterns[Itemlndex]); end; 
    TWinControl и TGraphicControl 

    Хотя TControl является источником огромного количества объектов, их можно 
разделить на две группы элементов управления — OKmiHbie^windowed), описанные в 
разделе "TWinControl", и^еоконные (non-windowed), о которых рассказывается 
нижеГ5[Граздёле, посвящённом элементу управления TGraphicControl:........... 

    TWinControl 

    Элемент управления TWinControl обеспечивает базисные функциональные 
возможности для тех компонентов, которым необходим фокус ввода или ввод с 
клавиатуры. Превосходный пример — компонент TEdit, которы^ предоставляет поле 
для ввода Текста. Компонент TListBox, отображаемый как прокручиваемый список 
элементов, также может получать фокус, потому что строка выделения может 
перемещаться с помощью клавиш управления курсором. 

    Глава 6. Использование компонентов Delphi 127 

    Компонент может распознавать фокус ввода двумя способами. 

    Нэ заметку 
    •     С помощью курсора редактирования. Для текстовых компонентов текущая 
позиция вставки отмечена курсором редактирования. Его можно перемещать с 
помощью клавиш управления курсором. Заданный по умолчанию курсор 
редактирования имеет вид мерцающей вертикальной линии. 
    •     С помощью прямоугольника фокуса. Если компонент получил фокус ввода, 
он обрамляется пунктирным прямоугольником. Например, объект TButton заключает 
свой заголовок в прямоугольник фокуса, а объект TListBcx выделяет выбранную в 
текущий момент строку в списке. 
    В компоненте с несколькими элементами, например в TListBox, прямоугольник 
фокуса часто окрашивает выбранный элемент в другой цвет. зяметку 
    Но почему этот тип элемента управления называется TWinControl, а не 
TFocusControl или как-нибудь еще? Не забудьте, что форма — это всего лишь 
способ инкапсуляции стандартного окна в Delphi. Компоненты, способные получать 
фокус ввода, являются также и окнами: элемент управления TButton — это просто 
окно в стиле кнопки, заключенное в компонент Delph 
    i. Эти компоненты известны как оконные элементы управления (отсюда и 
происходит "Win" в TWinControl). 
    Другое преимущество оконных элементов управления заключается в том, что 
они могут содержать другие окна или элементы управления. Вы уже видели это на 
практике, когда опускали компоненты на формы (тогда формы являлись 
родительскими окнами для компонентов). 

    Свойства TWinControl 

    TWinControl добавляет к TControl следующие свойства. 
    •    Булевы свойства CtlSD и ParentCtl3D определяют, как будет выглядеть 
элемент управления: как двух- или трехмерный. Трехмерные интерфейсы стали 
очень популярными по двум простым причинам: они красиво выглядят и широко 
используются в Windows 95. Двухмерные интерфейсы выходят из моды. Свойство 
ParentCtlSD указывает, что элемент управления должен использовать значение 
свойства Ct 13 D родительского элемента управления. 
    И Булево свойство Enabled определяет, доступен ли элемент управления для 
ввода с помощью мыши или клавиатуры. Заблокированный элемент управления не 
обрабатывает событий мыши или клавиатуры и обычно отображается тусклым или 
темно-серым цветом. 
    •    Свойство Handle — это, в основном, целое число, которое представляет 
дескриптор окна элемента управления. Дескриптор окна используется для того, 
чтобы дополнить каждое окно уникальным идентификатором. Операционная система 
сообщает окну о событии, например о щелчке кнопкой мыши или нажатии клавиши, 
отсылая ОКНУ сообщение с помощью его дескрипт ора. Дескриптор окна элемента 
управления используется во многих низкоуровневых функциях API системы Windows. 
    К Свойство HelpContext определяет номер контекстной справки элемента 
управления, который связывает элемент управления со специфическим экраном в 
справочном файле. Система справки активизируется при нажатии клавиши <F1>, 
когда фокус установлен на элементе управления. 
    •    Свойство TabOrder — целое число, используемое для определения номера 
позиции элемента управления в последовательности меток табуляции. Булево 
свойство TabStop определяет, должен ли элемент управления захватывать фокус 
при последовательном нажатии клавиши <ТаЬ> или только передавать фокус 
следующему элементу управления. 

    События TWinControl 

    Объект TWinControl добавляет к TControl события следующих двух типов. 
    •    События изменения фокуса. События изменения фокуса уведомляют элемент 
управления об изменениях во владении фокусом ввода. Чтобы генерировать событие 
OnEnter, нужно передать фокус элементу управления. Для этого следует щелкнуть 
мышью на элементе управления или'нажать клавишу <ТаЬ>. Событие OnExit 
генерируется, когда элемент управления теряет ф окус. Это происходит после 
щелчка мышью на другом элементе управления или нажатия клавиши <ТаЬ> (переход 
на следующий элемент управления в последовательности обхода). 

    128 Часть П. Разработка приложений 

    В   События клавиатуры. Delphi сообщает о трех событиях клавиатуры. 
    Элемент управления генерирует событие OnKeyDown при нажатии клавиши в то 
время, когда фокус находится в элементе управления. Обработчику события 
передается действительный код клавиши ввода, который представляет собой 
постоянный числовой идентификатор для каждой клавиши. Это число определяет 
система Windows по значению смещения, возвращаемого каждым типом клавиатуры. 
    Событие OnKeyUp генерируется, когда вы отпускаете клавишу. Обработчику 
события передается действительный код клавиши и текущее состояние клавиатуры. 
    Действительные ключевые коды для алфавитно-цифровых клавиш равны значению 
клавиши в коде ASCII. 
    • 
    Совет 
    I Совет I 
    Элемент управления поочередно генерирует события OnKeyDown и OnKeyUp во 
время удержания клавиши нажатой. 

    заметку 
    Событие OnKeyPress вызывается, когда отпускается нажатая клавиша. Только 
для разнообразия обработчику события передается значение ASCII нажатой клавиши 
(его можно изменить, изменив параметр Key, передаваемый обработчику события). 
Это действительно полезно лишь в случае, если нажата не та клавиша (т.е. 
клавиша, в данный момент не принадлежащая допу стимому множеству клавиш). 
Можете установить параметр Key равным символьному нулю, что отменит нажатие 
клавиши. Следующий обработчик события OnKeyPress гарантирует, что пользователь 
не сможет вводить прописную букву Z в элемент управления TEdit, названный Editl. 

    procedure TForrn.EditlKeyPress(Sender: TObject; var Key: Char); begin if 
Key = 'Z' then 
    Key := #0; end; 

    Для одного нажатия клавиши события, связанные с клавиатурой, происходят в 
следующем порядке. События клавиатуры совместно используют ту же самую 
приоритетную схему, что и события мыши, рассмотренные выше. Delphi генерирует 
событие OnKeyPress, как только*1ьГнажимаете клавишу, а не ожидает момента ее освобождения. 

    TGraphicControl 

    Как и объекты TWinControl, объекты TGraphicControl являются потомками 
TControl. Компонент TGraphicControl не требует услу_г клавиатуры и не 
использует средств Windows, связанных с производными Twin-Control. Компонент 
Tlmage, который выводит изображения, является наглядным примером 
TGraphicControl. Компонент TSpeedButton наследуется от TGraphicControl, 
потому что ему не нужен ввод с клавиатуры. Его единственная цель — обеспечить 
быстрый доступ к командам с помощью мыши. 
    Потомка TGraphicControl нельзя выбирать с помощью клавиш. Это логично, 
поскольку данный компонент не имеет возможности обрабатывать клавишу 
табуляции, чтобы передать фокус следующему компонен-™    ту. Учитывая это, 
важно назначить каждой команде прикладной программы комбинацию клавиш, чтобы 
упростить пользователю доступ к элементу управления. 
    Объект TGraphicControl добавляет свойство Canvas (Канва) и метод Paint 
(Рисовать) к предку TControl. 

    Свойство Canvas 

    Свойство Canvas инкапсулирует контекст устройства Windows, который на 
самом деле является всего лишь совокупностью простейших низкоуровневых функций 
рисования. С помощью методов свойства Canvas можно легко рисовать линии, дуги, 
прямоугольники и эллипсы, а также определять приоритетные и фонШые цвета и 
размещать текст на поверхности объекта. 

    Глава 6. Использование компонентов Delphi 129 
    5 Использование Delphi 3. Специальное издание 


    Метод Paint 

    TGraphicControl обеспечивает виртуальный метод Paint, который вызывается 
всякий раз, когда необходимо прорисовать элемент управления. В главе 4, 
"Object Pascal: углубленное изложение", виртуальные методы описываются подробнее. 
    Метод Paint обычно использует свойство Canvas элемента управления, чтобы 
облегчить процесс рисования. 
    И TGraphicControl, и Canvas определяют свои собственные объекты для кисти, 
шрифта и пера. Метод 
    Paint автоматически не копирует объекты TGraphicControl в Canvas, и это 
нужно делать вручную. зэ м е т ку 
    В главе 22, "Работа с графикой", свойство Canvas и метод Paint описаны 
более подробно. 

    Стандартные элементы управления 

    Delphi поддерживает несколько элементов управления, которые можно назвать 
стандартными, потому что они стали общепризнанными средствами в прикладных 
программах. Группы элементов управления рассматриваются в следующих разделах. 

    Отображение текста 

    Обычно текст (надпись) отображается с помощью элемента управления TLabel и 
чаще всего используется для того, чтобы описать назначение другого элемента 
управления, который не имеет собственного свойства Caption. Примером может 
быть стандартное диалоговое окно открытия файла (см. рис. 6.1). Надпись Look 
in в верхнем левом углу описывает назначение р аскрывающегося списка 
TComboBox, расположенного справа. 
    Вы можете установить выравнивание текста с помощью свойства Alignment 
(например, выравнивание влево, по центру и вправо). Свойство Autosize полезно 
для автоматической коррекции свойств Height (Высота) и Width (Ширина) элемента 
управления при изменении значений свойств Caption или Font. Свойство Wordwrap 
(автоматический перенос слов) удобно использ овать для длинного заголовка, 
чтобы обрезать его по ширине компонента TLabel, а остаток текста перенести на 
следующую строку. 
    Свойства Alignment и Wordwrap не работают, если AutoSize установлен равным 
True. Совет " 

    Г Совет I 
    Элемент управления TLabel также можно использовать, чтобы установить фокус 
у потомка TWinControl. Чтобы выполнить это, нужно установить свойство 
FocusControl в соответствующем потомке TWinControl и определить горячую 
клавишу в свойстве Caption. В стандартном диалоговом окне открытия файла (см. 
рис. 6.1) TLabel-элементу управления Look in назначена горячая клавиша <i>. 
Для элемента TComboBox (справа) установлено свойство Focus-Control. Свойство 
ShowAccelChar определяет, для чего используются символы & в свойстве Caption: 
для определения горячей клавиши акселератора или просто для отображения 
символа &. 
    Даже когда свойство ShowAccelChar принимает значение True, можно 
отображать амперсанд в заголовке (Caption). Для этого перед ним нужно дописать 
еще один символ &. Чтобы вывести строку "Delphi & Windows", присвойте свойству 
Caption значение Delphi && Windows. 
    Если свойство ShowAccelChar установлено равным False, свойство 
FocusControl не работает. 
    Свойство Transparent указывает, что заголовок должен быть прозрачным, а не 
закрашенным цветом, определенным свойством Color. Это полезно, когда вы хотите 
идентифицировать части изображения, например карты, и не хотите, чтобы 
компонент TLabel закрыл прямоугольную область. 


    130 Часть П. Разработка приложений 


    I Совет 1 I Совет I 

    Ввод текста 

    В каждой прикладной программе предусмотрена возможность ввода текста с 
клавиатуры. Даже прикладные программы, которые включают только диалоговое окно 
открытия файла, допускают набор текста (ведь вы же можете ввести имя файла в 
соответствующем поле). Об элементах управления для ввода текста TEdit и ТМето 
речь пойдет в следующих разделах, а элемент управления TRichEdit будет 
рассмотрен в главе 7, "Общие элементы управления Win32". 

    Элемент управления TEdit 

    Элемент управления TEdit — стандартное поле ввода в Windows, которое 
позволяет отображать и изменять текст. На рис. 6.1 показано диалоговое окно 
открытия файла. В нем элемент управления TEdit используется для ввода имени файла. 
    Свойство AutoSelect определяет, будет ли автоматически выделен текст в 
элементе управления, когда последний получит фокус ввода. Поскольку при вводе 
выделенный фрагмент текста заменяется вновь набранным, свойство Auto-Select 
можно использовать для автоматического выделения текста в поле ввода. 
    Вы можете вводить текст строчными или прописными символами, установив для 
свойства CharCase значение ecUpperCase или ecLowerCase. 
    Свойство PasswordChar предоставляет определить символ, который 
отображается вместо символа, введенного фактически. Эта особенность позволяет 
обеспечить дополнительную защиту, например, при вводе паролей. Окно 
регистрации в Windows 95, показанное на рис. 6.2, использует элемент 
управления TEdit, причем свойство PasswordChar установлено равным *. 
    Рис. 6.2. Свойство PasswordChar обеспечивает дополнительную защиту при 
вводе секретной информации 

    Элемент управления ТМето 

    Элемент управления ТМето — это стандартный элемент управления для 
редактирования текста. Он позволяет ввести несколько строк текста, любую из 
которых можно выделить с помощью массива строк Lines. Следующий фрагмент кода 
выводит вторую строку элемента управления ТМето, названного memComments (не 
забудьте, что индекс первого элемента в массиве свойс тв равен нулю): 

    ShowMessage(memComments.Lines[1]); 

    Свойство ScrollBars определяет наличие горизонтальной и/или вертикальной 
полосы прокрутки в элементе управления ТМето, когда размер текста не позволяет 
отобразить его полностью. 
    Свойства WantReturns и WantTabs указывают, обрабатывает ли элемент 
управления ТМето клавиши <Enter> и <ТаЬ>. 
    Коды клавиш <Enter> и <ТаЬ> можно ввести в поле элемента управления ТМето, 
даже если элемент управления их не обрабатывает. Для этого нужно нажать 
клавишу <Enter> или <ТаЬ>, удерживая нажатой <Ctrl>. 

    I Совет 1 

    Общие свойства и события 

    Элементы управления для ввода текста имеют несколько общих свойств и 
событий. Свойство MaxLength указывает максимальное количество символов, 
которые можно ввести в элемент управления. 
    Ваша программа уведомляется об изменениях в тексте одним из следующих способов. 
    •   С помощью события OnChange. Это событие вызывается, когда текст 
элемента управления изменен. Оно происходит после событий OnKeyDown и 
OnKeyPress, но до OnKeyUp. 
    В   С помощью свойства Modified. Это булево свойство устанавливается 
равным True, если текст изменялся после того, как оно последний раз было 
установлено равным False. 

    Глава 6. Использование компонентов Delphi 131 

    Хотя основная функция поля ввода — позволить изменять текст, его можно 
использовать только для отображения текста, установив свойство Readonly равным 
True. Подобный подход обычно не рекомендуется для элементов управления TEdit и 
ТМето, потому что элемент управления может получить фокус ввода и отобразить 
курсор в режиме редактирования, а это созда ет иллюзию того, что текст в поле 
ввода доступен для редактирования. Вместо этого лучше установить свойство 
Enabled равным False. 
    Текст в элементе управления редактирования можно выбрать с помощью мыши 
или клавиатуры. Определить или изменить диапазон выбора и выбранный текст 
можно с помощью следующих свойств. 
    •    SelLength (определяет длину выделенного текста в символах). 
    •    SelStart (определяет смещение выделенного текста относительно первого символа). 
    •    SelText (содержит строку, в которой находится выделенный текст). 
    На рис. 6.3 показано поле ввода TEdit, в котором свойство SelStart 
установлено равным 1, а свойство SelLength — равным 2. Свойство SelText 
возвращает el. 

    Рис. 6.3. Элементы управления для ввода текста позволяют управлять 
выделением фрагмента текста 


    Команды 

    Самый распространенный элемент прикладных программ Windows — командная 
кнопка, используемая для выполнения определенной задачи. Элемент управления 
TButton инкапсулирует стандартную кнопку Windows и содержит несколько полезных свойств. 
    Если свойство Cancel (Отмена) установлено равным True, событие OnClick 
вызывается при нажатии клавиши <Escape>. Это обычно связано с кнопками, 
указывающими на отмену действия. Пример — кнопка Cancel в диалоговом окне 
открытия файла, которая позволяет отказаться от выбранной операции и не 
открывать файл. 
    Установка свойства Default равным True позволяет генерировать событие 
OnClick при нажатии клавиши <Enter>. Клавиша <Enter> обычно связана с кнопками 
для выполнения определенных операций. Пример — ввод имени файла в диалоговом 
окне открытия файла и нажатие клавиши <Enter>, которая по умолчанию связана с 
кнопкой Open. Кнопка со значением Default, ус тановленным равным True, 
выделяется темным прямоугольником. 
    Любая кнопка, которая в текущий момент содержит фокус, становится кнопкой 
по умолчанию, и нажатие клавиши <Enter> активизирует событие OnClick этой 
кнопки. Когда некнопочный элемент управления по-     I лучает фокус, первая 
кнопка в порядке обхода табуляции со свойством Default, установленным равным 
^^дУш!  True, опять становится кнопкой по умолча нию. 
    Если установить свойство ModalResult равным не mrNone, то форма будет 
закрыта. Когда вы щелкаете на элементе TButton, то свойство ModalResult 
устанавливается равным значению свойства ModalResult формы-владельца. 
Благодаря этому можно успешно избежать утомительной необходимости 
программировать обработчика события OnClick для закрытия формы. 

    Элементы управления группы 

    Элементы управления группы TCheckBox, TRadioButton и TRadioGroup позволяют 
быстро выбрать значение из предопределенного множества. Примеры этих элементов 
можно найти в диалоговом окне Replace Text системы Delphi, как показано на 
рис. 6.4. 

    Элемент управления TCheckBox 

    Элемент управления TCheckBox представляет независимый переключатель 
(опцию), который может быть включен или выключен. Выбор опции отмечается 
"галочкой". Опция Case sensitive в диалоговом окне Replace Text использует 
элемент управления TCheckBox, чтобы указать, должен ли поиск текста быть 
чувствителен к регистру. 
    Свойство AllowGrayed добавляет третье состояние, checked and grayed 
(включенный серый), к состояниям checked (включенный) и unchecked 
(выключенный). Диалоговое окно ProgramsTOTSTRemove, представленное на рис. 
6.5, использует это третье состояние. Выключенные опции указывают, что никакие 
вложенные опции не установлены, включенные серые опции указыв ают, что 
некоторые из вложенных опций включены, а включенные опции указывают, что 
установлены все вложенные опции. 

    132 Часть II. Разработка приложений 

    Программа уведомляется об изменении состояния выбора с помощью события 
Onclick. Текущее состояние выбора отражено в свойствах Checked и State. В 
следующем фрагменте кода проверяется, включен ли элемент управления 

    chkPrintPlain типа TCheckBox. 
    if chkPrintPlain.Checked then 
    PrintPlainList else 
    PrintFancyList; 
    ! Add/Remove Piogiams Piopeitiei 

    Рис. 6.4. Диалоговое окно Replace Text использует компоненты TCheckBox И TRadioButton 

    Рис. 6.5. Свойство AiiowGrayed добавляет третье состояние для элемента управления 

    TCheckBox 

    Элемент управления TRadioButton 

    Элемент управления TRadioButton используется, когда альтернатив выбора 
больше двух. Группы объектов TRadioButton позволяют осуществлять 
взаимоисключающий выбор в перечне альтернатив. Подобно компоненту TCheckBox, 
выбранный объект TRadioButton определяется с помощью свойства Checked. 

    На заметку 
    Событие OnClick для элемента TRadioButton вызывается только при его 
установке, а элемент управления TCheckBox генерирует событие OnClick 
независимо от его установки. 

    Элемент управления TRadioGroup 

    Элемент управления TRadioGroup, "автоматизирует" создание набора зависимых 
переключателей TRadioButton в форме. Объект TRadioButton создается для каждого 
элемента, перечисленного в списке свойства Items; элементы размещаются в 
столбцах, причем количество столбцов определяется свойством Columns. Свойство 
Itemlndex получает номер выбранного элемента из набора компонентов TRadioButton. 

    Список 

    Два элемента управления списком, TListBox и TComboBox, позволяют 
отображать и выбирать элемент из предопределенного списка. 

    Элемент управления TListBox 

    Элемент управления TListBox представляет прокручивающийся список объектов, 
из которых можно выбрать один или больше элементов. Диалоговое окно Delphi 
Components, показанное на рис. 6.6, представляет библиотеку компонентов в 
списке TListBox. 

    Глава 6. Использование компонентов Delphi 133 

    Свойство Columns указывает число столбцов для отображения пунктов элемента 
управления TListBox. Установка свойства Columns равным нулю заставляет элемент 
управления TListBox прокручивать список по вертикали. Значение, отличное от 
нуля, обеспечивает горизонтальную прокрутку TListBox, причем список 
разделяется на столько столбцов, сколько определено свойством Columns. Пример 
списка со значениями свойства Columns, равными О, 1 и 2. показан на рис. 6.7. 

    Рис. 6.6.   Диалоговое окно Components со 

    СПИСКОМ TListBox 

    Рис. 6.7. Значение свойства Columns определяет число столбцов и поведение 
списка TListBox 

    Свойства ExtendedSelect и MultiSelect элемента управления TListBox 
позволяют выбрать несколько элементов в списке. Свойство MultiSelect 
определяет, должен ли список поддерживать выбор нескольких элементов. Если 
свойство ExtendedSelect установлено равным True, то для выбора нескольких 
элементов нужно использовать клавишу <Shift> или <Ctrl> вместе с мышью. Если 
свойство ExtendedSelect установлено равным False, чтобы выбрать несколько 
элементов, нужно использовать только мышь. Свойство SelCount возвращает число 
выбранных элементов. Чтобы получить выбранные элементы списка, нужно 
просмотреть булев массив свойств Selected. Следующий фрагмент кода преобразует 
текст всех выбранных элементов списк а в элементе управления TListBox, 
названном List-Box 1, в символы верхнего регистра. 

    var 
    iCount   :   Integer; begin with  ListBoxl   do 
    for  iCount   :=  a  to  Items.Count  -   1  do if  Selected[iCount]   then 
    Items[iCount]    :=  Uppercase(Items[iCount]); end; 

    Свойство Toplndex гарантирует, что конкретная строка видна в элементе 
управления TListBox. Следующий фрагмент кода заставляет элемент управления 
TListBox отображать строку, которая содержит значение "Delphi"': 

    with  ListBoxl   do Toplndex   :=Items.IndexOf('Delphi'); 

    Элемент управления TComboBox 

    Элемент управления TComboBox подобен "свернутому" элементу управления 
TListBox. Вы можете вводить новое значение или выбирать элемент из 
раскрывающегося списка. В Delphi диалоговое окно Find Text, показанное на рис. 
6.8, содержит элемент управления TComboBox с раскрытым списком. 
    Число видимых элементов в раскрывающемся списке определяется свойством DropDownCount. 

    Общие свойства и события 

    Элементы, отображаемые в списке TListBox и раскрывающемся списке 
TComboBox, доступны через свойство Items, причем они могут отображаться в 
алфавитном порядке (для этого нужно установить свойство Sorted равным True). 
Свойство Itemlndex возвращает индекс выбранного элемента и -1, если никакие 
элементы не выбраны. 
    Элементом списка может быть не только строка текста; вы можете задать 
собственный способ прорисовки каждого элемента. Чтобы прорисовать элементы 
списка, обработайте событие OnDrawItem для соответствующих элементов. Свойство 
Style определяет, фиксирована ли высота каждого элемента в списке. Для списков 
с элементами с фиксиро

    134 Часть II. Разработка приложений 

    ванной высотой используется свойство ItemHeight, чтобы определить высоту 
каждого элемента. Для списков с объектами переменной высоты TListBox 
генерирует событие OnMeasureltem, позволяя указать высоту элемента до его 
прорисовки по событию OnDrawltem. В Delphi диалоговое окно Components (см. 
рис. 6.6) содержит список TListBox с элементами фиксирован ной высоты, которые 
прорисовываются своими собственными средствами. 

    Объединение элементов управления 

    Объединение элементов управления выполняется с помощью контейнеров. Каждый 
элемент управления в контейнере — это дочернее окно родителя, который является 
объединяющим элементом управления. 

    Элемент управления TPanel 

    Элемент управления TPanel представляет собой вдавленный или выпуклый 
(beveled) прямоугольник, в котором может содержаться несколько элементов 
управления. Чаще всего элемент управления TPanel используется для создания 
группы из нескольких элементов управления TSpeedButton, образующих панель 
инструментов. Элемент управления TPanel применяется в окне приложения с 
многодокументным интерфейсом (MDI Application), созданным экспертом проектов 
(Project Expert) системы Delphi (рис. 6.9). 

    Рис. 6.9. Элементы управления т Panel обычно используются для создания 
панелей инструментов 

    Рис. 6.8. Элемент управления TComboBox позволяет вводить текст в поле или 
выбирать элемент непосредственно из списка 


    Элемент управления TGroupBox 

    Элемент управления TGroupBox используется в основном для визуального 
выделения группы функционально связанных элементов управления. Это можно 
заметить в стандартном диалоговом окне Print, показанном на рис. 6.10, в 
котором используется элемент TGroupBox, чтобы подчеркнуть, что поле Number of 
copies и опция Collate функционально связаны друг другом 
    . 

    Положение в диапазоне значений 

    Элемент управления TScrollBar используется, чтобы определить значение в 
предопределенном диапазоне. Хотя его назначение подобно назначению компонента 
TTrackBar (см. главу 7, "Общие элементы управления Win32"), элемент управления 
TTrackBar обычно используется для установки текущей позиции в окне или списке. 
На рис. 6.6 и 6.7 показано использование 

    TTrackBar. 

    Текущее значение TScrollBar возвращается свойством Position и находится в 
диапазоне, ограниченном свойствами Min и Мах. Этот диапазон можно увеличить 
или уменьшить, используя свойства LargeChange и SraallChange соответственно. 
    Событие OnScroll вызывается, когда изменяется позиция бегунка. 

    Глава 6. Использование компонентов Delphi 135 


    Рис. 6.10. В стандартном диалоговом окне Print используются элементы 
управления TRadioGroup и TGroupBox 


    Дополнительные элементы управления 

    Усовершенствование интерфейсов прикладной программы привело к появлению 
нескольких новых видов элементов управления. Система Delphi предлагает эти 
новые элементы управления на странице Additional палитры компонентов. 

    Дополнительные кнопки команд 

    Стандартный командный элемент управления TButton был расширен в двух 
направлениях — TBitBtn и TSpeed-Button. 

    Элемент управления TBitBtn 

    Элемент управления TBitBtn является потомком TButton и в основном 
добавляет возможность отобразить описательное изображение на поверхности кнопки. 
    Свойство Kind позволяет быстро устанавливать несколько свойств, например 
свойства Default, Cancel и Caption, в одной операции. 

    Компонент TSpeedButton 

    Обычно этот компонент используется в панелях инструментов прикладных 
программ. Он является основой элемента управления в стиле кнопки и отображает 
рисунок и, иногда, надпись. 
    К элементу управления TBitBtn компоненты TSpeedButton добавляют две 
функциональные возможности: их можно группировать и они могут отображать одно 
из двух состояний. 
    Чтобы их сгруппировать, нужно для всех компонентов TSpeedButton в группе 
установить свойство Grouplndex равным одному и тому же значению, отличному от 
нуля. Группа TSpeedButton представляет взаимно исключающий выбор, 
подобный^тому, который обеспечивается группой TRadioButton. 
    Свойство Down указывает состояние TSpeedButton и действует только тогда, 
когда свойство Grouplndex отлично от нуля. Когда свойство Down принимает 
значение True, элемент управления TSpeedButton рассматривается как выбранный. 
Палитра компонентов Delphi — пример набора сгруппированных элементов 
управления TSpeedButton. 

    Общие свойства 

    И TBitBtn, и TSpeedButton содержат свойство Glyph, используемое для 
представления рисунка компонента. Более того, вид кнопки может изменяться для 
каждого из четырех состояний: Up, Disabled, Down и Stay Down. Чтобы изменить 
вид кнопки в каждом из четырех состояний, нужно назначить свойству Glyph 
растровое изображение, содержащее отдельные рисунки, которые расположены в 
один ряд (по горизонтали). Все рисунки должны быть одного размера. Свойство 
NumGlyphs указывает число изображений состояния, содержащихся в свойстве Glyph. 
    Положение элементов, содержащихся в свойствах Caption и Glyph, выбирается 
с помощью следующих трех свойств. 
    в   Layout. Определяет, где размещено изображение Glyph: в левой, правой, 
верхней или нижней части кнопки. Если определено свойство Caption, то 
заголовок появляется на границе, противоположной Glyph. 
    •    Margin. Определяет число пикселей между границами кнопки и Glyph. 
    •    Spacing. Указывает, сколько пикселей находится между Caption и Glyph. 

    136 Часть II. Разработка приложений 


    Дополнительные возможности редактирования 

    Когда возможностей основного элемента управления TEdit недостаточно, можно 
использовать элементы управления 
    TMaskedEdit, TDrawGrid и TStringGrid. 

    Элемент управления TMaskedEdit 

    Элемент управления TMaskedEdit добавляет некоторую проверку ввода и 
функциональные возможности форматирования к основному элементу управления 
TEdit. Свойство EditMask определяет маску, которой должны удовлетворять 
данные, вводимые в элемент управления. Ограничения распространяются на каждый 
символ и, например, могут допускать числовые, буквенные и ли какие-либо другие 
специфические символы для конкретной символьной позиции. 
    Литералы, например разделители даты и времени, можно ввести в свойство 
EditMask, чтобы предписать специфический формат данных, отображаемых на 
дисплее. Свойство EditMask проверяет, есть ли эти символы в свойстве Text. 
Свойство EditText возвращает текст в соответствии с маской этого элемента управления. 
    Если вы пытаетесь перейти к другому элементу управления, в то время как 
текст не соответствует маске, генерируется исключительная ситуация и фокус 
возвращается элементу управления TMaskedEdit. 

    Элемент управления TDrawGrid 

    Элемент управления TDrawGrid позволяет представлять данные в виде таблицы, 
разбивая их на строки и столбцы. Компонент TCalendar, показанный на рис. 6.11, 
— это элемент управления сетка. 
    Число столбцов и строк можно определить с помощью свойств ColCount и 
RowCount. Свойства Col и Row указывают, в какой ячейке содержится фокус ввода. 
Если выбрать диапазон ячеек, то свойство Selection возвращает прямоугольник 
ячеек, находящихся в этом диапазоне. 
    Свойство DefaultColWidth устанавливает заданный по умолчанию размер 
столбца для каждого столбца в сетке, а свойство DefaultRow-Height выполняет ту 
же функцию для каждой строки. С помощью свойств ColWidths и RowHeights можно 
изменять ширину столбца и высоту строки. Следующий код изменяет ширину столбца 
2 для TDrawGrid, названного DrawGridl, устанав ливая ее равной 20 пикселям: 

    DrawGridl.ColWidths[I]    :=  20; 


    Рис. 6.11. Пример использования сетки в элементе управления TCalendar 


    Свойства FixedRows и FixedCols определяют число закрепленных строк и 
столбцов, используемых для заголовков сетки. Ячейку в верхнем левом углу сетки 
можно определить с помощью TopRow и LeftCol. Число полностью видимых строк и 
столбцов возвращают свойства VisibleColCount и VisibleRowCount. Следующий код 
отображает набор ячеек справа внизу в элементе управления TDrawGrid, названном DrawGridl. 

    with DrawGridl do 
    begin 
    TopRow := RowCount - VisibleRowCount LeftCol := ColCount - VisibleColCount 
    end; 

    Свойство Options позволяет изменить поведение сетки, например отключить 
отображение линий сетки или разрешить изменения размеров столбцов и строк во 
время выполнения. 
    События OnColumnMoved и OnRowMoved генерируются при перемещении столбца 
или строки на новую позицию. Событие OnTopLef tChanged генерируется, когда вы 
прокручиваете сетку, чтобы отобразить скрытые ячейки. Событие OnSelectCell 
вызывается во время перемещения фокуса ввода в другую ячейку. 
    Элемент управления TDrawGrid рисует сетку; режим рисования по умолчанию 
заносит пробелы в ячейку и устанавливает шрифт ячейки в соответствии с тем, 
который определен свойством Font. Пользовательскую функцию прорисовки ячеек 
сетки необходимо привязать к событию OnDrawCell. 
    Поскольку ячейка может содержать все что угодно, вы должны обрабатывать 
свои данные вручную. TDrawGrid в начале редактирования ячейки вызывает событие 
OnGetEditText, позволяя установить редактируемый текст. Событие OnGetEditMask 
предоставляет возможность указать маску редактирования для ввода данных. 
Событие OnSetEdit-Text генерируется, когда изме нятся содержимое ячейки. 

    Глава 6. Использование компонентов Delphi 137 


    Элемент управления TStringGrid 

    Если вам надоело писать код, воспользуйтесь средством TStringGrid, которое 
обладает всеми функциональными возможностями TDrawGrid и автоматизирует 
хранение и поиск строк, используемых в качестве данных для сетки. 
    Свойство Cells предоставляет доступ к строке, соединенной с каждой ячейкой 
в сетке. Свойства Cols и Rows позволяют выбрать множество строк для каждого 
столбца и строки соответственно. 
    Процесс вывода рисунка по умолчанию дополнен возможностью вывода в ячейку 
текста, определенного в свойстве Cells. Для прорисовки содержимого ячеек 
необходимо определить обработчик события OnDrawCell. 

    Графика 

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

    Элемент управления Tlmage 

    Элемент управления Tlmage позволяет выводить изображение в форме. 
Изображение определяется с помощью свойства Picture. Если изображение больше 
элемента управления, оно урезается в рамке. Можно установить AutoSize равным 
True, чтобы автоматически увеличить или уменьшить элемент управления Tlmage в 
соответствии с изменением размера изображения. Есть и другая альтернатива — 
сохранять постоянным размер элемента управления, а растягивать или сжимать 
изображение, устанавливая свойство Stretch равным True. Вы можете выравнивать 
изображение в прямоугольнике элемента управления по центру, установив свойство 
Center равным True. Это не работает, если свойство AutoSize или Stretch 
установлено равным T rue. 

    Элемент управления TShape 

    Элемент управления TShape отображает геометрическую фигуру в форме, 
избавляя вас от его рисования с помощью методов TCanvas и события OnPaint. 
    По умолчанию в этом элементе управления свойство Style позволяет 
отобразить эллипс, прямоугольник, квадрат или круг. 
    Свойство Brush определяет заполнение объекта TShape цветом и узором. Стиль 
рамки, ее ширина и цвет определяются свойством Реп. 

    Элемент управления TBevel 

    Элемент управления TBevel просто отображает линию фаски (beveled line), 
блок или кадр в форме. Элемент управления TBevel позволяет придать сегментам 
форм трехмерный видГ""™" * " 
    Свойство Shape определяет, отображает ли элемент управления TBevel линию, 
блок или кадр. Свойство Style определяет, поднята фаска или опущена. 

    Элементы управления для работы с объектами во время выполнения 

    Эта группа компонентов позволяет управлять размером или положением 
элементов управления, помещенных в форму, во время выполнения. 

    Элемент управления TScrollBox 

    Элемент управления TScrollBox предоставляет возможность создавать область 
прокрутки в форме, которая может содержать набор элементов управления любых 
типов. Это полезно в том случае, если вы хотите оставить одни части экрана в 
определенном месте, прокручивая другие. Программа Paint из поставки Windows, 
показанная на рис. 6.12, является ярким приме ром использования области 
прокрутки: изображение, содержащееся в элементе управления TScrollBox, можно 
прокручивать, а панель инструментов и строка состояния остаются на месте. 

    Элемент управления TSplitter 

    Элемент управления TSplitter позволяет динамически изменять размер 
элементов управления во время выполнения. В окне программы Explorer в Windows 
(рис. 6.13) показан этот элемент управления, используемый для изменения 
размера области дерева каталогов. 
    Чтобы использовать элемент управления TSplitter, нужно установить свойство 
Align элементов управления равным значению, отличному от alNone. На рис. 6.13 
для области All Folders окна Explorer свойство Align установлено равным alLef 
t. Элемент управления TSplitter помещен справа от области All Folders, причем 
свойство Align также установлено равным alLeft. Для области Contents свойство 
Align установлено равным alClient, благодаря этому оно изменяет размеры, чтобы 
заполнить свободную область окна Explorer. 
    Минимальный размер для окна с изменяющимися размерами можно определять с 
помощью свойства MinSize элемента управления TSplitter. 

    138 Часть П. Разработка приложений 


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

    Рис. 6,13. Элемент управления TSplitter позволяет изменять размеры 
элементов управления во время выполнения 


    Системные элементы управления 

    Визуальные системные элементы управления заключают сложные функциональные 
возможности системы в удобные в использовании компоненты Delphi. 

    Элемент управления TOIeContainer 

    Элемент управления TOIeContainer позволяет легко добавлять поддержку 
объектов OLE 2.0 в прикладной программе на Delphi. Эта тема подробно 
рассматривается в главе 18, "Работа с OLE, серверы документов и элементы 
управления ActiveX". 

    Элемент управления TPaintBox 

    Элемент управления TPaintBox создает область рисования, выйти за границы 
которой невозможно. Это полезно, когда вы рисуете какой-нибудь специальный 
рисунок в форме и не хотите каждый раз проверять, не вышли ли вы за границу 
конкретной области. 
    Элемент управления TPaintBox генерирует событие OnPaint, когда поверхность 
требует перерисовывания и обеспечивает свойство Canvas, чтобы упростить 
процесс рисования. Этот вопрос подробно рассматривается в главе 22, "Работа с графикой". 

    Элемент управления TMediaPlayer 

    В элементе управления TMediaPlayer инкапсулированы форматы записей и 
обращения к API, которые составляют Media Control Interface. На рис. 6.14 
показан пример AVI-файла с дистрибутивного компакт-диска Delphi в элементе 
управления TMediaPlayer. 
    Тип средств мультимедиа определяется с помощью свойства DeviceType. 
Начальная и конечная позиции для воспроизведения или записи задаются с помощью 
свойств StartPos и EndPos. Текущая позиция возвращается в свойстве Position. 
    Каждую кнопку в элементе управления можно скрыть или заблокировать с 
помощью свойств VisibleButtons и EnabledButtons. 
    Если установить свойство Wait равным True, управление не будет возвращено 
прикладной программе, пока не завершится функция MCI. Например, если вы 
начнете проигрывать звуковую дорожку компакт-диска, а свойство Wait будет 
установлено равным True, управление не будет возвращено вашей прикладной 
программе, пока не закончится воспроизведение композиции 

    Рис. 6.14. TMediaPlayer предоставляет средство мультимедиа 


    Глава 6. Использование компонентов Delphi 139 

    Элемент управления генерирует событие Onclick после щелчка на кнопке. 
Можете выбрать выполнение заданного по умолчанию действия, связанного с 
кнопкой, например Play или Eject, или обеспечить свою собственную обработку. 
Событие OnPostClick происходит после вызова события OnClick. Если вы решили 
выполнить заданное по умолчанию действие, связанное с кнопкой, а свойство Wait 
установлено равным False, событие OnPostClick может вызываться до окончания 
события OnClick. 
    Свойство Notify определяет, сгенерировано ли событие OnNotifу, когда 
завершилась функция управления средств мультимедиа. Событие OnNotif у полезно, 
когда выполнение функции элемента управления средства мультимедиа может занять 
много времени. 
    По умолчанию элемент управления TMediaPlayer открывает отдельное окно для 
отображения видеосредств мультимедиа. Если это нежелательно, можете определить 
потомка TWinControl в свойстве Display, и элемент управления TMediaPlayer 
направит вывод на этот элемент управления. 
    Видеоформат MCI требует, чтобы его окно было выровнено по границе 
4-пиксельной сетки (т.е. сетки, шаг которой— 4 пикселя). Чтобы добиться этого, 
элемент управления TMediaPlayer корректирует свое по-^    ложение в форме. При 
вычислении координат формы не забудьте, что отсчет горизонтальных позиций 
начинается с нуля, а вертикальных —^ с единицы. 

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

    В Delphi содержится несколько компонентов, установленных на странице 
Samples палитры компонентов. Эти компоненты демонстрируют превосходные примеры 
гибкости и расширяемости (они находятся в библиотеке визуальных компонентов 
(VCL)). Типичные компоненты перечисленные ниже. 
    •    TGauge — потомок TGraphicControl. Отображает цветную полосу, 
указывающую позицию между двумя точками. Раньше использовался, чтобы отметить 
ход выполнения длительной операции. Компонент TGauge заменен элементом 
управления TProgressBar, который описывается в главе 7, "Общие элементы 
управления Win32". 
    К   TColorGrid — потомок TCustomControl. Представляет собой сетку для 
выбора цвета. 
    •    TSpinButton — потомок TWinControl. Снабжен двумя кнопками, которые 
обычно увеличивают или уменьшают значение. 
    •    TSpinEdit — потомок TCustomEdit. Ввод в TSpinEdit ограничен только 
числами, и это средство обеспечивает элемент управления TSpinButton, чтобы 
увеличивать и/или уменьшать значение. 
    •    TDirectoryOutline — потомок TCustomOutline. Отображает структуру 
каталога для конкретного диска. В   TCalendar — потомок TCustomGrid. 
Отображает выбранный календарный месяц в сетке. 

    Невизуальные компоненты 

    Невизуальные компоненты заключают сложные функции системы в компоненты 
Delphi, ускоряя процесс разработки. 

    Компоненты диалогов 

    В Windows существует несколько стандартных диалоговых окон, названных 
общими диалогами, используемых для открытия и сохранения файлов, установки 
шрифтов и параметров печати. Delphi распределяет общие диалоги по нескольким 
простым компонентам, которые можно сгруппировать в соответствии с их 
функциональными возможностями. 

    Диалоговые окна для выполнения операций с файлами 

    Группа диалоговых окон для операций с файлами позволяет выбирать файлы, 
используемые в прикладной программе. В этой группе содержится два основных 
компонента — TOpenDialog (для открытия файлов) и TSaveDialog (для сохранения файлов). 

    Компонент TOpenDialog 

    Компонент TOpenDialog формирует стандартный диалог открытия файла (см. 
рис. 6.1). 
    Заголовок диалога определяется свойством Title. Свойство InitialDir 
определяет отображаемый каталог, когда диалог активизируется впервые. 

    140 Часть II. Разработка приложений 

    Файлы, отображаемые в диалоге, можно фильтровать с помощью свойства 
Filter. Свойство Filterlndex назначает заданный по умолчанию фильтр, 
используемый при первом появлении диалога. 
    Свойство FileName возвращает полный путь для выбранного файла. Свойство 
Def aultExt содержит заданное по умолчанию расширение файла для имени файла в 
поле File name. В свойстве Files содержится список выбранных файлов для 
диалого_в»,ко,торые поддерживают•многократный_выбор. 
    Свойство Options позволяет определить несколько опций для диалога, 
например отобразить кнопку Help или скрыть кнопку Network. 
    Следующий код отображает "возраст файла", выбранного с помощью диалога 
opndlgFile типа TOpenDialog. 

    var 
    iAge : Integer; begin 
    if opndlgFile.Execute then begin 
    iAge := FileAge(opndlgFile.FileName); 
ShowMessageTDateToStr(FileDateToDateTime(iAge))); end; end; 

    Компонент TSaveDialog 

    Компонент TSaveDialog заменяет кнопки и надписи компонента TOpenDialog, 
чтобы указать на сохранение, а не открытие файлов. Компонент TSaveDialog 
показан на рис. 6.15. 

    Шрифт 

    Компонент TFontDialog инкапсулирует стандартный диалог выбора шрифта (рис. 6.16). 

    Рис. 6.15. Компонент TSaveDialog упрощает ввод имени сохраняемого файла 

    Рис. 6.16. Компонент TFontDialog позволяет выбрать шрифты принтера и экрана 

    Выбранный шрифт возвращается в свойстве Font. 
    Вы можете ограничить список шрифтов, отображаемых в диалоге, либо 
экранными, либо шрифтами принтера (или обоими сразу) с помощью свойства 
Device. Свойства MaxFontSize и MinFontSize позволяют ограничить диапазон 
доступных размеров шрифта. 
    Свойство Options позволяет устанавливать много опций для диалога, например 
фиксированный шаг или доступность эффектов наподобие перечеркивания и подчеркивания. 
    Событие OnApply вызывается после щелчка на кнопке Apply. 

    Цвет 

    TColorDialog представляет стандартное цветное диалоговое окно выбора, 
показанное на рис. 6.17. 
    Цвет, выбранный в диалоге, возвращается в свойстве Color. 
    Свойство CustomColors позволяет определить набор цветов, которые 
добавляются в набор, отображаемый в диалоге. 

    Глава 6. Использование компонентов Delphi 141 


    Принтер 

    Этот набор обеспечивает доступ к диалоговым окнам TPrintDialog и 
TPrinterSetupDialog, используемым для управления печатью. 

    Компонент TPrintDialog 

    В компоненте TPrintDialog содержатся стандартные опции диалогового окна 
печати (см. рис. 6.10). 
    Диалоговое окно предоставляет три опции для определения диапазона печати — 
все, диапазон страниц и выбор Свойство PrintRange определяет, какая опция 
выбрана по умолчанию. 
    Если выбрать диапазон страниц, он возвращается в свойствах FromPage и 
ТоРаде. Можно ограничить диапазон этих значений с помощью свойств MinPage и МахРаде. 
    Число копий возвращается в свойстве Copies. Свойство Collate указывает, 
будет_ли печать объединена. 
    Свойство PrintToFile указывает, что нужно отослать вывод в файл, а не на принтер. 
    Свойство Options позволяет настроить поведение диалога печати. Оно может 
запретить такие действия, как печать в файлы и ввод диапазона страниц. 

    Компонент TPrinterSetupDialog 

    Компонент TPrinterSetupDialog позволяет настроить принтер до начала выдачи 
информации на печать. Этот компонент показан на рис. 6.18. 

    Print Setup 

    Рис. 6.18. Компонент TPrinterSetupDialog используется для настройки 
принтера перед запуском задания на печать 

    Рис. 6.17. С помощью тсо1-orDialog можно выбрать цвет из палитры 

    Текст 

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

    Компонент TFindDialog 

    Компонент TFindDialog представляет стандартный текстовый диалог поиска, 
как показано на рис. 6.19. 
    Свойство FindText содержит строку, которую будет искать прикладная 
программа. Событие OnFind вызывается после щелчка на кнопке Find Next. 
    Свойство Position определяет место на экране, где появляется диалоговое окно. 
    С помощью свойства Options можно усовершенствовать поведение диалога. Оно 
позволяет отключить некоторые особенности, например чувствительность к 
регистру или поиск целого слова. 

    Компонент TReplaceDialog 

    Компонент TReplaceDialog формирует стандартное диалоговое окно поиска и 
замены, показанное на рис. 6.20. 
    Компонент TReplaceDialog поддерживает все возможности TFindDialog. 
    Свойство ReplaceText содержит текст, который прикладная программа 
использует в качестве замены для текста, определенного в FindText. 
    Событие OnReplace генерируется с помощью щелчка на кнопке Replace или 
Replace All. Свойство Options позволяет выбрать один из двух типов замены. 

    142 Часть II. Разработка приложений 


    Рис. 6.19. Компонент TFindDialog позволяет искать текст 

    Рис. 6.20. Диалоговое окно компонента тке-placeDialog позволяет искать и 
заменять текст 


    Системные компоненты 

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

    TMainMenu и TPopupMenu 

    Компонент TMainMenu представляет строку меню, находящуюся в верхней части 
окна большинства прикладных программ. Компонент TPopupMenu обеспечивает 
контекстное меню, обычно отображаемое с помощью одного щелчка правой кнопкой 
мыши нЁГоТЗ'Бекте. 
    В свойстве Items содержится список объектов TMenuItem, из которых состоит меню. 
    Проектировщик меню (Menu Designer), показанный на рис. 6.21, позволяет 
создать структуру меню. 

    Компонент TMenuItem 

    Единственное событие для компонента TMenuItem, Onclick, вызывается после 
щелчка левой кнопкой мыши на элементе меню или нажатия клавиши <Enter> при 
выделенном пункте меню. 
    Объект TMenuItem также включает свойство Items, позволяя создавать подменю. 
    Свойство Shortcut определяет комбинацию клавиш для выбора пункта меню. 
Пример можно найти в системе меню Delphi. Выполнить команду File^Save — это 
все равно что нажать комбинацию клавиш <Ctrl+S>. 
    Компонент TMenuItem может действовать, подобно TCheckBox, с помощью 
свойства Checked. Свойство Ra-dioltem позволяет эмулировать 
функциональные"возможности мж>жестащ^^а?лаВцЬ?оп. 

    Компонент TTimer 

    Компонент TTimer генерирует событие OnTimer по истечении предопределенного 
времени. Диалоговое окно Date/Time Properties, показанное на рис. 6.22, 
использует компонент TTimer для обновления значения времени. 

    Рис. 6.21. Проектировщик меню предоставляет возможность быстро создать 
основные и контекстные меню 

    Рис. 6.22. Компонент TTimer периодически вызывает некоторое событие 

    Свойство Interval определяет интервал в миллисекундах между запусками 
события OnTimer. 

    Глава 6. Использование компонентов Delphi 143 


    Резюме 

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

    Визуальные компоненты 

    В этом разделе была представлена иерархия объектов Delphi, рассматривались 
общие свойства и события и рассказывалось о группах элементов управления и их использовании. 
    Иерархия объектов Delphi позволяет объектам наследовать общие свойства и 
события, изменять существующее поведение или добавлять новые функциональные 
возможности. Элемент управления TControl включает стандартные свойства, 
например Caption и Color, и стандартные события, например OnMouseDown и OnMouseMove. 
    Элементы управления делятся на две категории — на потомков TWinControl и 
потомков TGraphicControl. 
    Потомки TWinControl могут получить фокус ввода или ввод с клавиатуры 
и?одержат функцию обработки события окна, с помощью.которой можно..обращаться 
к функциям API низкого уровня. Потомки TWinControl вызывают несколько новых 
событий, например OnEnter и OnKeyDown. 
    Потомки TGraphicControl используются главным образом для отображения 
графики и форм. Они не содержат функции обработки события окна и, 
следовательно, не могут получать фокус ввода. 
    В этой главе рассматривались группы, существующйё'ЁГбйблиотеке 
VisuafCoTTiponent Library (VCL), например группа. в которой содержатся 
компоненты TCheckBox и TRadioButton, и элементы управления TRadioGroup. 

    Невизуальные компоненты 

    В этом разделе речь шла о двух категориях невизуальных компонентов 
—диалоговых и системных. 
    Категория диалога предоставляет прямой доступ к общим диалогам Windows, 
таким как стандартный диалог открытия файла или диалог выбора цвета. 
    Категория системных компонентов обеспечивает поддержку функциональных 
возможностей визуальных компонентов. Компоненты TMainMenu и TPopupMenu 
упрощают разработку меню прикладной программы (часто довольно сложную). 
Компонент TTimer служит в качестве генератора событий. 

    144 Часть II. Разработка приложений 

