И. В. Сухарева объектно-ориентированное программирование лабораторный практикум




НазваниеИ. В. Сухарева объектно-ориентированное программирование лабораторный практикум
страница9/9
Дата конвертации11.10.2012
Размер0.49 Mb.
ТипДокументы
1   2   3   4   5   6   7   8   9

Создание компонентов в среде Delphi

  1. Способы создания компонентов


Компонент Delphi – это класс, с которым можно работать в период разработки. Создание компонента означает порождение новых классов от уже существующих. Можно породить новый компонент от любого существующего класса, потомка TComponent. Но существует несколько наиболее общих путей создания компонентов:

  • модификация существующего компонента;

  • создание нового оконного элемента управления (потомка TWinControl или TCustomControl);

  • создание нового графического элемента управления (потомка TGraphicControl);

  • создание «обертки» вокруг существующих Windows элементов управления;

  • создание невизуального компонента (потомка TComponent).

Классы, порожденные от классов, не являющихся потомками TComponent не будут компонентами.

Простейший способ создания компонента – это изменить уже существующий. Некоторые элементы управления могут иметь несколько вариантов на основе базового. В этом случае в VCL включается абстрактный класс (со словом Custom в его имени, например TCustomGrid), от которого порождаются новые версии. При этом могут изменяться методы и свойства. Так как нет возможности скрыть уже опубликованные свойства, то если это необходимо, приходится порождать новый класс от предка в линии наследования, у которого свойства еще были скрыты.

Оконные элементы управления – это компоненты, которые способны получать фокус ввода и имеют для этих целей дескриптор окна. Такие элементы управления порождаются либо от TWinControl, либо, если нужны возможности отрисовки, от TCustomControl. При этом виртуально перекрывается метод Paint, который отвечает за отображение компонента. Перекрываются другие существующие методы, изменяется свойств, создаются новые методы и свойства и т.п.

Если компоненту не нужен фокус ввода, то он аналогичным образом может быть порожден от TGraphicControl.

В Windows существуют зарегистрированные элементы управления. При необходимости могут создаваться и регистрироваться новые. В Delphi имеется возможность создавать компоненты путем создания «обертки» вокруг существующих элементов управления Windows. Пример созданного таким образом компонента Delphi – TEdit и другие, описанные в модуле STDCTLS.

Невизуальные компоненты используются, например, для организации доступа к базам данных, системным часам и т.д. Разрабатываются подобно визуальным, но могут порождаться непосредственно от TComponent.
      1. Процесс создания компонентов


В процессе создания компонента можно выделить следующие этапы:

  • создание модуля для компонента,

  • создание описания и реализации класса для компонента,

  • создание Help файла для компонента (если требуется),

  • тестирование не установленного компонента,

  • регистрация компонента.

По завершению работы компонент будет включать следующие файлы:

  • файл пакета (.BPL) или коллекции пакетов (.DPC),

  • откомпилированный файл пакета (.DCP),

  • откомпилированный файл модуля (.DCU),

  • файл графического изображения для компонента в палитре компонентов (.DCR),

  • файл справки (.HLP).

В среде разработки Delphi пакеты используются для хранения кода визуальной библиотеки компонентов. Исходный файл пакета имеет расширение DPK и представляет собой выполненное с использованием специального синтаксиса перечисление модулей и других пакетов, включаемых в состав данного пакета. На основе исходного файла компилятор генерирует исполняемый файл пакета с расширением BPL и создает файл бинарной карты пакета с расширением DCP, в который включается заголовок пакета и ссылки на все используемые файлы с расширением DCU. Новый компонент можно как добавить в уже имеющийся пакет, так и создать для него новый. Создание нового в большинстве случаев предпочтительнее.
      1. Создание модуля


В состав модуля компонента помимо описания и реализации класса должна входить процедура регистрации Register.

Существуют два способа создания модуля для нового компонента:

  • используя Component Wizard (New/Component),

  • создание компонента «в ручную».

