МЕТОДИКА СОЗДАНИЯ НОВОГО КОМПОНЕНТА. Новый компонент разрабатывается на основе родительского класса Класс, на основе которого создается новый компонент,

Презентация:



Advertisements
Похожие презентации
Тема 5. Основы современной технологии программирования Программирование в средах современных информационных систем. Интегрированные системы разработки.
Advertisements

Слезко Полина Сергеевна Учитель информатики Белоярской СОШ Томской области.
Тема 5. Введение в среду визуального программирования Borland Delphi 7.0.
Основы объектно-ориентированного программирования (ООП)
Создание базы данных с помощью Конструктора Создание базы данных без помощи Мастера Теперь попробуем создать базу данных без помощи Мастера. При запуске.
Презентация Delphi
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Процедуры и функции. Разработал учитель информатики МБОУ СОШ 50 г. Краснодара Ракута Елизавета Григорьевна « Учиться и, когда придет время, прикладывать.
ДАЛЕЕ БАЗА ДАННЫХ ACCESS Проектирование базы данных Создание базы данных Создание базы данных без помощи мастера Таблицы Создание таблицы в режиме конструктора.
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Курсовая работа По дисциплине : Основы алгоритмизации и программировани я Тема : « База данных сотрудников » Подготовила учащаяся : Проверил :
Интерфейс текстового процессора Microsoft Word. С помощью ленты можно быстро находить необходимые команды (элементы управления: кнопки, раскрывающиеся.
Связи между таблицами являются необходимым элементом структуры БД. Для того, чтобы связь была возможна, таблицы должны иметь общие поля. Чаще всего в одной.
Модули, созданные программистом Любознательные юные программисты ещё не знают что их ожидает =)
Окна и формы. Компоненты. Пуск => Все программы => Lazarus => Lazarus. при этом запускается оболочка создания приложений, называемая интегрированной средой.
Классы в C#. Две роли классов Класс Класс – это модуль, архитектурная единица построения программной системы. Модульность построения – основное свойство.
Выполнение запросов, создание и редактирование отчета MS Access.
Никого нельзя ничему научить, но всему можно научиться народная мудрость.
Объектно-ориентированное программирование Основы языка программирования Lazarus.
Транксрипт:

МЕТОДИКА СОЗДАНИЯ НОВОГО КОМПОНЕНТА

Новый компонент разрабатывается на основе родительского класса Класс, на основе которого создается новый компонент, будем называть базовым или родительским

Этапы разработки нового компонента Анализ требований к компоненту. Необходимо тщательно продумать, какой функциональности мы от него ожидаем и какие свойства и мето­ ды окажутся лишними. Выбор подходящего родительского класса. По результатам предыду­ щего этапа нужно выбрать из VCL класс, функциональность которого ближе всего подходит к требуемой, и произвести новый класс от него. Программирование компонента, то есть реализация его свойств, мето­дов и событий. Тестирование компонента в специально разработанном тестовом при­ ложении. Создание значка (ресурса) для компонента. Установка компонента в палитру.

Пример создания компонента на основе класса TGraphicControl В этом примере мы расширим функциональность класса, добавив к нему четыре приватных атрибута. Когда вы установите новый компонент в палитру и откроете его в Инспекторе объектов, то на вкладке Properties увидите все свойства, унаследованные от базового класса, плюс три новых: Number, Sign и MyString. Атрибута FNextNumber там не бу­дет, потому что мы его не будем публиковать как свойство.

t ype // объявляем новый компонент наследником класса TGraphicControl TMyComponent = class(TGraphicControl) private // объявляем поля для хранения элементов данных, которые мы // добавили к обычному TGraphicControl классу FNumber: Integer; FSign: Char; FMyString: String; FNextNumber: Integer; // методы для чтения значений атрибутов не обязательны: можно просто // сослаться на поле данных по его имени. // необходимость метода для записи атрибута зависит от типа данных: // для простых типов вроде Integer достаточно просто присвоить атрибуту // значение; если же для присвоения значения нужно выполнить // нетривиальные действия, то эти действия следует оформить// в метод записи. Чтобы свойства нового компонента отображались в инспекторе объектов, их необхо­димо опубликовать, то есть объявить в секции published интерфейсной части класса с ключевым словом property : Объявление свойств и методов компонента

