Использование хранилища объектов Delphi

Источник: delphi

Введение

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

Хранилище объектов в Delphi

Хранилище объектов (Object Repository) появилось в Delphi практически с первых версий. Не замечая того, каждый из нас пользуется им постоянно. Новый проект - это тоже своего рода заготовка. Delphi не заставляет нас писать вручную файл проекта, описывать основную форму и добавлять её в проект. Далее, когда требуется добавить в приложение новую форму, мы тоже берём некий шаблон. Да, это чистая форма без каких-либо компонентов, но ведь её описание тоже состоит из некоторого количества строк. А мы их не пишем. И одновременно с этим создаётся новый модуль примерно такого содержания:

unit Unit2;

 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm2 = class(TForm)

  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var

  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
end.

Так где же находится это хранилище объектов? А находится оно в меню File - New. Что же это за хранилище такое, ведь там всего несколько пунктов? Ан-нет, имеющиеся в этом подменю пункты - наиболее основные. Они используются очень часто, поэтому и вынесены ближе. Среди них - новое приложение, новая форма, новый модуль и т.п.

Подменю File - New в Delphi

Однако помимо этих пунктов есть и ещё два - Other... (Другое) и Customize (Настроить под себя). Вот они-то нам и нужны. Пункт Other... открывает тот самый Object Repository, а пункт Customize позволит изменить содержимое данного меню.

Окно Object Repository

В заголовке окна - надпись "New Items", хотя и называется это хранилищем объектов. Для чего оно нужно? Всё просто: это набор заготовок самого разного типа и предназначенных для самых разных задач, проще говоря шаблоны. Используются они очень просто: выбираем то, что нужно, и получаем "бланк", который меняем так, как нам угодно. Вспомните, например, сколько раз вам приходилось создавать окно About ("О программе") в своих проектах? А ведь это окно стандартное, типичное для всех приложений. Да и общий вид у него есть, сформировавшийся со временем и привычный для всех пользователей. Вместо того, чтобы каждый раз создавать это окно заново, можно взять готовый шаблон, вписать нужные данные и окошко готово!

Итак, окно состоит из двух частей - слева находится список (дерево) категорий, а справа отображаются объекты, принадлежащие выбранной категории. В более ранних версиях Delphi окно было выполнено в виде вкладок с названиями категорий.

Окно хранилища объектов (Object Repository)

Разработчики поместили в хранилище множество интересных и полезных вещей. Что именно нам доступно, рассмотрим чуть позже.

Использование хранилища очень простое: выбираем желаемый объект, нажимаем OK и он добавляется в текущий проект (если это составная часть проекта - форма, модуль и т.п.), либо создаётся новый проект (например, если это DLL или вообще готовый проект). Добавление некоторых объектов сопровождается предварительной их настройкой - это может быть окно с предложением ввести требуемые данные, либо пошаговый мастер.

Примеры использования

Раз уж мы заговорили об окне About, давайте его и попробуем добавить в наш проект. Итак, выбираем File - New - Other. Нужный нам объект называется About box и располагается в категории Delphi Files:

Delphi Files в Object Repository (объект About box)

После нажатия OK в нашем проекте появилась новая форма с именем AboutBox и несколькими компонентами - текстовыми метками, картинкой и кнопкой. Удобно, не правда ли? Остаётся лишь вписать название программы, версию, вставить нужную иконку и окно полностью готово. Делается буквально за минуту. Создать такое окно вручную несложно, но всё же это займёт больше времени.

Окно About, созданное из заготовки в репозитории

Теперь давайте возьмём что-нибудь более интересное. Например, объект Dual list box. Как следует из названия, это окно с двумя списками. Знакомое окно? Ещё бы, ведь такие используются очень часто. Далеко ходить не надо - окно настроек проекта (Project - Options), раздел Forms. Согласитесь, что размещение такого количества компонент на форме заняло бы гораздо больше времени. Но всё это ещё не всё. В окне About за нас был автоматически создан интерфейс. А в этом примере за нас ещё и код написали! Откройте программный модуль - там не так уж и мало написано. Ну что, а каково писать всё это вручную?

Окно Dual list box из хранилища объектов - удобная и функциональная форма

Выбор способа вставки объекта в проект

При выборе в окне хранилища некоторых объектов (в основном форм) внизу появляется область выбора способа вставки объекта. Имеется 3 разных варианта. По умолчанию выбран вариант Copy. С использованием этого варианта ничего "плохого" сделать не удастся, так что можно безболезненно экспериментировать.

Способ вставки объекта в проект - Copy, Inherit или Use

Итак, разберём, в чём смысл каждого из способов.

Copy (копирование) - стандартный способ вставки, когда имеющийся в хранилище объект просто копируется в ваш проект. Вы можете изменять вставленный объект как угодно, так как эти изменения останутся только в вашем проекте: в хранилище объект нисколько не изменится. Именно поэтому я назвал этот способ безопасным.

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

Use (использование) - способ, при использовании которого в проект вставляется оригинальный объект и все изменения сразу же вносятся в объект хранилища. В пояснениях, думаю, не нуждается.

Физическое расположение хранилища

Понятно, что все объекты хранилища не появляются из ниоткуда, а находятся где-то на диске. Найти это место несложно - это папка ObjRepos в папке, куда установлена сама среда Delphi, т.е. в большинстве случаев это X:\Program Files\CodeGear\RAD Studio\x.0\ObjRepos. Названия файлов в основном соответствуют тем названиям, которые видны в окне File - New - Other. Так что, если вам потребовалось изменить какой-нибудь объект, следует найти нужный файл и внести в него изменения.

Содержимое хранилища

Теперь давайте кратко пробежимся по хранилищу и посмотрим, что есть у нас в арсенале. Рассмотрение будет идти по категориям.

Delphi Projects:

Console Application - консольное приложение, т.е. приложение без форм.

Control Panel Application - приложение для "Панели управления" Windows (т.н. апплет).

DLL Wizard - заготовка DLL-библиотеки.

MDI Application - приложение с многооконным интерфейсом, т.е. для одновременного редактирования сразу нескольких документов. Выполнено в виде текстового редактора. Запрограммированы функции создания нового документа и открытия существующего.

Package - пакет, в который помещаются модули новых компонент для более простой и быстрой их установки в Delphi на других компьютерах.

Resource DLL Wizard - пошаговый мастер по созданию DLL-библиотек, используемых в нескольких проектах.

SDI Application - программа с единственным окном редактирования документа. Создано аналогично MDI Application - в виде текстового редактора.

Service Application - сервисное приложение, т.е. дополнительная служба для операционной системы.

VCL Forms Application - стандартное VCL-приложение, которое мы в основном и используем.

ActiveX - основные элементы для разработки собственных компонент, дополнений и библиотек типов.

Delphi Files:

About box - информационное окно "О программе".

Component - новый компонент на базе какого-либо из существующих.

Control Panel Module - модуль для Control Panel Application.

Data Module - модуль данных, на котором размещают компоненты, отвечающие за работу с базами данных.

Dialog with Help (Horizontal) и Dialog with Help (Vertical) - стандартные диалоговые окна с кнопками "OK", "Cancel" и "Help". Отличаются расположением кнопок - снизу по горизонтали или справа по вертикали.

Dual list box - окно с двумя списками (ListBox) и возможностью выбора требуемых элементов из списка.

Form - стандартная пустая форма.

Frame - форма-фрейм, которая может отображаться внутри другой формы. Чтобы вставить имеющийся фрейм на форму, используется кнопка Frames на вкладке Standard палитры компонент.

Password Dialog - диалог ввода пароля.

Reconcile Error Dialog - используется в приложениях баз данных для пояснения обнаруженной ошибки при изменении таблицы.

Standard Dialog - классический диалог с кнопками "OK" и "Cancel".

Tabbed Pages - диалоговое окно с несколькими вкладками и кнопками "OK", "Cancel" и "Help".

Thread Object - модуль с объектом "поток" (TThread).

Unit - заготовка для нового программного модуля.

Inheritable Items - формы, которые добавляются в проект наследованием (описание этого способа внедрения см. выше).

VCL for the Web - основные элементы для создания Web-приложений.

Wizards - различные мастера-помощники по созданию каких-либо объектов.

Other Files:

Code Template - шаблон для быстрой вставки в программный код (пишется как XML).

Project Group - группа проектов. Является удобным средством для работы сразу с несколькими проектами, а также может существенно облегчить параллельную разработку программ и DLL-библиотек.

Text - простой текстовый файл.

Unit Test - средства для тестирования имеющихся модулей и проектов и разделения готовых (Release) и разрабатываемых (Debug) версий.

Web Documents - основные форматы файлов, используемые в Web.

Расширение хранилища

Надеюсь, вы уже оценили полезность Object Repository. Нужно поговорить теперь и о том, как можно добавить в этот каталог что-то новое. На самом деле, добавление происходит очень легко и выполняется за несколько секунд. Однако, разработав что-то полезное (в первую очередь для себя) и добавив это в хранилище, можно впоследствии радоваться всю жизнь :-)

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

За основу возьмём Password Dialog. Открыв модуль, видим, что ни одной дополнительной строки кода там нет. Что ж, сделаем сами.

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

procedure TPasswordDlg.OKBtnClick(Sender: TObject);
begin
  if Length(Trim(LoginEdit.Text)) = 0 then

  begin
    MessageDlg('Вы не ввели логин.',mtError,[mbOk],0);
    Exit

  end;
  if Length(Trim(Password1Edit.Text)) = 0 then

  begin
    MessageDlg('Вы не ввели пароль.',mtError,[mbOk],0);
    Exit

  end;
  if Length(Trim(Password2Edit.Text)) = 0 then

  begin
    MessageDlg('Вы не ввели подтверждение пароля.',mtError,[mbOk],0);
    Exit

  end;
  if Password1Edit.Text <> Password2Edit.Text then
  begin

    MessageDlg('Пароль и его подтверждение не совпадают.',mtError,[mbOk],0);
    Exit
  end;

end;

Новая форма для регистрации пользователей

После того, как всё завершено, сохраняем полученную форму.

Теперь нужно добавить наше творение в репозиторий. Для этого в контекстном меню нашей формы выбираем пункт Add to Repository. В появившемся окне нужно ввести название добавляемого объекта, его описание, имя автора. Также можно выбрать иконку, которая будет отображаться в окне возле названия объекта. Объект будет помещён в ту категорию, которая выбрана в дерева слева. Можно создать и новую категорию кнопкой New Category.

Окно добавления созданной формы в хранилище объектов (Add to Repository)

После этого в окне хранилища появится созданная нами форма.

Созданная форма в списке (категория Delphi Files)

Если нужно добавить не отдельную форму, а весь проект, то следует выбрать пункт меню Project - Add to Repository. Появится аналогичное окно, которое точно так же заполняется.

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

Редактор Object Repository

Для редактирования имеющихся объектов существует простой редактор, который вызывается командой Tools - Repository. В этом окне можно удалить или изменить существующие объекты.

Заключение

Хранилище объектов - простое в плане понимания и использования, но в то же время очень удобное средство для разработки приложений. Особенно удобно то, что в хранилище можно добавить свои собственные разработки, а также отредактировать существующие. В данной статье были освящены все основные приёмы работы с Object Repository, а также был приведён краткий обзор тех объектов, которые уже имеются в стандартной поставке Dephi. Успехов в программировании!


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22100