Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемГригорий Моржеретов
1 МЕТОДИКА СОЗДАНИЯ НОВОГО КОМПОНЕНТА
2 Новый компонент разрабатывается на основе родительского класса Класс, на основе которого создается новый компонент, будем называть базовым или родительским
3 Этапы разработки нового компонента Анализ требований к компоненту. Необходимо тщательно продумать, какой функциональности мы от него ожидаем и какие свойства и мето ды окажутся лишними. Выбор подходящего родительского класса. По результатам предыду щего этапа нужно выбрать из VCL класс, функциональность которого ближе всего подходит к требуемой, и произвести новый класс от него. Программирование компонента, то есть реализация его свойств, методов и событий. Тестирование компонента в специально разработанном тестовом при ложении. Создание значка (ресурса) для компонента. Установка компонента в палитру.
4 Пример создания компонента на основе класса TGraphicControl В этом примере мы расширим функциональность класса, добавив к нему четыре приватных атрибута. Когда вы установите новый компонент в палитру и откроете его в Инспекторе объектов, то на вкладке Properties увидите все свойства, унаследованные от базового класса, плюс три новых: Number, Sign и MyString. Атрибута FNextNumber там не будет, потому что мы его не будем публиковать как свойство.
5 t ype // объявляем новый компонент наследником класса TGraphicControl TMyComponent = class(TGraphicControl) private // объявляем поля для хранения элементов данных, которые мы // добавили к обычному TGraphicControl классу FNumber: Integer; FSign: Char; FMyString: String; FNextNumber: Integer; // методы для чтения значений атрибутов не обязательны: можно просто // сослаться на поле данных по его имени. // необходимость метода для записи атрибута зависит от типа данных: // для простых типов вроде Integer достаточно просто присвоить атрибуту // значение; если же для присвоения значения нужно выполнить // нетривиальные действия, то эти действия следует оформить// в метод записи. Чтобы свойства нового компонента отображались в инспекторе объектов, их необходимо опубликовать, то есть объявить в секции published интерфейсной части класса с ключевым словом property : Объявление свойств и методов компонента
6 // объявим только метод для записи значения свойства FMyString. procedure SetMyString(Value: String); public { Public declarations } published // из четырех добавленных атрибутов публикуем три property Number: Integer read FNumber write FNumber; property Sign: Char read FSign write FSign; property MyString: String read FMyString write SetMyString; end; Чтобы свойства нового компонента отображались в инспекторе объектов, их необходимо опубликовать, то есть объявить в секции published интерфейсной части класса с ключевым словом property
7 В этом примере мы расширили функциональность класса TGraphicControl, добавив к нему четыре приватных атрибута. Когда вы установите новый компонент в палитру и откроете его в Инспекторе объектов, то на вкладке Properties увидите все свойства, унаследованные от базового класса, плюс три новых: Number, Sign и MyString. Атрибута FNextNumber там не будет, потому что мы его не опубликовали как свойство.
8 Объявление свойства с помощью ключевого слова property в общем случае выглядит так: property имя_свойства[индексы]: тип index целая_константа спецификаторы_доступа; Где: имя_свойства: произвольный идентификатор: индексы (не обязательны): список параметров, аналогичный списку аргументов процедуры или функции, но записываемый в квадратных скобках вместо круглых. Используется для объявления свойств-массивов, например: property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel; тип : тип данных атрибута, представляющего свойство - любой из стан дартных или заранее объявленных типов; Имя приватного атрибута, реализующего свойство, по соглашению об именовании должно формироваться из буквы F и имени свойства, хотя компилятор этого не требует.
9 index целая_константа (не обязателен): позволяет использовать один и тот же метод (чтения или записи) для доступа к нескольким свойствам, например: property Left: Integer index 0 read GetCoordinate write SetCoordinate; property Top: Integer index 1 read GetCoordinate write SetCoordinate; Общий метод доступа при этом должен принимать дополнительный ар гумент типа Integer. Для метода чтения он должен идти последним в списке аргументов, для метода записи предпоследним, сразу перед аргументом, в котором передается записываемое значение. В качестве этого аргумента передается указанное при объявлении свойства значение индекса. Так, в примере с координатами запись Object. Тор эквивалентна вызову метода Object. GetCoordinate (1). спецификаторы_доступа (обязателен хотя бы один): указание на спо собы чтения и/или записи свойства: read имя_атрибута или read имя_метода write имя_атрибута или write имя_метода
10 Методы класса Методами называются процедуры и функции, объявленные в интерфейсной части класса, при помощи которых объект класса выполняет различные действия. Методы могут быть открытыми (public), защищенными (protected) и приватными (private). Конструктор и деструктор класса обязательно должны быть объявлены как открытые.
11 Типы методов компонентов не отличаются от типов методов обычных классов. Object Pascal поддерживает следующие типы методов: обычные, виртуальные, динамические, абстрактные и методы сообщений.
12 Виртуальные методы очень важны для расширения функциональности и повторного использования компонента. От обычных методов они отличаются тем, что их можно переопределить. Чтобы сделать метод переопределяемым, его нужно объявлять с использованием ключевого слова virtual: procedure Method1; virtual;
13 Абстрактным методом называется тот метод, который в данном классе только объявлен, но не реализован. Реализовать его каждый класс, производный от данного, должен самостоятельно. Объявление методов абстрактными используется в классах, предназначенных служить базовыми для нескольких классов- наследников. Если в классе есть хотя бы один абстрактный метод, то класс называется абстрактным, и объект такого класса создать невозможно. Каждый наследник абстрактного класса должен либо реализовать абстрактный метод, либо снова объявить его как абстрактный и переложить обязанность реализации на собственных наследников. Чтобы объявить метод абстрактным, нужно после его объявления указать ключевое слово abstract: function Method2(argl: Integer): Integer; abstract;
14 НАГЛЯДНЫЙ ПРИМЕР: СОЗДАНИЕ КОМПОНЕНТА «СПИСОК УСТАНОВЛЕННЫХ ПРИНТЕРОВ» Последовательность действий при программировании нового компонента отличается от порядка разработки обычного приложения: мы не используем инструменты визуального проектирования, а только пишем программный код. Будем следовать плану разработки, приведенному в начале этой главы.
15 Действия при создании компонентов разделим на шаги 1. Анализ требований к компоненту. Чего мы хотим от списка принтеров? чтобы при текущей работе он не занимал на форме много места; чтобы отображал несколько принтеров и давал возможность выбрать один их них; чтобы пользователь имел возможность задать размер и положение компонента; чтобы компонент реагировал на основные события мыши и клавиатуры; чтобы на стадии разработки компонент содержал «живые данные». Выбор подходящего родительского класса. Самую близкую к нужной функциональность обеспечивает стандартный компонент ComboBox (класс ТСоmbobox). Нам понадобятся все его свойства, методы и события и еще те, которые мы добавим сами. 2. Программирование компонента. Delphi позволяет не писать код целиком вручную, а воспользоваться Мастером компонентов.
16 Откроется диалоговое окно New Component, в ко торое введите следующие значения: Ancestor Туре (тип родительского класса): выберите из списка ТСоmbobox. Class Name (имя класса, реализующего новый компонент): согласно правилам, имя каждого класса в Delphi должно начинаться буквой Т, поэтому выберем имя «TPrintersList». Palette Page (вкладка палитры): вкладка в палитре компонентов, на которую Delphi поместит созданный нами компонент. Вы можете выбрать любую из имеющихся вкладок либо ввести имя новой, которую Delphi также создаст. Мы собираемся поместить компонент на новую вкладку, которой дали имя New. Unit File Name (имя файла модуля): здесь можно оставить значение по умолчанию (что мы и сделали) или выбрать папку и имя файла, в котором будет сохранен исходный код компонента. Search Path (последовательность поиска): список папок, в которых Delphi будет искать исходные файлы компонентов. Нажмите ОК, и Delphi создаст заготовку нового компонента. Полученный компонент пока ничем ни внешним видом, ни поведением не отличается от своего предка, компонента ComboBox. Выберите в строке меню команду Component New Component.
17 Компонент PrintersList должен отображать список всех установленных принтеров. Это значит, что как можно скорее после создания объекта класса TPrintersList приложение должно получить список установленных в системе принтеров и поместить их имена в выпадающий список компонента. Нa каком участке кода компонента это можно реализовать? В голову приходят варианты: в конструкторе Create? Нельзя, потому что в момент помещения ком понента на форму у него еще нет родительского окна (не установлено значение свойства ParentWindow), вследствие чего свойство Items еще не доступно; в инициализационном методе Loaded? Нельзя, потому что этот метод вызывается при загрузке компонента в память, то есть на стадии разра ботки, при помещении компонента на форму, его список окажется пуст; в методе CreateWnd, унаследованном от класса TCustomComboBox? Это правильное решение, потому что этот метод вызывается именно в момент создания элемента интерфейса оконного типа.
18 нужно переопределить метод CreateWnd. В теле этого метода мы будем вызывать функцию доступа к принтерам, реализованную в модуле Printers, поэтому не забудьте добавить в секцию Uses этот модуль unit PrintersList; interface Uses SysUtils, Classes, Controls, StdCtrls, Printers; type TPrintersList = class(TComboBox) private { Private declarations } protected { Protected declarations } public procedure CreateWnd; override; { Public declarations } published { Published declarations } end; procedure Register; implementation procedure TPrintersList.CreateWnd; begin inherited; Items.Assign(Printer().Printe rs); end; procedure Register; begin RegisterComponents('New', [TPrintersList]); end; end.
19 3. Тестирование компонента. Сначала установите новый компонент в палитру (п. 6), а потом создайте новое приложение, поместите этот компонент на форму и проверьте, как он работает. 4. Создание значка компонента. Чтобы компонент было легко найти в палитре, у него должен быть свой собственный значок. Сейчас наш компонент наследует все, включая значок, от своего предка компонента ComboBox, и на создание индивидуального значка мы пока отвлекаться не будем - единственный компонент на вкладке New потерять трудно. Напомним только, что для создания значков предназначен встроенный Редактор изображений (Tools Image Editor).
20 5. Установка компонента в палитру. Перед установкой компонента сохраните его (File » Save). Заметьте, что имя файла указывать не нужно - мы это уже сделали в диалоговом окне New Component. Теперь выберите из строки меню команду Component Install Component. В появившемся диалоговом окне Install Component перейдите на вкладку Into New Package («Поместить в новый пакет», рис. 13.2). В заполненных полях оставьте предложенные значения. В поле Package file name введите имя файла нового пакета, например, «MyPackage», а в поле Package description понятное описание пакета, например, «Пример пользовательского компонента». Нажмите ОК и подтвердите создание пакета нажатием кнопки Yes. Delphi скомпилирует исходный файл, создаст пакет и установит в него новый компонент. В результате в палитре компонентов появится вкладка New, содержащая единственный компонент PrintersList, имя которого отображается во всплывающей подсказке.
21 Файл пакета находится в той же папке, в которую вы поместили файл модуля (Unit File Name в окне Мастера компонентов), имеет имя Package file name и расширение.dpk. Структуру пакета (рис. 13.3) можно увидеть по команде File Open Project
22 . В ветви Contains перечислены модули, кото рые содержит пакет, в ветви Requires - модули, необходимые для работы пакета. Нажатие кнопки Compile приведет к пересборке пакета.
23 Теперь вы можете проверить, как работает новый компонент. Закройте все окна, связанные с компонентом и пакетом (File Close All), создайте новое приложение и поместите на форму компонент PrintersList со вкладки New. Соберите и запустите приложение и проверьте, как новый компонент реагирует на события, поступающие от клавиатуры и мыши.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.