// объявим только метод для записи значения свойства 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

В этом примере мы расширили функциональность класса TGraphicControl, добавив к нему четыре приватных атрибута. Когда вы установите новый компонент в палитру и откроете его в Инспекторе объектов, то на вкладке Properties увидите все свойства, унаследованные от базового класса, плюс три новых: Number, Sign и MyString. Атрибута FNextNumber там не бу­дет, потому что мы его не опубликовали как свойство.

Объявление свойства с помощью ключевого слова property в общем слу­чае выглядит так: property имя_свойства[индексы]: тип index целая_константа спецификаторы_доступа; Где: имя_свойства: произвольный идентификатор: индексы (не обязательны): список параметров, аналогичный списку аргументов процедуры или функции, но записываемый в квадратных скобках вместо круглых. Используется для объявления свойств-масси­вов, например: property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel; тип : тип данных атрибута, представляющего свойство - любой из стан­ дартных или заранее объявленных типов; Имя приватного атрибута, реализующего свойство, по соглашению об име­новании должно формироваться из буквы F и имени свойства, хотя компи­лятор этого не требует.

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 имя_метода

Методы класса Методами называются проце­дуры и функции, объявленные в интерфейсной части класса, при помощи которых объект класса выполняет различные действия. Методы могут быть открытыми (public), защищенными (protected) и приватными (private). Конструктор и деструктор класса обязательно должны быть объявлены как открытые.

Типы методов компонентов не отличаются от типов методов обычных клас­сов. Object Pascal поддерживает следующие типы методов: обычные, вир­туальные, динамические, абстрактные и методы сообщений.

Виртуальные методы очень важны для расширения функциональности и повторного использования компонента. От обычных методов они отли­чаются тем, что их можно переопределить. Чтобы сделать метод переопределяемым, его нужно объявлять с использованием ключевого слова virtual: procedure Method1; virtual;

Абстрактным методом называется тот метод, который в данном клас­се только объявлен, но не реализован. Реализовать его каждый класс, производный от данного, должен самостоятельно. Объявление методов абстрактными используется в классах, предназначенных служить базо­выми для нескольких классов- наследников. Если в классе есть хотя бы один абстрактный метод, то класс называется абстрактным, и объект та­кого класса создать невозможно. Каждый наследник абстрактного клас­са должен либо реализовать абстрактный метод, либо снова объявить его как абстрактный и переложить обязанность реализации на собственных наследников. Чтобы объявить метод абстрактным, нужно после его объявления указать ключевое слово abstract: function Method2(argl: Integer): Integer; abstract;

НАГЛЯДНЫЙ ПРИМЕР: СОЗДАНИЕ КОМПОНЕНТА «СПИСОК УСТАНОВЛЕННЫХ ПРИНТЕРОВ» Последовательность действий при программировании нового компонента отличается от порядка разработки обычного приложения: мы не использу­ем инструменты визуального проектирования, а только пишем программный код. Будем следовать плану разработки, приведенному в начале этой главы.

Действия при создании компонентов разделим на шаги 1. Анализ требований к компоненту. Чего мы хотим от списка принтеров? чтобы при текущей работе он не занимал на форме много места; чтобы отображал несколько принтеров и давал возможность вы­брать один их них; чтобы пользователь имел возможность задать размер и положение компонента; чтобы компонент реагировал на основные события мыши и клавиа­туры; чтобы на стадии разработки компонент содержал «живые данные». Выбор подходящего родительского класса. Самую близ­кую к нужной функциональность обеспечивает стандартный компонент ComboBox (класс ТСоmbobox). Нам понадобятся все его свойства, методы и события и еще те, которые мы добавим сами. 2. Программирование компонента. Delphi позволяет не писать код целиком вручную, а воспользоваться Мас­тером компонентов.