При создании компонента с помощью мастера упрощается начальная стадия создания. В процессе диалога с мастером создания компонентов программист задает следующее:

  • класс, от которого компонент порождается,

  • имя класса нового компонента – причем только одного,

  • имя страницы палитры компонентов, на которой компонент будет размещен,

  • имя модуля, в котором будет описан компонент,

  • путь к этому модулю,

  • имя пакета, в котором будет размещен компонент.

На основе этих данных мастер создает шаблон модуля для компонента. В его состав будут входить заготовка для класса и процедура регистрации компонента, например:

unit MyControl;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type

TMyControl = class(TCustomControl)

private

{ Private declarations }

protected

{ Protected declarations }

public

{ Public declarations }

published

{ Published declarations }

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Samples', [TMyControl]);

end;

end.

Процедура RegisterComponents регистрирует указанный визуальный компонент (в пример TMyControl) на указанной странице компонентов (в примере это страница Samples).

При создании компонента вручную первым шагом создается новый Unit. Далее в нем описывается класс компонента и процедура регистрации. В одном модуле можно разместить несколько компонентов. Также можно добавить компоненты в модуль, созданный автоматически. Процедура RegisterComponents вызывается один раз для всех компонентов, регистрируемых на одной страницы компонентов. В этом вызове указывается имя страницы и перечисляются все размещаемые на ней компоненты. Процедура регистрации для случая нескольких компонентов будет выглядеть, например, следующим образом:

procedure Register;

begin

RegisterComponents('NewPage1', [TFirst, TSecond]); {два компонента на одной странице}

RegisterComponents('NewPage2', [TThird]); {один на другой}

RegisterComponents(LoadStr(srStandard), [TFourth]);{один на стандартной}

end;
      1. Создание описания и реализации класса для компонента


Создание описания и реализации класса для компонента включает в себя создание перекрытие или переопределение свойств, событий и методов, которые должны обеспечить функциональность компонента, его отображение на экране.
        1. Тестирование не установленного компонента



В процессе разработки компонента необходимо провести его тестирование, не помещая его на палитру компонентов. Для этого необходимо выполнить следующие действия:

  1. Добавить в проект модуль, содержащий компонент;

  2. Добавить имя модуля, в котором находится описание компонента, в раздел uses той формы, где планируется его использование;

  3. Добавить поле типа класс нового компонента в раздел public формы;

  4. Установить процедуру обработки события OnCreate для формы в котором будет написан код создания и инициализации компонента;

  5. Создать компонент в процедуре обработки данного события. В качестве параметра конструктора указывается Self – указатель на объект, который владеет данным компонентом;

  6. Установить свойство Parent (указатель на объект, который осуществляет визуальный контроль за компонентом) на форму;

  7. Установить остальные свойства компонента.
        1. Создание графического изображения для компонента



Каждому компоненту необходима картинка, для представления его на палитре компонентов. Если разработчик компонента не определит собственный рисунок, то Delphi будет использовать рисунок, заданный по умолчанию.

Поскольку картинка для палитры не нужна во время исполнения, нет необходимости прикомпилировать ее к компоненту. Вместо этого создается файл ресурсов для компонента, причем он должен иметь то же имя, что и модуль и расширением .DCR (dynamic component resource). Действия: Tools/Image Editor; File/New/Component Resource File. Внутри создается по одному изображению на каждый компонент. Каждое изображение представляет собой квадрат 24х24 пиксела. Действия Resource/New/Bitmap. Изображения должны иметь имена, соответствующие именам классов компонентов. Файл ресурсов должен быть помещен в тот же каталог, что и откомпилированные файлы компонента, что позволит Delphi найти его при инсталляции компонента на панели компонентов. Связывание изображения и компонента происходит автоматически по соответствию имен. Например, при создании компонента с именем TMyControl в модуле ToolBox, файл ресурсов будет называться TOOLBOX.DCR и содержать изображение с именем TMYCONTROL.
        1. Инсталляция и деинсталляция компонента


