Прогуливаясь по интернет-страницам, вам наверняка не раз приходилось сталкиваться с упоминаниями об iPad. Многих впечатляет, с каким нетерпением люди ждут выхода новых моделей этого легендарного планшета и наверняка возникает закономерный вопрос: «так для чего же нужен iPad и что он из себя представляет?» Сейчас, когда мы получили представление о том, что из себя представляет iPad, пора разобраться с тем, зачем нам вообще он так необходим и почему во всем мире находятся миллионы ярых поклонников этого большого, но такого красивого устройства.
Shell -- это командная оболочка. Но это не просто промежуточное звено между пользователем и операционой системой, это еще и мощный язык программирования. Программы на языке shell называют сценариями, или скриптами. Фактически, из скриптов доступен полный набор команд, утилит и программ UNIX. Если этого недостаточно, то к вашим услугам внутренние команды shell -- условные операторы, операторы циклов и пр., которые увеличивают мощь и гибкость сценариев. Shell-скрипты исключительно хороши при программировании задач администрирования системы и др., которые не требуют для своего создания полновесных языков программирования.
Глава 1. Использование Object Pascal и VCL при создании приложений для Windows
Ни для кого не секрет, что основой Delphi явился язык программирования Object Pascal. Этот язык хорошо зарекомендовал себя и пользовался популярностью у большого числа программистов. Разумным решением стал перенос Object Pascal на платформу Microsoft Windows. Для удобства разработчика приложений для Windows на языке Object Pascal создали среду разработки Delphi. Главной чертой Delphi стало использование технологии визуального программирования. Разработчиками Delphi была внедрена специальная библиотека визуальных компонентов (Visual Component Library, VCL).
В этой главе мы рассмотрим, что нам предлагает Delphi для разработки приложений под Windows. Изучим интегрированную среду разработки и стандартные компоненты Delphi. Создадим простейшее приложение на Delphi. Рассмотрим, что такое объект, его внутреннее строение, как создаются и уничтожаются объекты. Изучим родительский класс TObject. И, наконец, кратко рассмотрим основные понятия объектно-ориентированного программирования: инкапсуляцию, наследование и полиморфизм.
Что нового для разработчика включено в Delphi 5/6
В пятую версию Delphi вошли следующие новые технологии и возможности:
- ADO (ActiveX Data Object). Является альтернативной технологией по отношению к BDE (Borland Database Engine), позволяющей получать доступ к данным различного формата;
- средство проектирования Data Module Designer (Редактор модулей данных). Позволяет создавать и работать с модулями данных;
- компоненты подсистемы InterBase Express. Позволяют пользоваться серверами InterBase удобным способом. При этом использование BDE не требуется;
- расширение MIDAS. В новой версии Delphi технология MIDAS поддерживает удаленные модули данных;
- изменения в CORBA. CORBA теперь может работать с VisiBroker для C++ ORB версии 3.32. Существенно уменьшено количество сообщений между клиентом CORBA и сервером;
- новые возможности отладки программ. Встроенный отладчик имеет новые характеристики, включая способность устанавливать отладку параметров для специфических процессов;
- расширения VCL (Visual Component Library). VCL теперь содержит несколько новых объектов, свойств и событий, в том числе новые компоненты для работы с Web и связью;
- фреймы (Frames). Это специальный тип форм, которые могут размещаться в пределах других форм или фреймов;
- возможность настройки рабочего стола и сохранение нескольких вариантов настроек;
- список To-Do. Содержит список задач, которые необходимо выполнить для завершения проекта;
- категории свойств в инспекторе объектов. Инспектор объектов позволяет фильтровать свойства и события по категориям;
- изображения на выпадающих списках инспектора объектов. В инспектор объектов добавлена возможность просмотра в выпадающих списках небольших рисунков, таких как изображения курсоров;
- новые возможности менеджера проектов (Project Manager). Менеджер проектов упрощает управление проектами. Теперь можно свободно оперировать файлами различных проектов, перегруппировывать их, добавлять любой файл к проекту. Файлы ресурсов, которые добавляются к проекту, компилируются в файлы с расширением RES и присоединяются к проекту;
- расширение возможностей ActiveX. Импортируемые серверы СОМ могут быть использованы как компоненты для визуальной разработки;
- новые мастера (Wizards). Два новых мастера помогают создавать приложения для Панели управления Windows и консольных приложений;
- улучшения редактирования. Предпочтения по редактированию теперь централизованы и вызываются отдельной командой Tools/Editor Options (Средства/Настройки редактора);
- новое окно просмотра проекта
- сохранение файлов форм в виде текста. Файлы форм (DFM) теперь по умолчанию сохраняются в виде текста, а не в двоичном виде, как раньше. Имеется возможность сохранения форм и в бинарном файле;
- новые возможности автоматического создания форм. В прежних версиях Delphi, при создании новых форм, они все, за редким исключением, помещались в список автоматически создаваемых форм (Autocreated Forms). В новой версии Delphi разработчик может самостоятельно выбрать, помещать ли вновь создаваемые формы в этот список, либо в список доступных форм (Available Forms), в данном случае в список автоматически создаваемых форм поместится только главная форма проекта;
- параметры в командной строке IDE. В новой версии Delphi можно запускать IDE из командной строки с использованием нескольких новых параметров, особенно полезных для отладки. Например, параметры, позволяющие отображать, сколько оперативной памяти занято в настоящий момент, выводить все сообщения в log-файл и др.;
- международные инструментальные средства. Новый блок инструментальных средств, называемый встроенной средой перевода (Integrated Translation Environment), предназначен для упрощения программной локализацией и одновременной разработки разноязычных версий;
- компоненты NetMaster. Компоненты NetMaster размещаются на отдельной вкладке палитры компонентов, которая называется FastNet.
Все вышеперечисленное вошло в версию Delphi Enterprise, в других версиях какие-то из описанных нововведений могут отсутствовать. Рассмотрим некоторые из перечисленных нововведений более подробно.
Новый редактор модулей данных (Data Module Designer) представляет собой одно из средств визуализации разработки приложений. Модуль данных выглядит как полноценное представление модели данных, используемой в разрабатываемом приложении (рис. 1.1). Редактор модулей данных можно открыть с помощью команды главного меню File/New/Data Module (Файл/Новый/Модуль данных).
Если посмотреть на страницу диаграммы данных (Data Diagram), то можно увидеть диаграмму, внешне напоминающую диаграмму "сущность-связь", которая обычно изображается при проектировании данных с помощью CASE-средств. Редактор модулей данных предоставляет разработчику простое визуальное средство проектирования баз данных. В частности, при соединении изображений компонентов-наследников TDataSet с помощью мыши будут автоматически добавлены новые необходимые компоненты (например, TDataSource), будут установлены значения свойств для обеспечения этой связи. Тип устанавливаемой связи можно указать, нажав соответствующую кнопку на вертикально расположенной панели инструментов, находящейся слева от диаграммы. Кроме компонентов TDataset, на странице диаграммы данных могут быть отображены и другие компоненты, с которыми можно работать таким же образом.
Начиная с пятой версии, Delphi поддерживает так называемый список То-Do - список действий, которые необходимо выполнить для завершения текущего проекта.
Рис. 1.1. Редактор модулей данных
Задания списка To-Do могут относиться не только целиком к проекту, но и к отдельному модулю. Список действий можно получить, выбрав в главном меню Delphi команду View/To-Do List (Просмотр/Список действий). В появившемся окне (рис. 1.2) можно добавлять задания в список, отмечать выполненные, редактировать их и менять приоритет выполнения заданий.
Рис. 1.2. Список То-Do
Добавление задания в список можно осуществить с помощью контекстного меню, либо с помощью комбинации клавиш <Ctrl>+<Shift>+<T>. При этом появляется окно создания нового задания (рис. 1.3).
Задания, внесенные в список To-Do для отдельного модуля, хранятся в качестве комментариев в исходном тексте модуля:
{ TODO 1 : Изменить название кнопке ОК }
Рис. 1.3. Создание нового задания
Задания для всего проекта хранятся в файле с расширением TODO. В списке To-Do задания для отдельного модуля и всего проекта отображаются разными значками. Если модуль, к которому относится задание в списке, не загружен в редактор кода, то данное задание будет выделено серым цветом. Каждое задание может иметь приоритет, имя исполнителя, категорию, текст задания и отметку о выполнении:
{ DONE 1 : Изменить название кнопке ОК }
По всем из вышеперечисленных параметров список To-Do может быть отсортирован.
Новая версия Delphi позволяет создавать многоязыковые приложения. Причем позволяет это делать параллельно. Например, когда создается одновременно русская и английская версия приложения. Рассмотрим, как, используя новые средства Delphi, под общим названием встроенная среды перевода (Integrated Translation Environment), можно создать одновременно русскую и английскую версию приложения. Для этого создадим новый проект, который состоит из одной формы, на которой расположим две кнопки. Затем в главном меню Delphi выберем команду Project/Languages/Add (Проект/Языки/Добавить), после чего запустится мастер (рис. 1.4), выдающий последовательность диалоговых окон, в которых нужно выбрать поддерживаемые приложением языки, в нашем случае - это русский и английский (США).
После выполнения всего вышеописанного, будет автоматически запущен менеджер перевода (Translation Manager) (рис. 1.5).
Менеджер перевода представляет собой редактор строковых ресурсов, которые могут присутствовать в форме. В менеджере перевода имеются сведения о тех свойствах элементов интерфейса, которые могут отличаться в разноязычных версиях. В число этих свойств входят не только такие, как caption или text, но и другие визуальные характеристики. Изменим для каждой версии названия кнопок (Buttoni. Caption и Button2. Caption): в английской версии на "Yes" и "No" и "Да", "Нет" для русской версии. Сменим в русской версии название формы (Formi. caption) на "Приложение". Теперь дадим через главное меню Delphi команду Project/Language/Set Active (Проект/Язык/ Сделать активным) и выберем русский или английский язык. Откомпилируем проект, и мы получим нужную языковую версию (рис. 1.6).
Рис. 1.4. Мастер создания многоязычных приложений Add Languages
Рис. 1.5. Окно Translation Manager
Рис. 1.6. Версии разноязычных приложений
В библиотеку визуальных компонентов (VCL) Delphi также были внесены значительные изменения. Среди них:
- компонент TApplicationEvents. В ранних версиях Delphi для создания обработчика событий объекта TAppiication необходимо было сначала создать процедуру, а затем присвоить имя этой процедуры обработчику события TAppiication. В пятой версии Delphi появился новый невизуальный компонент. Можно поместить его на форму приложения и в окне инспектора объектов (описание инспектора объектов см. далее в этой главе) станет возможным обрабатывать все события TAppiication, причем работать привычным образом, так же, как и с другими компонентами Delphi;
- класс TAppietAppiication. Специально для создания приложений для панели управления Windows, имеющих расширение CPL, в Delphi 5 был введен новый класс TAppietAppiication. Приложение подобного типа может иметь в своем составе несколько модулей - потомков класса TAppletModuie, каждый из которых будет отображен в панели управления Windows. Для создания такого приложения необходимо выбрать пункт главного меню Delphi File/New/Control Panel Application (Module) (Файл/Новый/Приложение панели управления);
- новые события компонентов TTooiBar и TListview. Для этих компонентов
был добавлен ряд событий (onAdvancedCustomDrawItem, OnAdvancedCustomDraw,
и др.). Обработчики этих событий имеют дополнительный параметр, указывающий, на какой стадии перерисовки изображения наступает данное событие;
- введены новые классы контейнерного типа. Это классы-потомки класса TList: TObjectList, TComponentList и TciassList. Данные классы предна-значены для хранения ссылок на объекты, компоненты и классы соответственно. Также в Delphi 5 введены новые классы TObjectQuery и TObjectstack, которые предназначены для хранения ссылок на объекты в виде очередей и стеков.
Одним из очень полезных нововведений в Delphi 5 стали фреймы (frames). Фреймы - это визуальные контейнеры, которые можно создавать, размещать на них различные компоненты (так же, как и на формах) и, в дальнейшем, использовать их в формах. Создать новый фрейм можно с помощью пункта главного меню Delphi File/New Frame (Файл/Новый фрейм). После того как все необходимые фреймы будут созданы, их можно размещать на формах вашего приложения с помощью компонента Frames в стандартной палитре компонентов. Важным фактором является то, что при размещении фрейма на форме Delphi создает наследника класса выбранного фрейма. То есть, при изменении свойств компонентов в исходном фрейме эти изменения автоматически происходят в фреймах-наследниках. При желании, можно зарегистрировать часто используемый фрейм в палитре компонентов.
Для этого достаточно выполнить стандартную процедуру регистрации компонента.
Среда программирования Delphi изначально была ориентирована на работу с базами данных. Поэтому от версии к версии происходили улучшения старых и создание новых механизмов работы с базами данных. В Delphi 5 расширился набор компонентов для работы с базами данных. В палитре компонентов появилась новая вкладка InterBase Express. На ней расположены компоненты, предназначенные для доступа к серверу баз данных IB Database версии 5.5 или выше. При этом все компоненты данной вкладки используют его клиентский API, что полностью избавляет от необходимости использовать BDE.
Еще одно новое средство для работы с базами данных - это ADO (ActiveX Data Objects). Компонентам ADO выделена одноименная вкладка палитры компонентов. ADO - представляют собой СОМ-серверы, использующие OLE DB для работы с данными. СОМ-серверы входят в состав многих продуктов фирмы Microsoft. ADO-компоненты для своей работы также не требуют наличия BDE. В Delphi 5, в связи с поддержкой ADO, введены новые классы-потомки TFields, разработанные для поддержки типов данных, которые характерны для ADO.
Естественно, не обошлось без изменений компонентов, поддерживающих BDE. Начиная с пятой версии Delphi, у компонента TDatabase появился новый метод Execute, который позволяет выполнять SQL-запросы без использования специального компонента TQuery.
Ну и, конечно, не осталась без внимания разработчиков Delphi такая технология, как COM. Delphi 5, при импорте библиотек типов в приложениях, позволяет установить СОМ-серверы в палитру компонентов. Полученные в результате компоненты являются наследниками класса TOLEServer и обладают событиями, которые имеются у данного объекта. Это позволяет создавать обработчики событий СОМ-серверов с помощью инспектора объектов. Свойства СОМ-серверов доступны только на этапе выполнения приложения, поэтому в инспекторе объектов они не отображаются. Поддержку СОМ-серверов мы подробно рассмотрим в главе 3.
Интегрированная среда разработки Delphi (IDE)
Для программиста очень важным, если не главным, является удобство работы со средой разработки. От этого зависит как качество, так и скорость создания приложения. Интегрированная среда разработки Delphi достаточно удобна для эффективного и быстрого создания приложений. Авторы Delphi длительное время совершенствовали среду разработки. Не менее важным является возможность настройки среды программирования по собствен
ному желанию. Delphi позволяет разработчику настраивать среду "под себя". В этом разделе мы рассмотрим основные элементы интегрированной среды Delphi 5 (6).
Основные части интегрированной среды разработки
Интегрированная среда разработки Delphi состоит из четырех основных частей (окон), которые отображаются при запуске среды:
- главного окна (Main Window); - конструктора форм (Form Designer); - инспектора объектов (Object Inspector); - редактора кода (Code Editor). Главное окно является основной частью интегрированной среды разработки (рис. 1.7). Оно выглядит как стандартное окно Windows и содержит в себе три составляющих его части: меню, панели инструментов и палитру компонентов.
Рис. 1.7. Главное окно Delphi
Меню главного окна Delphi содержит стандартные для любой программы пункты. Меню - это самая верхняя строка главного окна Delphi. При помощи меню можно работать с файлами, проектами, формами, настраивать установки Delphi и многое другое. Меню главного окна позволяет устанавливать новые компоненты, а также вызывать другие инструменты разработки. Некоторые пункты меню Delphi можно выполнить при помощи "горячих клавиш", например, команду Open Project (Открыть проект) можно выполнить с помощью комбинации клавиш <Ctrl>+<Fll>.
Панели инструментов состоят из шести панелей, расположенных под меню главного окна (панель Desktop расположена справа от меню) и содержат кнопки для вызова некоторых команд меню главного окна. Панели разбиты по функциональному назначению.
Стандартная панель (Standard) содержит кнопки для работы с файлами проекта и позволяет создавать, сохранять и удалять файлы проекта.
Панель просмотра (View) служит для работы с формами и текстом программ. Панель отладки (Debug) позволяет запускать и отлаживать приложение. Панель пользователя (Custom) предназначена для разработчика.
Панель рабочий стол (Desktop) - позволяет сохранять сведения о том, какие окна среды разработки открыты и где именно они расположены на экране. Такие сведения называются конфигурацией рабочего стола Delphi. Delphi позволяет создавать и сохранять несколько конфигураций рабочего стола. Кроме того, можно выделить конфигурацию, которая будет автоматически загружаться в режиме отладки (debug desktop) и выгружаться при выходе из пего. Для вышеперечисленных целей можно использовать кнопки: Save current desktop (Сохранить текущую конфигурацию рабочего стола) и Set debug desktop (Задать текущую конфигурацию рабочего стола). Все сохраненные конфигурации среды разработки хранятся в каталоге Delphi\Bin в файлах с расширением DST.
Рис. 1.8. Окно настройки
Рис. 1.9. Вкладка Commands
Вы можете сами указывать кнопки, которые будут располагаться на тех или иных панелях при помощи диалогового окна настройки Customize (рис. 1.8). Это окно можно вызвать из контекстного меню, щелкнув правой кнопкой в области панели управления, либо использовать пункт меню Delphi View/Toolbars/Customize (Просмотр/Панели управления/Настройка).
В окне настройки имеются три вкладки: Toolbars (Панели инструментов), Commands (Команды) и Options (Опции).
Вкладка Toolbars (рис. 1.8) позволяет показывать или скрывать вкладки панели инструментов.
На вкладке Commands (рис. 1.9) располагаются категории команд и сами команды, которые можно выбрать, щелкнув на названии команды, а затем на необходимой панели инструментов. В результате вышеописанных действий на выбранной панели инструментов появится новая кнопка. Для удаления ненужной кнопки с панели инструментов достаточно щелкнуть на этой кнопке левой кнопкой мыши и, удерживая ее, переместить на любое место экрана вне панелей инструментов.
Вкладка Commands очень удобное средство добавления практически любых команд на панель инструментов для быстрого доступа.
Наконец, вкладка Options (рис. 1.10) позволяет работать со всплывающими подсказками (tips) панелей инструментов.
Рис. 1.10. Вкладка Options
Вы можете запретить или разрешить показывать подсказки (Show tooltips) при наведении курсора на любую кнопку панели инструментов. А также, имеется возможность разрешить или запретить показывать во всплывающих подсказках комбинации "горячих клавиш", выполняющих ту же функцию, что и кнопки на Панели инструментов.
Палитра компонентов сразу после установки Delphi состоит из девятнадцати вкладок, на которых расположены компоненты в виде значков. Каждая вкладка объединяет компоненты по назначению. Палитру компонентов можно настраивать по своему усмотрению с помощью окна Palette Properties (Свойства палитры). Открыть это окно можно при помощи контекстного меню, вызываемого щелчком правой кнопки на палитре компонентов или с помощью пункта меню главного окна Delphi Component/Configure Palette (Компонент/Конфигурация палитры). Палитра компонентов состоит из следующих вкладок:
- Standard (содержит стандартные компоненты, такие как кнопки, надписи и т. д.);
- Additional (дополнительные компоненты, такие как рисунок, маска ввода и т. д.);
- Win32 (доступ к 32-разрядному интерфейсу Windows);
- System (содержит системные компоненты, такие как таймер, медиаплейер и т. д.);
- Data Access (доступ к данным приложений баз данных с помощью BDE); - Data Controls (управление данными приложений баз данных);
- ADO (доступ к данным приложений баз данных с помощью ActiveX);
- Interbase (доступ к базе данных Interbase);
- Midas (работа с распределенными базами данных);
- InternetExpress (построение приложений, которые являются одновременно Web-сервером и распределенной базой данных);
- Internet (создание Web-серверов для сети Internet);
- FastNet (обеспечивает ряд протоколов для доступа к сети Internet);
- Decision Cube (обеспечивает многомерный анализ данных для приложений баз данных);
- QReport (визуальная разработка отчетов для приложений баз данных);
- Dialogs (компоненты для использования стандартных диалоговых окон Windows, такие как Save, Open, Print и т. д.);
- Win3.1 (содержит компоненты управляющих элементов Windows 3.1 для совместимости приложений, написанных в ранних версиях Delphi под Windows 3.1);
- Samples (содержит примеры компонентов, которые могут быть построены разработчиком);
- ActiveX (содержит компоненты ActiveX);
- Servers (содержит компоненты для обычных СОМ-серверов).
Компоненты, расположенные на описанных выше вкладках, делятся на визуальные и невизуальные.
Визуальными называются компоненты, которые видны на форме во время выполнения приложения, а невизуальными - компоненты, которые отображаются на форме во время этапа проектирования в виде небольших значков и не отображаются на форме во время выполнения приложения.
Конструктор форм (рис. 1.11) при первоначальном запуске Delphi представляет собой обычное окно Windows, не содержащее никаких элементов. Это окно называется формой (Form). Разработчик размещает на форме необходимые компоненты из палитры компонентов простым перетаскиванием. С помощью мыши можно изменять размеры формы, а также ее положение на экране. Разрабатываемое приложение может содержать несколько форм (см. рис. 1.6).
Для настройки свойств, методов и событий компонентов используется инспектор объектов (Object Inspector) (рис. 1.12).
Инспектор объектов предназначен для выполнения трех основных функций: - установки свойств компонентов, размещенных на форме; - помощи в навигации и создании обработчиков событий; - фильтрации свойств и событий.
Рис. 1.11. Конструктор форм
Рис. 1.12. Инспектор объектов (окно Object Inspector, вкладка Properties)
Инспектор объектов состоит из списка объектов и вкладок свойств (Properties) и событий (Events).
Список объектов предназначен для быстрой навигации среди объектов и представляет собой выпадающий список, содержащий в себе все компоненты текущей формы. Активный компонент отображается в верхней строке выпадающего списка. На рис. 1.12 активным компонентом является сама форма Form 1.
Вкладка свойств (Properties) служит для установки необходимых свойств активного компонента во время проектирования. Установка свойств компонента во время проектирования задает начальные свойства объекта во время выполнения. Все свойства перечислены в левой части вкладки Properties, значения свойств расположены в правой части. Свойства могут быть отмечены значком "+", расположенным слева от названия свойства. При щелчке левой кнопкой мыши на этом значке откроются под свойства данного свойства. Значок "+" при этом сменится на "-".
Для возвращения свойства в исходное состояние (со знаком "+") достаточно щелкнуть на значке "-". Если значение свойства может быть установлено через стандартное диалоговое окно Windows, то рядом со значением свойст
ва при его выборе появляется кнопка "...", при нажатии на которую это диалоговое окно и вызывается. Оно также может вызываться при двойном щелчке мыши на значении свойства.
Если значение свойства является перечисляемым, то при выборе свойства появляется кнопка со стрелкой вниз, при нажатии на которую в выпадающем списке будут перечислены все значения, которые может принимать данное свойство. Выбор производится простым щелчком мыши по нужному значению.
Благодаря изменениям, которые были внесены разработчиками Delphi в API, отвечающей за создание свойств, вы можете видеть у некоторых свойств изображение прямоугольника, заполненного соответствующим рисунком. Например, рядом со свойством Color будет прямоугольник, закрашенный выбранным цветом. При создании собственных компонентов вы можете указать, что именно должно быть нарисовано в инспекторе объектов при задании определенного свойства вашего компонента.
Вы можете также группировать свойства по категориям, для этого нужно щелкнуть правой кнопкой мыши на свойствах и выбрать в выпадающем меню Arrange/by category (Группировать/по категории). При этом вкладка свойств (Properties) примет вид, как на рис. 1.13.
Рис. 1.13. Свойства, сгруппированные по категориям
Вы можете просмотреть свойства той или иной категории, щелкнув на значке "+" слева от названия категории. Имеется возможность скрывать и отображать отдельные группы свойств, это делается следующим образом: щелкните правой кнопкой мыши на свойстве или группе свойств, выберите из выпадающего меню пункт View (Просмотр). Те группы свойств, которые отмечены флажком, являются видимыми. По умолчанию, группа свойств наследования Legacy не отображается.
Обратите внимание, что свойства для разных объектов могут довольно сильно отличаться. В Delphi имеется возможность множественного выбора объектов на форме (для этого необходимо, удерживая нажатой клавишу <Shift>, последовательно щелкать на выбираемых объектах активной формы). При этом в окне Инспектора объектов будут отображаться свойства, которые присутствуют одновременно у всех этих объектов. Изменение значения какого-либо из свойств, приводит к изменению этого свойства у всех выбранных объектов.
Вкладка событий (Events) (рис. 1.14) содержит список событий (системных и пользовательских), которые могут произойти с объектом, выбранным в окне выбора объекта. Список событий отличается для разных объектов. Названия событий перечислены на правой части вкладки событий.
Название каждого события начинается с приставки
On.
Для того чтобы привязать к какому-либо событию процедуру-обработчик (event handler), достаточно сделать двойной щелчок мышью в правой части вкладки событий напротив выбранного события. При этом активируется окно редактора кода. При создании простейшего приложения мы рассмотрим, как создавать процедуры-обработчики.
Рис. 1.14. Вкладка событий Events
При выборе любого события справа от него появляется выпадающий список, содержащий все доступные обработчики событий. Разработчик может выбрать любую из программ-обработчиков. Эта функция полезна, когда разработчик связывает одну процедуру-обработчик с несколькими событиями.
Редактор кода - это полноценный текстовый редактор, который включает в себя дополнительные функции:
- стилевое редактирование;
- проверку синтаксиса и цветовую подсветку команд; и многое другое.
Большинство команд редактора доступно в его контекстном меню. Для настройки редактора кода нужно выбрать в меню главного окна Delphi пункт Tools/Environment Options (Средства/Настройки среды).
Когда разработчик начинает новый проект, Delphi добавляет новую страницу (модуль) в редакторе кода для главной формы. По умолчанию ей присваивается имя Unit1.
Если в проекте присутствует несколько форм, то для каждой формы в редактор кода добавляется новый модуль (Unit2, Unit3 и т. д.). Разработчик может сам добавлять новые модули (Unit) при помощи пункта меню главного окна Delphi File/New/Unit (Файл/Новый/Модуль). При этом важно помнить, что для каждой формы Delphi автоматически создает модуль, т. е. форма обязательно связана с каким-либо модулем проекта. Если модуль был
создан разработчиком, то он является независимым и не связан ни с какой формой проекта. В такой модуль удобно выносить подпрограммы, используемые разными модулями проекта либо разными проектами. Редактор кода состоит из двух частей: окна просмотра и редактирования кода (Code Browser) и окна проводника (Code Explorer).
Рис. 1.15. Редактор кода Code Editor
Окно просмотра и редактирования кода отображает весь программный код, связанный с текущим модулем. Это окно позволяет "на лету" проверять синтаксис вводимых команд, а также выводить подсказки. Настроить окно просмотра и редактирования кода можно с помощью пункта главного меню Delphi Tools/Editor Options (Средства/Настройки редактора). После выполнения этой команды появляется окно свойств редактора (Editor Properties) (рис. 1.16). Окно свойств редактора содержит пять вкладок: General (Общие), Display (Отображение), Key Mappings (Горячие клавиши), Color (Цвета), Code Insight (Выделение кода).
С помощью окна свойств редактора можно настроить практически все параметры отображения текстов программ в окне просмотра и редактирования кода, а также проверки синтаксиса.
Окно проводника служит для упрощения навигации между модулями проекта. Окно проводника можно закрыть, щелкнув левой кнопкой мыши в верх
нем правом углу окна проводника. С помощью пункта главного меню Delphi View/Code Explorer (Просмотр/Окно проводника) можно снова активировать это окно.
Pис. 1.16. Окно свойств редактора Editor Properties
Окно проводника содержит дерево диаграмм, которые отображают все типы, классы, свойства, методы, глобальные переменные и глобальные программы определенные в модуле. Оно отображает также и другие модули, перечисленные после команды uses.
В. окне проводника для обозначения всего вышеперечисленного используются следующие значки (рис. 1.17).
Рис. 1.17. Обозначения в окне проводника
Для перехода из окна проводника в окно просмотра и редактирования кода и наоборот, можно использовать комбинацию клавиш <Ctrl>+<Shift>+<E>.
В окне проводника можно использовать пошаговый поиск. Чтобы найти любой класс, свойство, метод, переменную или программу (процедуру или функцию) достаточно набрать его имя на клавиатуре. Между окном проводника и окном просмотра и редактирования кода существует прямая связь. При выборе объекта в окне проводника курсор в окне просмотра и редактора кода сместится на раздел реализации (implementation) для данного объекта. И, наоборот, при перемещении в окне просмотра и редактирования кода будут подсвечиваться соответствующие объекты в окне проводника.
Для добавления (переименования) объекта в окне проводника достаточно щелкнуть правой кнопкой мыши в соответствующем узле окна проводника и выбрать в контекстном меню команду New/Rename (Новый/Переименовать).
Окно проводника также можно настроить с помощью окна настройки среды (Environment Options) (рис. 1.18). Оно вызывается с помощью пункта меню главного окна Delphi Tools/ Environment Options (Средства/Настройки среды).
Рис. 1.18. Окно настройки среды Environment Options Генератор исходного кода. Создание простейшего приложения
При работе с компонентами в конструкторе форм Delphi автоматически генерирует соответствующий код на языке Object Pascal. Самый простой метод знакомства с автоматической генерацией кода - начать новый проект, для
этого в главном меню Delphi нужно выбрать команду File/New/Project (Файл/Новый/Проект). После чего, в конструкторе форм появится новая форма, а в редакторе кода можно видеть уже сгенерированный текст - заготовку будущей программы на языке Object Pascal (листинг 1.1).
Листинг 1.1
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type
TForml = class(TForm)
private
{ Private declarations }
public
( Public declarations }
end; var
Forml: TForml;
implementation
{$R *.DFM}
end.
Рассмотрим листинг 1.1 более подробно. На нем представлена "заготовка" модуля. В данном случае его название - Unit1. Модуль содержит элементы, которые можно использовать в программе или в других модулях. К числу стандартных модулей среды Delphi относятся такие модули, как system, Sysutiis и др. После компиляции модуля Delphi сохраняет результаты в файле модуля с расширением DCU (Delphi Compiled Unit).
Стандартно, модуль состоит из заголовка и четырех разделов (листинг 1.2).
Листинг 1.2
unit название; interface
{раздел интерфейса}
uses
{список используемых модулей};
const
{список констант};
type
{описание типов};
var
{объявление переменных};
{заголовки процедур, имеющихся в модуле};
{заголовки функций, имеющихся в модуле};
implementation
{раздел реализации}
uses
{список используемых модулей};
const
{список констант};
type
{описание типов};
var
{объявление переменных};
{описание процедур};
{описание функций};
{директивы препроцессора};
initialization
{раздел инициализации}
{операторы, команды};
finalization
{раздел завершения}
{операторы, команды};
end.
Первый раздел - раздел описания (interface), является как бы "лицом" данного модуля. В нем размещены описания модулей, которые использует модуль, а также в нем объявляются типы, константы, переменные, функции и процедуры, описываются идентификаторы, которые являются доступными всем модулям и программам, использующим данный модуль. Заметим, что для функций и процедур в этом разделе записываются только их заголовки. Непосредственно процедуры и функции размещены в следующем разделе - разделе реализации.
Во втором разделе - разделе реализации (implementation), кроме процедур и функций описываются типы, константы, переменные, а также модули, которые используются только в этом модуле, а за его пределами не видны. Кроме того, в данном разделе размещаются директивы препроцессора - служебные команды среды разработки, например:
{$R *.DFM}.
Директивы препроцессора - это указание компилятору на выполнение каких-либо действий. Их записывают в форме {$ директива}. Директивы препроцессора делятся на глобальные и локальные. Глобальные директивы действуют на весь компилируемый файл, локальные - от места их объявления до появления отменяющей директивы.
Имеются три вида директив: ключевые директивы, директивы параметров и директивы условной компиляции. Первые два вида директив обладают установками по умолчанию. Для установки этих директив вы можете воспользоваться вкладкой Compiler (Компилятор) диалогового окна Project Options (Настройки проекта), вызываемого из главного меню Delphi Project/Options (Проект/Настройки). Для того чтобы посмотреть, какие директивы препроцессора установлены по умолчанию, достаточно, находясь в окне редактора кода, нажать комбинацию клавиш <Ctrl>+<O>, а затем - <О>. В результате, в начале модуля вставятся все значения директив препроцессора, которые используются компилятором в настоящий момент (листинг 1.3).
Перечислим основные типы директив препроцессора:
- директивы условной компиляции;
- директивы проверки утверждений;
- директивы контроля ввода/вывода;
- директивы, определяющие размер стека;
- директивы информации о типах;
- директивы проверки переполнения при целочисленных операциях;
- директива связывания ресурсов;
- директивы проверки диапазона;
- директива создания консольного приложения.
Директивы условной компиляции позволяют вам управлять компиляцией программного кода. Схема задания условной компиляции может быть двух видов:
{$If условие}
{компилируемый код};
{$EndIf}
И
{$If условие}
{компилируемый код};
{$Else}
{компилируемый код};
{$EndIf}
В обоих случаях, при выполнении некоторого условия, записанного в строке $If, код, расположенный после $If, - компилируется. Иначе, в первом случае - он игнорируется и в результирующий файл не попадает, во втором - выполняется код, записанный после директивы $Else.
Рассмотрим теперь сами условные директивы. Первая директива:
{$IfDef условный идентификатор}
Данная директива проверяет, был ли определен указанный в ней условный идентификатор. Если он был определен, то следующий за ней код будет откомпилирован. Если же директивы, определяющей условный идентификатор, не было, либо она была отменена, то следующий за директивой код откомпилирован не будет.
Для определения условного идентификатора используется директива:
{$Define условный идентификатор}
Для отмены определения условного идентификатора служит директива:
{$UnDef условный идентификатор}
Кроме директивы $IfDef имеется также обратная ей директива $IfNDef.
Она возвращает истинное значение, если указанный в ней условный идентификатор не определен.
Данный вид директив полезен при отладке приложений. Например, программисту часто приходится вводить некоторые промежуточные переменные и объекты, которые необходимы для отладки и не нужны в окончательной версии приложения. Для этого удобно ввести конструкцию вида:
($IfDef Debug}
операторы отладки {$EndIf}
Если в начале программы вы введете директиву
{$Define Debug}
операторы отладки будут компилироваться и выполняться. Но когда вы либо уберете эту директиву, либо закомментируете ее:
//{$Define Debug}
либо введете после нее директиву
{$Undef Debug}
все операторы отладки будут убраны из программы.
Директивы проверки утверждений служат для разрешения или запрещения проверки утверждения. Они влияют на работу процедуры Assert, которая используется при отладке программ. Процедура Assert применяется при от
ладке программ для проверки истинности утверждений, которые по замыслу должны быть истинны, но в силу каких-то ошибок могут нарушаться. Процедура приводит к прекращению работы, генерации исключения EAssertionFaiied и выдаче сообщения об ошибке в случае, если проверяемое утверждение окажется ложным.
Примечание Информацию об исключительных ситуациях и обработке исключений смотрите во второй главе книги.
Директивы проверки утверждений являются локальными и имеют следующий вид:
{$С+} или ($ASSERTIONS ON}
и
{$С-} или ($ASSERTIONS OFF}
Данная директива действует на весь файл независимо от места своего расположения в нем.
Директивы контроля ввода/вывода служат для включения и выключения контроля работы с файлами. Синтаксис данных директив следующий:
{$I+} или {$IOCHECKS ON}
и
{$I-} или {$IOCHECKS OFF}
При включенной проверке ввода/вывода в файл (директива {$I+} или ($IOCHECKS ON}) в случае возникновения ошибки ввода/вывода генерируется исключение EinOutError. Если действует директива {$I-} или {$IOCHECKS OFF}, то исключение не генерируется.
Директивы, определяющие размер стека, необходимы для задания минимального и максимального размера оперативной памяти, выделяемой под стек. Все локальные переменные процедур и функций размещаются в стеке приложения. При вызове процедуры или функции ее локальные переменные помещаются в стек. При выходе из процедуры или функции локальные переменные удаляются из стека. Директивы препроцессора
{$М минимальный размер стека, максимальный размер стека}
или
($MINSTACKSIZE минимальный размер стека} ($MAXSTACKSIZE максимальный размер стека}
указывают минимальный и максимальный размер стека. Windows гарантированно выделяет приложению область памяти, необходимую для мини
мального размера стека. В случае, если памяти недостаточно, Windows выдаст ошибку при попытке запуска приложения.
Значение минимального размера стека должно находиться в пределах между целыми числами 1024 и 2147483647. Максимальное значение стека должно быть целым числом, расположенным между минимальным размером стека и 2147483647.
В случае нехватки памяти под стек во время работы приложения, размер стека увеличивается на четыре килобайта, при условии, что в данном случае размер стека не превысит максимальный размер. Если размер стека превышает допустимый, генерируется исключение EStackOverflow.
Директивы информации о типах включают или выключают генерацию информации о типах во время выполнения (RunTime Type Information, RTTI). Синтаксис директив:
{$М+} или {$TYPEINFO ON}
и
{$М-} или {$ TYPEINFO OFF}
Директивы проверки переполнения при целочисленных операциях включают или выключают проверку переполнения при выполнении операций над целыми числами (+, -, *, Abs, sqr, Succ, Pred, Inc и Dec). Синтаксис директив:
{$Q+) или {$OVERFLOWCHECKS ON}
и
{$Q-} или {$OVERFLOWCHECKS OFF}
При включенной директиве {$Q+} осуществляется проверка результата вычисления на переполнение. Если переполнение обнаружено, то генерируется исключение EIntOverfiow. Эти директивы проверяют только результаты арифметических операций. Данная директива по умолчанию отключена, т. к. значительно увеличивает размер приложения и замедляет его работу. Целесообразно использовать директиву проверки переполнения при целочисленных операциях на этапе отладки приложения.
Примечание При отключенной директиве могут появиться ошибки в расчетах, причем сообщений об ошибках не будет.
Директива связывания ресурсов предназначена для связывания файлов ресурсов с исполняемым модулем. Синтаксис директивы:
{$R ресурсы} или {$RESOURCE ресурсы}, где ресурсы - имя или шаблон
файла.
Данная директива указывает файлы ресурсов, имеющие расширение DFM или RES, которые включаются в выполняемый модуль. Заметим, что при генерации заготовки модуля формы (листинг 1.1) Delphi самостоятельно прописывает строку {$R имя-dfm}, которая обеспечивает компоновку файла ресурсов формы.
Примечание Не удаляйте и не изменяйте строку {$R имя.dfm}, т. к., в данном случае, Delphi не сможет найти файл ресурсов и сгенерируется исключение EResNotFound.
Директивы проверки диапазона предназначены для включения и выключения проверки диапазона целочисленных значений и индексов. Директивы имеют следующий синтаксис:
{$R+} или {$RANGECHECKS ON)
и
{$R-} или {$RANGECHECKS OFF}
Данные директивы, соответственно, включают и выключают проверку диапазона целочисленных значений и индексов. Если включена директива {$R+}, то все индексы массивов и строк и все присваивания скалярным переменным и переменным с ограниченным диапазоном значений проверяются на соответствие значения допустимому диапазону. Если требования диапазона нарушены или присваиваемое значение слишком велико, генерируется исключение ERangeError. Так же, как и директива проверки переполнения, директива {$R+} замедляет работу приложения и увеличивает его размер. Обычно она используется во время отладки приложения.
Директива создания консольного приложения предназначена для указания компилятору того факта, что данное приложение является приложением для DOS. При этом необходимо удалить из проекта все формы и визуальные объекты. Синтаксис директивы:
($APPTYPE CONSOLE}
Примечание Консольное приложение можно создать и другим способом. Для этого необходимо выполнить команду меню главного окна Delphi Project/Options (Проект/Настройки) и на вкладке Linker (Установка связей) установить параметр Generate Console Application (Создать консольное приложение).
Последние два раздела не являются обязательными. В разделе инициализации (initialization) размещаются операторы и команды, которые должны выполняться в начале работы программы, которая подключает эти модули. При наличии раздела инициализации в модуле может присутствовать раздел
завершения (finalization). В данном разделе находятся операторы и команды, которые выполняются при завершении работы программы.
Ваше первое приложение в Delphi
Сейчас настало время создать первое приложение в среде Delphi. Для этого поместим на форму кнопку (Button1) простым перетаскиванием кнопки из палитры компонентов (вкладка Standard). В результате на форме появилась кнопка с названием Buttoni и такой же надписью (заголовком). Название кнопки и заголовок - разные вещи! Название (Name) любого объекта (и кнопки в том числе) указывает, как к этому объекту будут обращаться в дальнейшем. По умолчанию Delphi присваивает объектам собственные имена, которые можно (и обычно нужно) изменить. Имя объекта и заголовок по умолчанию также одинаковы и, в нашем случае, они имеют значение Buttoni. Изменить имя объекта можно через его свойство Name в инспекторе объектов, а заголовок через свойство caption. Давайте изменим заголовок кнопки на Выход. При изменении данного свойства в инспекторе объектов автоматически будет изменяться заголовок кнопки на форме. Также вы можете изменять и другие свойства кнопки. При этом автоматически будут происходить визуальные изменения кнопки на форме (конечно, если вы изменяете визуальные свойства).
Посмотрим, что произошло в редакторе кода. Во-первых, в списке используемых модулей (uses) появилась новая запись StdCtrls - стандартные элементы управления. Модули подключаются автоматически и не исключаются, если разработчик убирает объект из формы (попробуйте удалить созданную ранее кнопку Button1). Во-вторых, в редакторе кода добавилась еще одна строка:
Button1: TButton;
Она указывает, что созданная вами кнопка приобрела вид экземпляра класса TButton (описание объектов см. далее). Кроме того, описание данного экземпляра входит в описание формы TFom1, т. е. указывается на принадлежность кнопки к данной форме. Если вы захотите обратиться к этой кнопке из другой формы или другого модуля (unit), то вам потребуется ссылка с использованием имени экземпляра формы: Form1. Button1. При удалении кнопки из формы удалится и строка, описывающая кнопку.
Для того чтобы кнопка выполняла какие-либо действия при нажатии на нее, нужно выбрать вкладку событий (Events) в инспекторе объектов. Здесь перечислены события, которые могут произойти с кнопкой. Нас интересует событие OnClick. Щелкните дважды на данном пункте, при этом Delphi автоматически сгенерирует заготовку процедуры-обработчика и перенесет вас в окно редактирования программ (можно также дважды щелкнуть на кнопке в форме). Внесем в заготовку код для закрытия формы Formi:
Forml.Close;
Для того чтобы убедиться, что программа работает - запустите ее на исполнение с помощью клавиши <F9> или через меню Run/Run (Запуск/Запуск). Нажмите на единственную кнопку формы, и она (форма) закроется.
Объектно-ориентированное программирование
Delphi в качестве внутреннего языка программирования использует Object Pascal. Главное отличие Object Pascal от языка программирования Pascal в том, что Object Pascal работает с объектами. Библиотека визуальных компонентов (VCL) представляет из себя иерархию классов, написанных на языке Object Pascal и объединенных в интегрированной среде разработки (IDE) Delphi. Разработчики могут создавать собственные объекты и классы и обмениваться ими. Это дает возможность достаточно быстро создавать приложения. Используя палитру компонентов и инспектор объектов, разработчик может размещать на формах компоненты и изменять их свойства без написания какого-либо кода.
Итак, что же такое объект? Класс - это тип данных, который включает в себя данные и операции над данными, а объект - это экземпляр какого-либо класса. Таким образом класс - это описание (тип), а объект - это то, что создано в соответствии с этим описанием. До создания объектно-ориентированных языков программирования данные и операции над данными рассматривали как отдельные элементы. Что такое объект, достаточно просто можно понять, если раньше вам приходилось работать с записями в Pascal. Записи состоят из областей, которые содержат данные разных типов (каждая область записи имеет собственный тип данных). Записи были созданы для облегчения работы с элементами, которые содержат различные типы данных.
Объекты - это тоже хранилища разных типов данных. Данные объекта называются полем (field) и аналогичны полям записи. Но объекты, в отличие от записей, содержат еще процедуры и функции, которые применимы к полям данного объекта. Эти процедуры и функции называются методами (methods). Изменять поля объекта также можно через свойства (properties) объекта. Каждое свойство объекта в Delphi представляет собой поле и методы, которые позволяют считывать значение поля и задавать его (так называемые методы доступа). Свойства можно изменять в процессе разработки приложения без написания какого-либо кода с помощью инспектора объектов. Если доступ к полям объекта извне осуществляется только посредством методов доступа, такое свойство объекта называется инкапсуляцией. В дополнение к инкапсуляции, объектно-ориентированное программирование характеризуется еще свойствами наследования и полиморфизма. Наследование обозначает, что объекты могут получать свои свойства и методы от других объектов (которых называют в данном случае предками). Объекты-наслед
ники берут от предков все свойства, методы и поля. Эти свойства, методы и поля в объекте-наследнике могут сохраняться в неизменном виде, либо могут быть изменены. Кроме того, объекты-наследники имеют в своем составе дополнительно новые поля, методы или свойства. Полиморфизм подразумевает, что всегда вместо метода предка может быть подставлен метод объекта-потомка и будет вызван метод фактически переданного объекта (при этом, естественно, методы потомка и предка могут иметь совершенно разное содержание).
Объекты в Delphi динамически занимают блоки памяти, структуру которых определяет их класс. Каждый объект является уникальным экземпляром своего класса и имеет все методы класса.
Типичное определение нового класса выглядит следующим образом:
type Имя класса = class (Класс-предок)
{Список состава класса} private
{частные описания} protected
{защищенные описания} public -
(общедоступные описания} published
{опубликованные описания} end;
где имя класса - любое корректное имя (выбирается произвольно), Класс-предок - название класса, наследником которого является создаваемый класс, Список состава класса - содержит свойства и методы нового класса. Для каждого элемента класса можно установить разную видимость. Для этого предназначены четыре ключевых слова: private, protected, public и published. Видимость элемента класса определяет, где в программе и как будет виден данный элемент класса. Минимальная видимость элемента класса задается ключевым словом private. Ключевое слово protected задает средний уровень видимости, a public и published - наивысшую степень доступности. Например, строка
published property Color: TColor read GetColor write SetColor;
определяет свойство color для некоего класса, которое является опубликованным (published), т. е. имеет наивысшую видимость.
Если перед описанием элемента класса не ставится ключевое слово, определяющее его степень видимости, то считается, что видимость элемента такая же, как и у предыдущего элемента класса, например:
published property Color: TColor read GetColor write SetColor; property BackColor: TColor read GetBackColor write SetBackColor;
В данном примере оба свойства - Color и BackCoior - являются опубликованными.
Рассмотрим все четыре ключевых слова более подробно.
- Private (частные) - определяет элементы класса, которые не видны вне модуля, в котором был объявлен класс, содержащий эти элементы. Другими словами, частные методы не могут быть вызваны из других модулей, а частные поля или свойства не могут быть считаны или изменены из других модулей.
- Protected (защищенные) - определяет элементы класса, которые видны только внутри модуля, где определен класс, содержащий эти элементы, а также внутри других модулей, где присутствуют классы-потомки данного класса.
- Public (общедоступные) - определяет элементы класса, которые видны в любом месте программы и из любых модулей, в которых виден сам класс.
- Published (опубликованные) - определяет элементы класса, имеющие ту же видимость, что и public-элементы. Единственное отличие заключается в том, что опубликованные элементы порождают информацию о типе времени выполнения (RTTI). Благодаря данной информации, Delphi может осуществить проверку принадлежности элементов объекта тому или иному классу. Delphi использует RTTI для доступа к значениям свойств при сохранении и загрузке файлов форм (*.DFM), чтобы иметь возможность отобразить свойства в инспекторе объектов и ассоциировать конкретные методы с конкретными свойствами. Все методы классов могут быть опубликованы, за исключением перегруженных (overload) методов, имеющих одинаковые имена.
Кроме свойств и методов, определение нового класса может содержать список интерфейсов (interfaces), поддерживаемых данным классом (подробно об интерфейсах см. вторую главу книги).
В Delphi имеется понятие абстрактного класса. Абстрактный класс описывает несуществующий объект. Он нужен для того, чтобы описать некоторые фундаментальные свойства и методы объектов, которые создаются из абстрактного класса. Все объекты в Delphi созданы из абстрактного класса TObject. Класс TObject - предок многих простых классов. Он объединяет в себе основные функции, которые свойственны всем объектам Delphi. Класс TObject обеспечивает:
- возможность создания, уничтожения и управления экземплярами объектов, а также резервирование памяти и ее освобождение после уничтожения экземпляра;
- поддержку информации об объектах и типах; - поддержку обработки сообщений.
Итак, все классы в Delphi - потомки класса TObject. Класс называется прямым потомком класса TObject, если он произведен непосредственно от класса TObject. Класс называется косвенным потомком от класса TObject, если он произведен от класса, являющегося прямым или косвенным потомком класса TObject (т. е. произведен от промежуточного класса).
Примечание В другой литературе можно встретить названия дочерний класс и класс-потомок. Дочерний класс - это прямой потомок, а класс-потомок - это косвенный потомок в терминологии данной книги.
Если при создании нового класса (о создании классов читайте во второй части книги) не указывается родительский класс, то считается, что родитель - класс TObject.
Все компоненты в библиотеке визуальных компонентов созданы из абстрактного класса TComponent. Компоненты являются объектами, свойства которых разработчик может изменять во время создания приложения. Класс TComponent включает в себя наиболее общие свойства и методы компонентов, такие как:
- возможность включать компонент в палитру компонентов и работать с ним во время разработки приложения;
- способность быть владельцем других компонентов или быть управляемым другими компонентами;
- возможность обмена данными с файлами и потоками;
П возможность служить оболочкой элементов ActiveX и других объектов.
Визуальные компоненты (которые отображаются на экране монитора во время работы приложения), такие как TForm и TSpeedButton, называются элементами управления и их предком является абстрактный компонент
TControl.
На рис. 1.19 представлена упрощенная диаграмма иерархии визуальных компонентов. На этой диаграмме изображены несколько компонентов, являющихся элементами управления и имеющих в качестве предка компонент
TControl.
Несмотря на свое название, библиотека визуальных компонентов состоит по большей части из невизуальных объектов. Во время создания приложения разработчик может размещать на формах невизуальные компоненты (они не будут отображаться во время запуска приложения) и изменять их свойства в точности так же, как при работе с визуальными объектами.
Кроме вышеописанных классов, в число базовых классов в Delphi входят
TWinControl, TCustomEdit И TBaseArray.
Рис. 1.19. Упрощенная диаграмма иерархии библиотеки визуальных компонентов (VCL) Delphi
К основным понятиям объектной модели Delphi относятся так называемые области видимости объектов. Область видимости объекта определяет ту часть кода Object Pascal, в которой доступны его (объекта) свойства и методы без явного указания объекта. Когда вы пишите код, который находится в области видимости объекта, вам необязательно указывать имя этого объекта для доступа к его свойствам и методам. Например, когда вы помещаете новую кнопку на форму, то вы можете обращаться к свойствам и методам формы в обработчиках событий кнопки без указания имени формы (листинг 1.4).
Листинг 1.4
procedure TForml.ButtonlClick(Sender: TObject); begin
Color := clGray;
Buttonl.Color := clTeal; end;
Примечание В листинге 1.4 строка, задающая цвет кнопки Buttonl, может не работать в некоторых версиях Delphi. Автор проверял работоспособность данного кода в Delphi 5 версии Enterprise.
На приведенном выше в листинге 1.4 обработчике события кнопки Onclick строка
Color := clGray;
равносильна строке
Forml.Color := clGray;
Вам не нужно указывать название формы, т. к. метод Button1Click является частью объекта TForm1.
Вторая строка листинга 1.4 изменяет свойство объекта Buttonl, а не формы, поэтому нуждается в указании имени объекта.
Delphi создает отдельный файл модуля для каждой формы. Поэтому, для того чтобы иметь доступ из одного модуля к объекту, расположенному в другом модуле, вам потребуется указывать полное имя объекта, например:
Form2.Buttonl.Color := clTeal;
Точно так же можно вызывать на исполнение методы объектов, расположенных на другой форме (в другом модуле), например:
Form2.Editl.Clear;
Кроме всего вышеописанного, для использования объектов модуля Form2
(unit2) в модуле формы 1 (unit1) вам потребуется прописать в разделе uses
модуля uniti модуль Unit2:
implementation
uses Unit2;
Создание и уничтожение объектов
В процессе работы со стандартными объектами, которые предлагает Delphi, вы можете захотеть создать собственные объекты, которые наиболее полно описывают предмет вашей работы.
В качестве примера создания собственного объекта рассмотрим объект служащего вашей фирмы, и назовем его TEmployee. Предположим, что наш объект должен содержать такие свойства, как имя, должность и заработная плата, назовем их соответственно Name, Title и salary. А также добавим метод для расчета заработной платы: calculateSalary. Тогда описание нашего нового объекта получится похожим на следующее (листинг 1.5):
Первая строка в описании нового объекта говорит, что наш объект является наследником базового класса TObject, следовательно, все свойства и методы объекта TObject наследуются объектом TEmpioyee. Теперь вы можете помес
тить приведенный на листинге 1.5 код в любой из двух разделов модуля: раздел интерфейса (interface) или раздел реализации (implementation). После чего для создания объекта TEmployee вам потребуется вызвать метод Create, который наш объект унаследовал от базового объекта TObject:
var
Employee: TEmployee; begin
Employee := TEmployee.Create; end;
Метод Create вызывает так называемый конструктор (constructor) объекта, который выделяет место в памяти для нового объекта и возвращает ссылку на созданный объект.
Примечание Компоненты, находящиеся на форме, автоматически создаются и уничтожаются средой программирования. При создании ваших собственных объектов вы должны позаботиться и об их создании, и об их уничтожении.
Для уничтожения созданного объекта и освобождения занимаемой объектом памяти необходимо вызвать метод Destroy, который также наследуется от базового объекта TObject. В нашем случае, строка для уничтожения объекта будет выглядеть так:
Employee.Free;
Стандартные компоненты Delphi
При знакомстве с палитрой компонентов мы с вами уже рассмотрели основные компоненты Delphi, которые разбиты на группы. Каждая группа компонентов предназначена для решения какой-либо задачи и располагается на отдельной вкладке палитры компонентов. Кратко мы уже описывали содержание каждой вкладки. Теперь рассмотрим стандартные компоненты Delphi, расположенные на некоторых вкладках, более подробно.
- Вкладка Standard (рис. 1.20) содержит следующие элементы:
Frames (фреймы) - открывает диалоговое окно, отображающее список фреймов, включенных в данный проект;
MainMenu (главное меню) - создает главное меню вашей формы. Для добавления элементов главного меню и создания обработчиков событий элементов меню разместите компонент MainMenu на форме и дважды щелкните по нему для открытия дизайнера меню (Menu Designer);
FopupMenu (контекстное меню) - создает контекстное меню, которое появляется во время выполнения приложения при нажатии пользова
телем правой кнопки мыши. Добавление элементов в контекстное меню осуществляется так же, как и в главное меню;
Label (метка) - служит для отображения текста, который не может быть изменен пользователем во время работы приложения;
Edit (поле редактирования) - отображает редактируемую область, в которую пользователь может ввести одну строку текста либо изменить существующую строку текста;
Memo (поле мемо) - отображает редактируемую область, в которую пользователь может ввести несколько строк текста или отредактировать существующие строки;
Button (кнопка) - создает кнопку, которую пользователь может выбрать для выполнения какого-либо действия;
checkBox (флажок) - предоставляет пользователю флажок, который может принимать значения "включено" или "выключено". Пользователь может включать одновременно несколько флажков;
RadioButton (переключатель) - создает переключатель, который работает по аналогии с флажком, за исключением того, что пользователь может включить только один переключатель на форме;
ListBox (список) - отображает прокручиваемый список элементов;
ComboBox (комбинированный список) - создает элемент, являющийся комбинацией поля редактирования и списка. Пользователь может ввести необходимые данные в область поля редактирования или выбрать элемент списка;
ScrollBar (полоса прокрутки) - создает инструмент, предназначенный для смены видимой области формы или списка;
GroupBox (группа) - создает контейнер, в котором можно размещать компоненты, которые будут объединены в группу;
RadioGroup (группа переключателей) - создает группу, которая содержит радиопереключатели;
Panel (панель) - создает панель, которая может содержать различные компоненты. Панели предназначены для создания статусных панелей или панелей инструментов;
ActionList (список действий) - создает список действий, которые централизуют ответы на действия пользователя.
Рис. 1.20. Вкладка Standard Рис. 1.21. Вкладка Additional - Вкладка Additional (рис. 1.21) состоит из нижеперечисленных компонентов:
BitBtn (кнопка с рисунком) - создает кнопку, которая может содержать рисунок;
SpeedButton (кнопка быстрого вызова) - создает кнопку, которая может содержать только рисунок (без текста). Данные кнопки могут быть размещены на панели для создания панели инструментов;
MaskEdit (поле редактирования по шаблону) - создает элемент управления, который позволяет пользователю вводить данные так же, как и в поле редактирования, только с использованием маски ввода (ввод по заранее заданному шаблону);
StringGrid (таблица строк) - создает таблицу, в строках и столбцах которой могут находиться текстовые строки;
DrawGrid (таблица) - создает таблицу для отображения каких-либо данных;
Image (рисунок) - служит для отображения содержимого файлов рисунков, значков или метафайлов;
Shape (геометрическая фигура) - предназначен для рисования геометрических фигур (эллипсов, окружностей, прямоугольников, квадратов, прямоугольников и квадратов со скругленными углами);
Bevel (фаска) - создает линию или квадрат с трехмерным эффектом (выпуклости или вогнутости);
ScrollBox (область прокрутки) - создает контейнер, который может изменять размеры. Область прокрутки автоматически отображает полосы прокрутки, если в них возникает необходимость;
CheckListBox (список флажков) - отображает прокручиваемый список, похожий на обычный список, за исключением того, что в списке флажков напротив каждого элемента списка установлен или отключен флажок выбора;
Splitter (разделитель) - отображает разделитель между двумя выровненными элементами управления, который позволяет пользователю во время работы приложения изменять размеры этих элементов управления, щелкая на разделителе и перетаскивая его;
StaticText (статический текст) - компонент, похожий на метку, за исключением того, что у статического текста есть собственный обработчик;
ControlBar (контрольная панель) - компонент, предназначенный для создания плавающей панели инструментов;
ApplicationEvents (события приложения) - компонент, позволяющий перехватывать события приложения;
Chart (диаграмма) - диаграмма - графический аналог таблицы (см. далее).
- Вкладка Win32 (рис. 1.22) содержит следующие компоненты:
TabControl (вкладки) - предназначен для размещения нескольких переключаемых страниц, содержащих различные элементы (например, панели инструментов Delphi выполнены в виде вкладок);
PageControl (страницы) - используется для создания многостраничных диалоговых окон (например, окно настройки проекта (Project Options) Delphi);
ImageList (список рисунков) - создает объединение рисунков, имеющих одинаковый размер, каждому из которых сопоставлен собственный индекс;
RichEdit (текстовый редактор) - создает поле мемо, представляющее из себя полноценный текстовый редактор в формате RTF (Rich Text Format), который, кроме самого текста, содержит элементы управления и свойства шрифтов, такие как размер, цвет, название и тип шрифта и т. п.;
TrackBar (бегунок) - панель, предназначенная для визуального изменения значения какой-либо переменной величины. Бегунок может быть горизонтальным или вертикальным;
ProgressBar (индикатор хода выполнения) - создает прямоугольную панель, которая заполняется слева направо для индикации хода выполнения какой-либо задачи;
UpDown (кнопки изменения величины) - создает кнопки, предназначенные для уменьшения или увеличения какой-либо переменной величины;
HotKey (горячие клавиши) - предназначен для создания комбинаций "горячих клавиш", вызывающих определенное действие;
Animate (анимация) - создает окно, позволяющее отображать беззвучный видеоклип формата AVI (Audio Video Interleaved);
DateTimePicker (комбинированный список ввода времени или даты) - создает элемент, предназначенный для ввода времени или даты пользователем, путем выбора либо печати;
Рис. 1.22. Вкладка Win32
MonthCalendar (календарь) - отображает календарь, который показывает только один месяц. Пользователь может выбрать нужную дату;
Treeview (дерево) - отображает список в виде дерева;
Listview (список) - отображает список;
Headercontrol (заголовок) - отображает заголовок над столбцами, содержащими текст или числа;
StatusBar (строка состояния) - создает панель, предназначенную для вывода служебной информации;
ToolBar (панель инструментов) - создает элемент, позволяющий размещать на себе кнопки и другие элементы, автоматически подбирая их размер и расположение;
CoolBar (усложненная панель) - отображает коллекцию элементов управления;
PageScroller (прокрутка страницы) - задает элемент, который содержит объекты клиентской области, которые могут прокручиваться вертикально или горизонтально.
Рис. 1.23. Вкладка System
- Вкладка System (рис. 1.23) содержит:
Timer (таймер) - невизуальный компонент, который генерирует событие OnTimer циклически через определенный промежуток времени;
PaintBox (окно для рисования) - размещает на форме область, в которой можно рисовать, используя графические средства Delphi;
MediaPlayer (медиапроигрыватель) - отображает панель для проигрывания и записи видео- и аудиофайлов;
OleContainer (контейнер OLE) - предназначен для создания клиента OLE;
DdeClientconv (клиентская связь DDE) - устанавливает клиентскую связь с сервером динамического обмена данными (Dynamic Data Exchange, DDE);
DdeClientItem (данные клиента DDE) - определяет данные клиента DDE, предназначенные для передачи серверу;
DdeserverConv (серверная связь DDE) - устанавливает связь сервера с клиентом DDE;
DdeServerItem (данные сервера DDE) - определяет данные сервера DDE, предназначенные для передачи клиенту.
Остальные вкладки (кроме тех, на которых расположены компоненты для работы с базами данных) мы рассмотрим непосредственно при работе с конкретными компонентами.
Основные свойства визуальных компонентов Delphi
Свойства компонентов позволяют управлять внешним отображением компонентов, а также их поведением. Для установки большинства свойств компонентов можно воспользоваться инспектором объектов. Рассмотрим, какие основные свойства характерны для визуальных компонентов.
Примечание Более подробно все стандартные свойства компонентов рассмотрены в главе 5. Здесь мы приводим лишь некоторые, характерные для большинства визуальных объектов свойства.
- Свойства, описывающие расположение и размеры компонентов (данные свойства недоступны для невизуальных компонентов):
Height (высота) - величина, описывающая вертикальный размер компонента;
Width (ширина) - величина, описывающая горизонтальный размер компонента;
Tор (вершина) - вертикальная координата левого верхнего угла компонента;
Left (левая граница) - горизонтальная координата левого верхнего угла компонента;
- свойства, описывающие визуальное отображение компонентов на экране:
BorderStyle (стиль бордюра) - определяет стиль бордюра, который будет отображен вокруг компонента;
Color (цвет) - определяет фоновый цвет компонента;
BevelKind (тип фаски) - определяет тип фаски компонента (выпуклый или вдавленный), если компонент ее поддерживает;
Font (шрифт) - определяет тип шрифта, используемого в текстах и надписях компонента, его цвет, стиль и размер;
- родительские свойства - свойства, которые наследуются от компонента, содержащего данный компонент. Такие свойства начинаются со слова Parent, например ParentFont, ParentshowHint и т. п. В качестве примера, рассмотрим кнопку Button, размещенную на форме Form. По умолчанию, свойство кнопки ParentFont установлено в true. В результате этого, при
изменении свойства Font на форме автоматически будет изменяться свойство Font кнопки Button. Если же вы замените свойство Font у кнопки, то шрифт, используемый для надписи на кнопке, изменится, а также свойство кнопки parentFont автоматически сменится на false;
- свойства навигации - определяют, как может пользователь во время работы приложения переходить от одного компонента к другому:
Caption (заголовок) - содержит строку текста, которая изображается на компоненте (маркирует его). Для того чтобы подчеркнуть букву в заголовке, можно поставить перед этой буквой знак амперсанда (&). В результате, пользователь может выбрать данный компонент путем нажатия комбинации клавиш <Аlt>+<подчеркнутая буква>;
TabOrder (порядок обхода компонентов) - данное свойство определяет порядковый номер компонента при обходе всех компонентов формы при помощи клавиши <Таb>. Это свойство является активным, только если свойство Tabstop установлено в true;
TabStop (обход по клавише <Таb>) - определяет, будет ли осуществляться последовательный обход компонентов при нажатии клавиши <Таb>. При установке данного свойства в true при нажатии клавиши <Таb> будет осуществляться обход компонентов формы в порядке, определенном свойствами TabOrder компонентов;
- свойства drug-and-drop - свойства, предназначенные для перемещения компонентов:
DragMode (режим перемещения) - определяет, каким образом начинается перемещение компонента. По умолчанию, данное свойство установлено в dmManual. Вы должны вызвать метод BeginDrag, для начала перемещения компонента. Когда вы устанавливаете свойство DragMode в dmAutomatic, перетаскивание компонента начинается сразу же по нажатию кнопки мыши на компоненте;
DragCursor (курсор при перетаскивании) - определяет вид указателя мыши, который он принимает при перетаскивании компонента.