31. Создание собственных компонентов
В состав Delphi входит более 450 стандартных компонентов. Но иногда возникает необходимость усовершенствовать некоторые компоненты или создать свои новые компоненты. Все компоненты должны являться наследниками класса TComponent.
В Delphi можно создать заготовку для нового компонента, пройдя путь:
ADOConnection1
ADOQuery1
DataSource1
DBGrid1
Button1
File → New → Component или
Component → NewComponent
После этого на экране появляется окно, в котором нужно определить:
• наследуемый класс (Ancestor Type);
• имя нового класса (Class Name);
• имя странички палитры компонентов (Paletter Page);
• место расположения файла с модулем нового компонента.
В результате получаем заготовку модуля Unit c процедурой регистрации компонента. Остается только дополнить этот модуль новыми возможностями и установить его, пройдя путь:
Component → Install Component
В итоге в палитре компонентов Delphi появится новый компонент.
Для нового компонента можно создать свой значек, войдя в графический редактор: Tools → Image Editor. В нем нужно создать компонентный ресурсный файл: File → New → Component Resource File, в котором задать растровое изображение значка размером 24 х 24 пикселя с палитрой из 16 цветов: Resource → New → BitMap. Далее нужно назвать новый ресурс именем класса компонента, причем используя только прописные буквы, затем сохранить ресурсный файл с именем модуля, описывающего компонент, и расширением «.dcr». При регистрации нового компонента ему будет автоматически присвоен новый значок.
Рассмотрим пример создания нового компонента – наследника класса TListBox, который будет поддерживать табуляцию строк. Табуляция строк нужна для разбивки содержимого строк на колонки, начинающиеся с определенной позиции в строке. Например, мы хотим вывести в виде таблицы фамилии и должности сотрудников. Фамилии, допустим, будут начинаться с 5–й позиции в строке, а должности – с 40–й. Стандартный компонент TListBox не поддерживает табуляцию, и так как фамилии имеют разное количество символов, в таблице названия должностей будут начинаться с разных позиций, что затрудняет ее восприятие.
В новом компоненте предлагается в строки, помещаемые в новый LisBox, записывать между словами символы табуляции (код #09) и в класс компонента ввести новое свойство STabStop типа TStrings, в которое будем записывать в каждой ее строке номера позиций табуляции.
В результате получим компонент, который из таблицы
Иванов Инженер |
Сидоренко Техник |
Там Технолог |
позволит получить более воспринимаемую таблицу:
Иванов | Инженер |
Сидоренко | Техник |
Там | Технолог |
В этой таблице, в отличие от компонента TStringGrid, будет выбираться вся строка, а не отдельная ячейка таблицы.
Реализация такого компонента приведена ниже:
unit Ulistmy;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TListmy = class(TListBox) // Имя нового класса – TListMy
private
FfTabStop:TStrings; // Поле для хранения позиций табуляции
// Метод задания позиций табуляции
Procedure SetTabStop(value:Tstrings);
protected
public
Atabstop:Array[1..20] of integer; // Массив значений позиций табуляции
// Новый метод создания окна компонента
Procedure CreateWnd; override;
// Новый метод определения параметров окна компонента
Procedure CreateParams(var Params:TcreateParams);override;
// Новый конструктор компонента с выделением дополнительной памяти
constructor create(Aowner:TComponent);override;
// Новый деструктор по освобождению памяти
Destructor Destroy;override;
// Метод задания компоненту массива значений позиций табуляции
Procedure tabset;
Published
// Определяем новое свойство STabStop, доступное на этапе проектирования
property STabStop:Tstrings read FfTabstop write SetTabStop;
end;
procedure Register; // Метод регистрации компонента
implementation
procedure Register;
begin
// Регестрируем новый компонент ListMy на страничке Samples
RegisterComponents('Samples', [TListmy]);
end;
// Метод записи значений в свойство STabStop
Procedure Tlistmy.SetTabStop(value:TStrings);
Begin
ffTabStop.Assign(value); // Запись значений в поле FFTabStop
tabset; // Устанавливаем в компоненте новую табуляцию
Invalidate; // Перерисовываем компонент
end;
Procedure TListmy.CreateParams(var Params:TCreateParams);
Begin
// Вызываем наследуемый метод задания параметров компонента
inherited CreateParams(Params);
with Params do Begin
// Изменяем стиль окна нового компонента, разрешаем табуляцию
Style:=Style or $80{Lbs_Usetabstops};
end;
end;
Procedure Tlistmy.CreateWnd;
var i,j,err:integer;s:String;
Begin
// Вызываем наследуемый метод создания окна
Inherited CreateWnd;
tabset; // Устанавливаем табуляцию для нашего окна
end;
Procedure Tlistmy.Tabset;
var i,j,err:integer;s:string;
Begin
// Проверяем наличие строк, задающих позиции табуляции в FFTabStop
if fFTabStop.count>0 then Begin
// Открываем цикл переписи позиций табуляции из FFTabStop в ATabStop
for i:=1 to fFtabstop.count do Begin
s:=Fftabstop.strings[i-1];
val(s,j,err); // Переводим строку s в число j
if err<>0 then Atabstop[i]:=0 else
// Записываем позиции табуляции в ATabStop с учетом того, что ширина одного // символа равна четырем базовым единицам Windows
Atabstop[i]:=j*4;
end;
end else Begin
Atabstop[1]:=0;
end;
// Посылаем сообщение окну нового компонента, устанавливающее табуляцию
SendMessage(Handle,LB_SetTabStops,
Fftabstop.count,Longint(@Atabstop));
end;
Constructor Tlistmy.Create(Aowner:Tcomponent);
Begin
inherited Create(Aowner); // Вызываем наследуемый конструктор Create
// Выделяем память под список позиций табуляции
Fftabstop:=Tstringlist.create;
end;
Destructor Tlistmy.Destroy;
Begin
Fftabstop.Free; // Освобождаем память из–под списка табуляции
Inherited Destroy; // Вызываем наследуемый деструктор Destroy
end;
end.
Для подключения своего значка к вновь созданному компоненту можно создать компонентный ресурсный файл с именем UListMy.dcr, в котором необходимо определить растровое изображение значка размером 24 х 24 пикселя и названием TListMy.
Запись новый строки в компонент ListMy1 можно осуществить оператором:
ListMy1.Items.Add(#09+’Иванов’+#09+’Инженер’);
При этом слова «Иванов» и «Инженер» будут располагаться с позиций, заданных в свойстве STabStop.
Если создается целый набор своих компонентов, то их можно поместить в один пакет. Для этого нужно пройти путь:
Component → Install Packages → Add
Затем нужно создать свой пакет и поместить в него свои компоненты.
- Программирование в среде Delphi
- Программирование в среде Delphi
- 1. История развития вычислительной техники, системы счисления и единицы информации.................................................7
- 2. Структура персонального компьютера и операционные системы.........................................................................13
- 3. Основы алгоритмизации и работа в delphi..........................18
- 4. Базовые элементы delphi...................................................................26
- 5. Стандартные функции и подпрограммы................................30
- 6. Операторы delphi......................................................................................33
- 7. Операторы циклов....................................................................................35
- 18. Выделение памяти под объект и прародитель всех классов – tobject..........................................................................................84
- 19. Обработка исключительных ситуаций................................87
- 20. Основные классы и общие свойства компонентов...93
- 26. Технология com.....................................................................................129
- 1. История развития вычислительной техники, системы счисления и единицы информации
- 1.1. История развития вычислительной техники
- 1.2. Системы счисления
- 1.3. Единицы информации
- 2. Структура персонального компьютера и операционные системы
- 2.1. Структура персонального компьютера.
- 2.2. Операционные системы
- 3. Основы алгоритмизации и работа в delphi
- 3.1. Основы программирования
- 3.2. Программирование в среде Delphi
- 4. Базовые элементы delphi
- 4.1. Алфавит среды Delphi
- 4.2. Константы
- 4.3. Переменные
- 4.4. Основные типы переменных
- 4.5. Операции над переменными и константами
- 5. Стандартные функции и подпрограммы
- 5.1. Математические функции
- 5.2. Функции преобразования
- 5.3. Дополнительные системные подпрограммы и функции
- 6. Операторы delphi
- 6.1. Оператор присваивания
- 6.2. Оператор безусловной передачи управления
- 6.3. Условный оператор if
- 6.4. Оператор разветвления Case
- 6.5. Составной оператор
- 7. Операторы циклов
- 7.1. Оператор цикла For
- 7.2. Оператор цикла Repeat
- 7.3. Оператор цикла While
- 8. Работа с массивами
- 9. Работа со строками
- 9.1. Процедуры работы со строками
- 9.2. Функции работы со строками
- 10. Работа с записями
- 11. Процедуры и функции
- 12. Модуль unit
- 13. Работа со множествами
- 14. Работа с файлами
- 14.1. Текстовые файлы
- 14.2. Типированные файлы
- 14.3. Нетипированные файлы
- 15. Работа с файлами и каталогами
- 16. Динамические переменные и структуры данных
- 16.1. Динамические переменные
- 16.2. Работа со стеком
- 16.3. Работа со списками или очередями
- 16.4. Работа с деревьями
- 17. Основы объектно–ориентированного программирования
- 17.1. Объекты и классы
- 17.2. Области видимости класса
- 17.3. Свойства (Property) и инкапсуляция
- 17.4. Методы, наследование и полиморфизм
- 17.5. События (Events)
- 18. Выделение памяти под объект и прародитель всех классов – tobject
- 18.1. Выделение памяти под объект
- 18.2. Описание класса tObject
- 18.3. Операторы приведения типов классов
- 19. Обработка исключительных ситуаций
- 19.1. Два вида оператора Try
- 19.2. Программное создание исключительной ситуации
- 19.3. Основные исключительные ситуации
- 20. Основные классы и общие свойства компонентов
- 20.1. Класс tList
- 20.2. Класс tStrings
- 20.3. Общие свойства компонентов
- 21. Графические возможности delphi
- 21.1. Класс Tcanvas
- 21.2. Классы тGгарhic и тРicture
- 21.3. Классы tFont, tPen и tBrush
- 21.4. Работа с изображениями
- 22. Визуальные компоненты delphi
- 22.1. Компонент tBitBtn
- 22.2. Компоненты tDrawGrid и tStringGrid
- 22.3. Компонент tPageControl
- 22.4. Компонент tTimer
- 22.5. Компонент tGauge
- 22.6. Компонент tСolorGrid
- 23. Стандартные диалоговые окна и типовые диалоги
- 23.1. Стандартные диалоговые окна
- 23.2. Типовые диалоги
- 24. Форма, приложение и глобальные объекты
- 24.1. Форма и ее свойства
- 24.2. Объект Application
- 24.3. Глобальные объекты
- Объект ClipBoard
- Объект Screen
- Объект Printer
- 25. Межпрограммное взаимодействие
- 25.1. Обмен сообщениями
- 25.2. Динамический обмен данными
- 25.3. Совместное использование общей памяти
- 25.4. Каналы
- 25.5. Сокеты
- 26. Технология com
- 26.1. Интерфейс
- 27. Технология автоматизации
- 27.1. Основы ole Automation
- 27.2. Примеры использования серверов автоматизации
- 27.3. Компоненты ActiveX
- 28. Динамические библиотеки
- 28.1. Создание dll
- 28.2. Использование dll
- 28.3. Пример написания dll
- 29. Работа с базами данных
- 29.1. Основные определения
- 29.2. Взаимодействие приложения на Delphi с базами данных
- 29.3. Компоненты взаимодействия с базами данных
- If adoTable1.Locate(’fio,stag’,varArrayOf([’Иванов’,’10’]),[])Then …;
- 29.4. Работа с локальной базой данных
- 30. Основы языка sql
- 30.1. Составные части sql
- 30.2. Команда select
- 30.3. Пример использования запросов в Delphi
- 31. Создание собственных компонентов
- 32. Работа с реестром
- 33. Перспективы программирования в delphi
- Литература
- 220013, Минск, п.Бровки, 6