Перед тем, как использовать компонент во время визуального конструирования его надо инсталлировать. После этого он появится на палитре компонентов. Команды меню: Component/Install Component.

При необходимости компонент можно удалить из палитры компонентов. Если компонент был добавлен в уже существующий пакет, то его удаляют из соответствующего файла пакета. Команды: File/Open/(*.dpk)/выбор компонента/Remove. Если компоненты были в новый пакет, можно удалить весь пакет: Project/Options/Packages/выбор пакета/Remove.
      1. Создание свойств, событий и методов компонентов

        1. Работа со свойствами



Согласно определению, свойства отражают текущее состояние объекта. При написании компонента следует:

  • сделать возможным установку значений свойств как во время работы программы, так и в процессе визуальной разработки программы, объявляя их published;

  • предусмотреть значения свойств «по умолчанию», которые наиболее типичны для компонента и потребовали бы возможно меньших изменений в процессе визуальной разработки приложения;

  • обеспечить контроль значений свойств на допустимость и, в случае неправильной установки, автоматическое исправление значений.

При декларации свойства можно определить для него значение по умолчанию. Delphi использует значение по умолчанию, чтобы определить, сохранять ли значение свойства в файле формы. Сохраняется значение в том случае, если оно отличается от значения по умолчанию и директива stored установлена в true. Если не определить для свойства значение по умолчанию, то оно сохраняется всегда, когда Stored = true. Для свойств с областью видимости published значение stored по умолчанию = true. Если при перекрытии свойства оно теряет значение по умолчанию, то должна использоваться директива nodefault.

Важно отметить, что не происходит автоматической установки свойства в значение по умолчанию. Эта установка должна выполняться в конструкторе компонента.

Если для компонента на форме установлено значение, отличное от значения по умолчанию, то оно сохраняется в файле формы и будет установлено формой при загрузке проекта в Delphi или запуске приложения.

Delphi сохраняет форму и ее компоненты в файле формы (.dfm). Файл формы – это бинарное представление свойств формы и ее компонент. Когда компонент добавляется на форму, он должен быть способен записать свои свойства в файл формы при сохранении. Соответственно, при загрузке в Delphi или выполнении приложения, компонент должен восстановить сам себя из файла формы.

В большинстве случаев нет необходимости делать что-либо специальное, чтобы сделать компонент способным сохранять и загружать свойства из файла формы, это часть унаследованного поведения компонентов. Однако, иногда может возникнуть желание или необходимость реализовать альтернативный путь сохранения и инициализации свойств, тогда придется разбираться с соответствующим механизмом. В этом случае необходимо перекрыть метод DefineProperties. Эти же действия нужны для организации хранения неопубликованных свойств.

Если компоненту нужна еще какая-либо инициализация, кроме установки значения свойств, то следует перекрыть виртуальный метод Loaded, который вызывается сразу после установки значений свойств и перед отрисовкой компонента. Первое действие этого метода – вызов перекрытого метода предка.
        1. Методы



Методы могут быть использованы только во время выполнения программы для доступа к элементам компонента, выполнения специфических действий и т.п.

При создании методов рекомендуется соблюдать следующие общие принципы:


  1. избегать внутренних взаимозависимостей;

  2. выбирать названия методов;

  3. защищать методы.

Отсутствие внутренних взаимозависимостей позволяет встраивать компоненты в свое приложение не задумываясь о их реализации, что является одним из основных преимуществ компонентов. Поэтому, новые компоненты также следует создавать так, чтобы они корректно функционировали в любой ситуации без необходимости проверки каких-либо дополнительных предусловий или написания какого-либо дополнительного кода. И при написании компонента следует стараться, чтобы не было каких-либо особых условий при его использовании. Следует избегать того, чтобы:

  • методы должны были вызываться в определенном порядке;

  • было необходимо вызвать методы, чтобы использовать компонент;

  • методы могли установить компонент в неверное состояние

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

При выборе названий методов рекомендуется следовать некоторым правилам:

  • следует делать имена методов содержательными, например PasteFromClipboard содержательнее, чем PFC;

  • рекомендуется использовать глаголы в именах методов;

  • имена функций должны отражать природу возвращаемых значений, например GetHorizontalPosition.

Требование защиты методов сводится к тому, что при разработке компонента его методам следует назначить соответствующие области видимости:

  • любые методы, которые разработчик приложений может вызывать, должны быть объявлены public;

  • конструктор и деструктор всегда должны быть public;

  • любые методы, которые служат для реализации функциональности компонента, но вызываются не из приложения, а из других методов не должны быть public. Они могут быть private или protected. Если предполагается их вызов из методов классов потомков, то protected;

  • методы чтения и записи свойств должны быть объявлены как protected.

При разработке компонентов возможно:

  • создание новых методов, которые будут реализовать полностью новые, как по назначению, так и по реализации, функциональные возможности компонента;

  • перекрывать виртуальные и динамические методы предка – изменяя тем самым реализацию методов предка. Существенно, что, в отличии от обычных классов, компонент не должен иметь абстрактных методов.

При разработке методов не следует также забывать, что большинство из них будут вызываться из обработчиков событий, поэтому они не должны связывать системные ресурсы или переводить Windows в состояние, когда она не сможет реагировать на действия пользователя.
        1. События



События являются свойствами. В отличие от других свойств, события не должны использовать методы для доступа к полям, где хранится указатель на событие, т.е. после read и write указывается непосредственно имя поля. Рекомендуется использовать следующее соглашение по именам: имя свойства начинается с On, имя поля получено из имени свойства путем добавления в начало буквы F.

При разработке компонента следует помнить, что событие может не иметь обработчика и работа компонента не должна от этого зависеть.

Тип свойства события – указатель на метод. В Delphi определены типы методов для всех стандартных событий. При создании своего события можно либо использовать существующий тип, либо определить свой. При определении собственного типа следует помнить следующее. Хотя компилятор позволяет объявить тип указатель на метод-функцию, делать этого не следует. Поскольку пустая функция возвращает неопределенный результат, пустой обработчик события – функция может не всегда работать корректно. Таким образом, все события должны быть свойствами, имеющими тип указатель на метод-процедуру. Если имеется необходимость возвращать значения из обработчика события, то это делается через параметры, передаваемые по имени.

Существует ряд стандартных событий Delphi. Они могут быть разделены на две категории: те которые определены для всех элементов управления, и те, которые определены только для оконных элементов управления.

Стандартные события для всех элементов управления (потомков TControl):

OnClick, OnDragDrop, OnEndDrag, OnMouseMove, OnDblClick, OnDragOver, OnMouseDown, OnMouseUp.

Стандартные события для всех оконных элементов управления (потомков TWinControl): OnEnter, OnKeyDown, OnKeyPress, OnKeyUp, OnExit.

Стандартные события имеют соответствующие виртуальные методы с областью видимости protected, объявленные в TControl, либо в TWinControl. Эти методы вызываются при возникновении соответствующих событий и выполняют следующие действия:

  • стандартную обработку события;

  • проверку наличия обработчика события, назначенного разработчиком приложения;

  • в случае наличия – вызов обработчика события.

Такие методы называют стандартными обработчиками событий. Их имена соответствуют именам событий, например событие OnClick вызывает метод, называемый Click, а событие OnEndDrag – метод DoEndDrag.

Стандартный обработчик события может выглядеть следующим образом:

procedure TControl.DblClick;

begin

if Assigned(FOnDblClick) then FOnDblClick(Self);

end;

При разработке собственного компонента можно:

  1. Повысить видимость унаследованных событий;

  2. Изменить стандартные обработчики событий;

  3. Создать собственные события.

