Создание новых компонент
Что такое компоненты? Это самостоятельные объекты, которые вы можете использовать в различных программах на Delphi (и на C++ Builder). Например, разные кнопочки, checkbox, таймеры и более сложные объекты, которые вы видите на Палитре компонентов - это компоненты. Компоненты вы можете делать и сами - и как раз этому и посвящен этот раздел. Компоненты могут быть простыми (кнопочка, которая пишет при нажатии на нее) и очень сложными (встроенный WEB-браузер). Компоненты можно писать с нуля, определяя в них все методы, свойства и события, а можно воспользоваться некоторым уже готовым компонентом (классом компонента) и просто добавить в него то, что отсутствует в классе родителя. Или же переопределить методы родительского класса, если они работаю не так, как вам надо. Отметьте сразу, что брать что-либо из родительского класса нельзя - если, скажем, некоторое свойство есть у родительского компонента, то оно будет и у компонента, произведенного от него.
Компоненты могут быть видимыми (как большинство), так и невидимыми (как таймер) на этапе выполнения. Также компонент может и часто должен различать два своих состояния - состояние на этапе разработки программы (не компонента, а именно программы), использующей компонент и состояние на этапе работы программы. Классический пример такого компонента - это таймер. Во время разработки программы он не "тикает", по время же работы программы - может "тикать" (т. е. посылать сообщение WM_TIMER).
Компоненты, которые вы разрабатываете, могут состоять из нескольких других компонентов. Например, вы можете сделать компонент, представляющий из себя поле для ввода некоторых данных (Edit) и метку радом с ним (Label). Конечно, можно не заводить отдельный компонент, а использовать Edit и Label отдельно, но такой компонент позволяет делать многие операции автоматически (например, одновременное выравнивание Edit и Label), так что если вам приходиться заниматься этим достаточно много, то создание даже такого простого компонента может сэкономить массу времени.
Компоненты распространяются в виде отдельных файлов, так что установка в среды программирования Delphi или C++ Builder не займет много времени. Установленные компоненты появятся на Палитре компонентов - на отдельной или уже существующей вкладке. Разумеется, установленные компоненты можно будет потом при желании удалить. Компоненты, которые использует программа, могут непосредственно включаться в exe-файл, а могут и использоваться в отдельном файле. Второй вариант может оказаться предпочтительнее, если данный компонент использует несколько программ.
Часто компоненты третьих фирм распространяются вместе с исходным кодом, так что вы сможете при желании слегка "подправить" их код, исходя из вашей задачи.
Компоненты - это не единственная технология такого рода. Например, есть еще элементы ActiveX от Microsoft. В новой платформе .NET тоже можно делать пользовательские элементы. У каждой из этих технологий есть и плюсы, и минусы, которые сейчас мы обсуждать не будем.
Начнем создавать наш первый компонент TRandom (универсальная игральная кость). Его основная задача - это выдавать случайные числа от min до max (min и max будут в числе его свойств). Кроме того, у него будет метод Random, который и будет выдавать случайное число в указанных пределах. И, наконец, у компонента будет событие GetMax, которое будет возникать, когда на нашей "игральной кости" выпадет максимально возможное количество очков. Внешне наш компонент будет выглядеть как Label, т. е. выдаваемое им случайное число будет выводиться в виде надписи.
Для создания заготовки для нового компонента зайдите в меню Component и выберите New Component:
Появится окно New Component, в котором вам надо выбрать класс-предок для вашего компонента (combobox Ancestor type) - тут задайте TLabel [StdCtrls] (т. е. наш компонент - потомок класса TLabel), имя вашего класса (Class name) - тут можно впечатать все, что угодно, мы тут задали TRandom (хорошей практикой является задание для всех ваших компонентов некоторого префикса), вкладка на палитре компонентов для размещения нашего нового компонента (можно выбрать как существующую вкладку, так и задать свою) - мы задали свою вкладку с именем My Components. Значение остальных полей можно оставить без изменения - в Unit file name задается имя файла для компонента (по умолчанию предлагается имя класса без буквы T) и места на диске, в которых компонент будет искаться - тут тоже лучше все оставить как есть.
Нажимаем OK. Появится окно с некоторым количеством кода. Давайте посмотрим, что за код мы тут имеем. Во-первых, мы имеем заготовку для нашего класса:
...
type
TRandom = class(TLabel)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
...
Как вы видите, класс пока пуст - ничего содержательного.
Чуть пониже мы видим код для регистрации нашего компонента:
...
procedure Register;
begin
RegisterComponents('My Components', [TRandom]);
end;
...
Функция RegisterComponents в качестве первого параметра имеет имя вкладки на Палитре компонентов, куда наш компонент будет проинсталлирован и вторым - имя класса самого компонента. В принципе у нас уже есть вполне рабочий компонент. Только ничего полезного он делать не умеет.
- Новые технологии.
- Создание новых компонент
- Добавление свойств
- Добавление методов
- Добавление событий
- Разработка ресурсов для компоненты
- Установка компоненты
- Испытание компоненты
- Редактирование компоненты
- Создание справочной службы помощи
- Динамически подключаемые библиотеки (dll)
- Работа с буфером обмена
- Динамический обмен данными (dde)
- Связывание и внедрение объектов (ole)
- Упражнения: