Головков Влад дата публикации 28-02-2003 14:55 Пример использования наследования форм
В любом приложении можно выделить группы форм обладающие подмножествами одинаковых свойств и поведения. В среде программирования Delphi можно организовать иерархию наследования форм, создав иерархический набор базовых классов форм и наследуя все формы от различных базовых классов. Это дает следующие преимущества:
- Отсутствие дублирования исполняемого кода и ресурсов.
- Изменения, касающиеся всех форм группы, вносятся в класс-предок группы и автоматически становятся доступны во всех формах экземплярах потомков класса-предка.
- Стандартизация свойств и поведения форм облегчает освоение приложения конечными пользователями.
- В базовых классах можно реализовать часть функциональности, обычно обеспечиваемой дополнительными компонентами (например, сохранение положения и размеров формы в реестре). При этом упрощается перенос разработки приложения с одного рабочего места на другое, т.к. не требует установки дополнительных компонент на новом месте.
Выделение групп форм в приложении работающем с базой данных. |
Сравнение форм в большинстве приложений, работающих с базами данных, по свойствам и поведению позволяет выделить следующие группы форм:
- Индивидуальные формы. Эти формы не имеют ничего общего с остальными.
- Формы, сохраняющие в реестре Windows свое состояние. К этому классу форм можно отнести большинство форм любого приложения. Их особенности:
- Сохранение в реестре информацию о своем положение на экране, содержании элементов, расположенных на своей поверхности. При повторном создании эти формы пытаются загрузить всю сохраненную информацию, восстанавливая свое состояние на момент закрытия. Для этих целей в реестре для каждой формы создается отдельный ключ, в его значениях и подключах сохраняется вся индивидуальная для формы информация.
- Создание в конструкторе дополнительных элементов и уничтожение их в деструкторе.
- Интерфейс пользователя строится с использованием компонента TActionList.
- Формы печатающие свое содержимое. Эта группа является подмножеством группы 2. В рассматриваемом примере печать осуществляется при помощи Web Browser. Ее особенностью является :
- Печать и/или предварительный просмотр своего содержания.
- Формы отображающие и/или изменяющие содержание БД. Эта группа является подмножеством группы 3. Ее особенностями являются:
- При создание инициализируются параметры наборов данных (потомков TDataSet) и затем открываются. В ряде случаев возникает необходимость полностью обновить (загрузить и базы данных) наборы данных.
- Сохранение всех внесенных изменений в базе данных или откат не сохраненных изменений.
Группа форм 1 нам не интересна. Для групп 2, 3, 4 создадим базовые классы, от которых будем наследовать классы форм соответствующих групп. Так как группа 3 представляет собой подмножество группы 2, то унаследуем базовый класс группы 3 от базового класса группы 2. По аналогичной причине унаследуем базовый класс группы 4 от базового класса группы 3. На рисунке ниже представлена иерархия базовых классов форм и свойство и методы этих классов.
Использование базовых классов форм |
Так как базовые классы обычно используются в различных проектах, то лучше модули (unit) содержащие эти классы сохранить в отдельном каталоге. Для удобства последующего использования каждый класс нужно добавить в Repository. Для этого, во всплывающем меню формы каждого базового класса, выберем пункт "Add to Repository". В поле Title указать наименование базового класса, в поле Page - страницу диалога New. (я предлагаю все используемые базовые классы зарегистрировать на странице Templates).
При использовании базовых классов можно выделить два направления:
- На момент создания форм приложения разработчик уже имеет набор базовых классов.
- В ходе разработки приложения анализ форм показывает наличие общих свойств и методов. Принимается решение вынести общее в базовые классы и наследовать формы от них.
Рассмотрим по отдельности оба направления
Использование готовых на момент создания формы базовых классов |
Это очень простое направление использования. Для того, чтобы унаследовать вновь создаваемую форму от базового класса в меню диалога File/New откройте страницу базовый классов (Templates), выберите базовый класс, отметьте переключатель Inherited. Нажмите "OK". Delphi создаст форму класса наследника базового класса. Я настоятельно рекомендую использовать при создании новых форм переключатель Inherited, т.к. другие создают ряд неудобств:
- Copy копирует, а не наследует базовый класс в класс новой формы. После использования Copy все последующие изменения базового класса не будут отражаться в классе новой формы.
- Use использует, а не наследует базовый класс. Все изменения в формах созданных с этим переключением отразятся в базовом классе.
К сожалению в большинстве случаев разработки приложений на момент создания форм отсутствует иерархия базовых классов форм или она не полна.
Вынесение общих свойств и методов группы форм в базовый класс и наследование всех этих форм от базового |
Это наиболее распространенный случай.
- Определить общие для всех форм группы сущности (свойства и методы). В случае наличия похожих по сути и по реализации методов, но отличающихся деталями необходимо выделить для каждого метода общую реализацию, а детали вынести в виртуальные методы.
- Привести каждую сущность во всех формах группы к одному виду. Для свойств это наименование и тип. Для методов наименование, тип, параметры.
- Создать базовый класс группы форм содержащий общие сущности.
- Унаследовать все формы группы от базового класса. Для это необходимо:
- Отредактировать pas-файл каждой формы группы.
В секции uses прописать ссылку на модуль базового класс.
В секции type предком класса формы указать базовый класс. Например
До:
type
TCDCatalogMainForm = class(TForm)
..
end;
После:
type
TCDCatalogMainForm = class(TfmDBTemplate)
..
end;
В определении класса формы удалить все сущности перенесенные в базовый класс.
- Отредактировать dfm-файл каждой формы группы. Для этого в сплывающем меню формы выберите пункт "View as text". Заменить ключевое слово Object на Inherited у объекта формы и у всех подобъектов формы перенесенных в базовый класс. Например
До:
object CDCatalogMainForm: TCDCatalogMainForm
Left = 406
Top = 220
object alBase: TActionList
Left = 44
Top = 56
end
object Button1: TButton
Left = 44
Top = 56
end
...
end
После:
inherited CDCatalogMainForm: TCDCatalogMainForm
Left = 406
Top = 220
inherited alBase: TActionList
Left = 44
Top = 56
end
object Button1: TButton
Left = 44
Top = 56
end
...
end
Скачать пример: InhForms.zip (10K)
Приложение построено с использованием иерархии форм.
[TForm] [Наследование]
Обсуждение материала [ 22-06-2003 12:52 ] 10 сообщений |