Откроется диалоговое окно New Component, в ко­ торое введите следующие значения: Ancestor Туре (тип родительского класса): выберите из списка ТСоmbobox. Class Name (имя класса, реализующего новый компонент): согласно правилам, имя каждого класса в Delphi должно начинаться буквой Т, поэтому выберем имя «TPrintersList». Palette Page (вкладка палитры): вкладка в палитре компонентов, на ко­торую Delphi поместит созданный нами компонент. Вы можете выбрать любую из имеющихся вкладок либо ввести имя новой, которую Delphi также создаст. Мы собираемся поместить компонент на новую вкладку, которой дали имя New. Unit File Name (имя файла модуля): здесь можно оставить значение по умолчанию (что мы и сделали) или выбрать папку и имя файла, в кото­ром будет сохранен исходный код компонента. Search Path (последовательность поиска): список папок, в которых Delphi будет искать исходные файлы компонентов. Нажмите ОК, и Delphi создаст заготовку нового компонента. Полученный компонент пока ничем ни внешним видом, ни поведением не отличает­ся от своего предка, компонента ComboBox. Выберите в строке меню команду Component New Component.

Компонент PrintersList должен отображать список всех установленных принтеров. Это значит, что как можно скорее после создания объекта клас­са TPrintersList приложение должно получить список установленных в системе принтеров и поместить их имена в выпадающий список компо­нента. Нa каком участке кода компонента это можно реализовать? В голову приходят варианты: в конструкторе Create? Нельзя, потому что в момент помещения ком­ понента на форму у него еще нет родительского окна (не установлено значение свойства ParentWindow), вследствие чего свойство Items еще не доступно; в инициализационном методе Loaded? Нельзя, потому что этот метод вызывается при загрузке компонента в память, то есть на стадии разра­ ботки, при помещении компонента на форму, его список окажется пуст; в методе CreateWnd, унаследованном от класса TCustomComboBox? Это правильное решение, потому что этот метод вызывается именно в момент создания элемента интерфейса оконного типа.

нужно переопределить метод 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.

3. Тестирование компонента. Сначала установите новый компонент в палитру (п. 6), а потом создайте новое приложение, поместите этот компонент на форму и проверьте, как он работает. 4. Создание значка компонента. Чтобы компонент было легко найти в палитре, у него должен быть свой собственный значок. Сейчас наш компонент наследует все, включая значок, от своего предка компонента ComboBox, и на создание индивидуального значка мы пока отвлекаться не будем - единственный компонент на вкладке New потерять трудно. Напомним только, что для создания значков предна­значен встроенный Редактор изображений (Tools Image Editor).

5. Установка компонента в палитру. Перед установкой компонента сохраните его (File » Save). Заметьте, что имя файла указывать не нужно - мы это уже сделали в диалоговом окне New Component. Теперь выберите из строки меню команду Component Install Component. В появившемся диалоговом окне Install Component перейдите на вкладку Into New Package («Поместить в новый пакет», рис. 13.2). В заполненных полях оставьте предложенные значения. В поле Package file name введи­те имя файла нового пакета, например, «MyPackage», а в поле Package de­scription понятное описание пакета, например, «Пример пользователь­ского компонента». Нажмите ОК и подтвердите создание пакета нажатием кнопки Yes. Delphi скомпилирует исходный файл, создаст пакет и установит в него новый компонент. В результате в палитре компонентов появится вкладка New, содержащая единственный компонент PrintersList, имя которого отображается во всплывающей подсказке.

Файл пакета находится в той же папке, в которую вы поместили файл мо­дуля (Unit File Name в окне Мастера компонентов), имеет имя Package file name и расширение.dpk. Структуру пакета (рис. 13.3) можно увидеть по команде File Open Project

. В ветви Contains перечислены модули, кото­ рые содержит пакет, в ветви Requires - модули, необходимые для работы пакета. Нажатие кнопки Compile приведет к пересборке пакета.

Теперь вы можете проверить, как работает новый компонент. Закройте все окна, связанные с компонентом и пакетом (File Close All), создайте новое приложение и поместите на форму компонент PrintersList со вкладки New. Соберите и запустите приложение и проверьте, как новый компонент реагирует на события, поступающие от клавиатуры и мыши.