- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Компиляция компонентов
Когда для создания исходного файла нового компонента используется мастер Component Wizard, (или если он генерируется с нуля), и он не инсталлируется сразу же в пакет, обратите внимание, что Delphi отключает команды трансляции в меню Project. В Delphi компилируются и строятся проекты, а не исходные файлы.
Да, это верно, если не открыть исходный файл на языке Pascal. Если сохранить исходный файл, а затем нажать кнопку «Open» панели инструментов Project, чтобы заново открыть файл PAS, можно проверить синтаксис вашего модуля и скомпилировать его (с определением компонентов) в файл DCU. Конечно, если попытаться выполнить этот проект, то появится сообщение об ошибке.
Хотя этот подход вообще полезен, но имеет два несущественных недостатка. Во-первых, Delphi анализирует исходный файл так, будто это файл проекта в формате исходного текста. Например, Delphi перечислит все модули из различных строк uses (так что придется немного прокрутить экран до достижения действительного кода).
interface
uses
SysUtils,
WinTypes,
WinProcs,
Messages,
Classes,
Graphics,
...
Рис. 5.1. Фундаментальные классы компонентов библиотеки визуальных компонент VCL
Вторая проблема состоит в том, что Delphi создает файл ресурсов для одиночного файла, как для любого проекта с типичной пиктограммой проекта Delphi. К счастью, этот файл позже можно просто удалить. Кроме того, Delphi создает типичные файлы DOF и DSK для файла проекта, а эти файлы действительно могут быть полезны.
В действительности, это было проблемой только в Delphi 1 и Delphi 2. С появлением технологии пакетов в Delphi 3 можно просто инсталлировать ваш компонент в пакет, перетранслировать пакет, чтобы увидеть, правилен ли код, и инсталлировать компонент (возможно после дальнейших проверок). Основное различие заключается в том, что повторная компиляция пакета выполняется намного быстрее повторной компиляции всей библиотеки визуальных компонент VCL, что нужно было делать в предыдущих версиях Delphi.
Отладка компонентов
Новый компонент можно инсталлировать сразу же после построения, и построить простой проект для проверки его свойств. Активируя свойства, объявленные при разработке, можете легко определить их правильность и внести изменения в интерфейс пользователя или другие связанные свойства в соответствии с вашей целью. Возможно, это хороший подход для большинства компонентов, но не для всех.
При написании сложного компонента нужно иметь в виду, что его инсталляция и использование могут разрушить среду Delphi и привести к потере кода компонента, если он не был сохранен. Чтобы предотвратить появление проблемы, можно написать простую программу проверки с динамическим созданием компонента (например, в методе FormCreate) и возможностью редактирования и проверки различных свойств кнопок, флажков, окон редактирования и полей со списком. Дописав некоторый дополнительный код, можно даже проверять события компонента.
Так как процесс тестирования неприятно раздражает, большинство программистов немедленно устанавливает компоненты в библиотеку визуальных компонент VCL и непосредственно используют среду Delphi для проверки новых компонентов. И только позже они начинают строить тестовую программу.
Однако нетрудно автоматически сгенерировать программу теста компонента, а некоторые инструменты нового поколения для генерации компонентов уже делают это. Одна из разновидностей этого подхода состоит в создании инспектора объектов этапа выполнения, использующего данные RTTI компонента (описанные в предыдущей главе), чтобы манипулировать свойствами нового компонента.
Построение простых компонентов
Демонстрация родительских свойств: компонент Nothing
Первый изучаемый компонент — это компонент, который ничего (nothing) не делает. Такой компонент можно описать следующим простым кодом:
type
TDdhNothing = class(TGraphicControl)
end;
Совет
Задание префикса имени компонента буквами Ddh станет стандартом нашей книги. Использование мнемонических префиксов - обычный подход многих продавцов компонентов. Здесь это сделано потому, что нельзя установить два компонента Delphi с одним и тем же именем. Использование префикса - хороший способ делать имена класса уникальными. Использование собственного префикса защищает сообщество, программирующее в Delphi.
Небольшой код! Это, возможно, самый простой компонент, который можно создать, так как безоконный графический элемент управления (nonwindowed) не использует никаких ресурсов Windows. Однако этот, очевидно, бесполезный компонент наследует отдельные возможности от предков: TComponent, TControl и TGraphicControl. Эти классы определяют свойства позиции и размера, подсказки, события мыши и многие другие свойства. Некоторые из свойств делаются доступными из базовых классов. Другие можно делать доступными, просто переобъявляя их в разделе объявления класса published:
type
TDdhNothing = class{TGraphicControl)
published
property Align;
property ShowHint;
property Visible;
property Enabled;
property OnClick;
property OnDblClick;
property OnMouseDown;
property OrWouseUp;
property OnMouseMove;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnStartDrag;
end;
Этот компонент можно было бы назвать THintArea или TClickArea и претендовать на то, что он полезен. Несмотря на данное ему имя, этот ужасно простой компонент в действительности можно использовать для упомянутых выше целей, например, для подсказки при щелчке мышью на области, определяющей «горячее поле» образа.
Конечно, перед использованием компонента TDdhNothing, его нужно установить в библиотеку визуальных компонентов VCL Delphi. Так как этот компонент не содержит кода, он, по крайней мере, так же не содержит ошибок, как и родительский класс TGraphicControl. Следовательно, этот компонент не нужно отлаживать. При этом Delphi добавит код компонента в библиотеку и вызовет процедуру Register для каждого компонента, определенного в модуле. Процедура Register делает компонент доступным для среды проектирования Delphi и помещает его в отдельную страницу палитры:
procedure Register;
begin
RegisterComponents('DDHB', [TDdhNothing]);
end;
По умолчанию поместите все компоненты для этой книги на странице DDHB (Delphi Developer's Handbook) палитры компонентов.
В дополнение к созданию объявления класса и определения страницы палитры, вы также должны предоставить пиктограмму, которую Delphi будет использовать для этого компонента. Пиктограмма должна быть битовым образом 24 х 24 пикселя с тем же именем, что и класс компонента (но с использованием только прописных букв, например, TDDHNOTHING).