Новый компонент, создаваемый в Delphi, обычно наследует события для большинства сообщений Windows, но они могут быть объявлены protected. В случае необходимости при разработке компонента их видимость следует повысить.

Если есть необходимость выполнять какие-либо дополнительные действия с компонентом по какому-либо событию, то стандартный обработчик события следует перекрыть. При этом не следует забыть вызвать перекрытый метод предка, иначе не будет запускаться назначенный приложением обработчик события. Его можно вызвать либо до, либо после собственной обработки.

Создание собственного события позволяет разработчику, использующему компонент, возможность создавать собственную обработку этого события. При создании собственного события необходимо сделать следующее:

  1. организовать запуск события;

  2. объявить тип события;

  3. объявить событие.

Для организации запуска события нужно выяснить, что вызывает событие. Это может быть либо некоторое системное событие, которое вызываются Windows и события, которые могут возникнуть при изменении каких-либо свойств объекта. В соответствующем месте – например при изменении свойства компонента – должен вызываться стандартный обработчик события.

Тип события может быть как один из стандартных, так и собственный. В любом случае это указатель на метод, обычно – на метод-процедуру.

Для объявления события нужно описать:

  • свойство – имя начинается с On;

  • поле для хранения значения свойства – имя начинается с F;

  • стандартный обработчик события – виртуальный или динамический метод, который должен корректно работать в том случае, если значение свойства не установлено.

Библиографический список


  1. Буч Г. Объектно-ориентированный анализ и проектирование. – СПб.: «Невский диалект», 1999 г. – 560 с.

  2. Дарахвелидзе П.Г., Марков Е.П. Программирование в Delphi 7. – СПб.: БХВ, 2003 г. – 784 с.

  3. Дарахвелидзе П.Г. Марков Е.П. Delphi 4. – СПб.: БХВ, 1999 г. – 816 с.

  4. Страуструп Б. Язык программирования С++. – М.: «И.В.К.-СОФТ», 1991 г. – 315 с.

  5. Borland Delphi Help.

  6. Александровский А.Д. Объектно-ориентированное программирование в среде Delphi: Учебное пособие. – Рыбинск, РГАТА, 1997 г. – 82 с.

  7. Архангельский А.Я. 100 компонентов общего назначения библиотеки Delphi 5 . – М.: «Бином», 1999 г. – 272 с.

1   2   3   4   5   6   7   8   9

Похожие:

И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconПрограмма  дисциплины  «Объектно-ориентированное  программирование»  со
Дисциплина  (курс)  Объектно-ориентированное  программирование  имеет  своей  це
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум icon“Объектно-ориентированное программирование”
Целью данной учебной дисциплины является обучение программированию на языке Си++ с использованием принципов объектно-ориентированного...
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconИнтегрированная среда разработки языка Visual Basic
...
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум icon        биологические основы   лесного хозяйства      Лабораторный  практикум                
Лабораторный практикум для подготовки бакалавра   по профессионально-образовательной программе 250300  
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум icon      Факультет бизнес-информатика      Объектно-ориентированный анализ и программирование 
Основная цель, которую необходимо достичь в результате обучения дисциплине  Объектно
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconКонспект  лекций, лабораторный  практикум, практикум, контрольно-измерительные  материа
У66   Управляемые  конструкции  и  системы. [Электронный  ресурс] :  метод.  ука
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconЛабораторный практикум  по физике 
Предисловие    8 
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconЛабораторный практикум  по общей химии 
Введение  5 
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconЛабораторный практикум   по молекулярной физике,   термодинамике  
Введение  5 
И. В. Сухарева объектно-ориентированное программирование лабораторный практикум iconЛабораторный практикум   по курсу общей
Обработка результатов измерений   4 
Разместите кнопку на своём сайте:
TopReferat


База данных защищена авторским правом ©topreferat.znate.ru 2012
обратиться к администрации
ТопРеферат
Главная страница