Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  15:24[Войти] | [Зарегистрироваться]

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

Головков Влад
дата публикации 28-02-2003 14:55

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

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

Выделение групп форм в приложении работающем с базой данных.

Сравнение форм в большинстве приложений, работающих с базами данных, по свойствам и поведению позволяет выделить следующие группы форм:

  1. Индивидуальные формы. Эти формы не имеют ничего общего с остальными.
  2. Формы, сохраняющие в реестре Windows свое состояние. К этому классу форм можно отнести большинство форм любого приложения. Их особенности:
    1. Сохранение в реестре информацию о своем положение на экране, содержании элементов, расположенных на своей поверхности. При повторном создании эти формы пытаются загрузить всю сохраненную информацию, восстанавливая свое состояние на момент закрытия. Для этих целей в реестре для каждой формы создается отдельный ключ, в его значениях и подключах сохраняется вся индивидуальная для формы информация.
    2. Создание в конструкторе дополнительных элементов и уничтожение их в деструкторе.
    3. Интерфейс пользователя строится с использованием компонента TActionList.
  3. Формы печатающие свое содержимое. Эта группа является подмножеством группы 2. В рассматриваемом примере печать осуществляется при помощи Web Browser. Ее особенностью является :
    1. Печать и/или предварительный просмотр своего содержания.
  4. Формы отображающие и/или изменяющие содержание БД. Эта группа является подмножеством группы 3. Ее особенностями являются:
    1. При создание инициализируются параметры наборов данных (потомков TDataSet) и затем открываются. В ряде случаев возникает необходимость полностью обновить (загрузить и базы данных) наборы данных.
    2. Сохранение всех внесенных изменений в базе данных или откат не сохраненных изменений.

Группа форм 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 использует, а не наследует базовый класс. Все изменения в формах созданных с этим переключением отразятся в базовом классе.

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

Вынесение общих свойств и методов группы форм в базовый класс и наследование всех этих форм от базового

Это наиболее распространенный случай.
  1. Определить общие для всех форм группы сущности (свойства и методы). В случае наличия похожих по сути и по реализации методов, но отличающихся деталями необходимо выделить для каждого метода общую реализацию, а детали вынести в виртуальные методы.
  2. Привести каждую сущность во всех формах группы к одному виду. Для свойств это наименование и тип. Для методов наименование, тип, параметры.
  3. Создать базовый класс группы форм содержащий общие сущности.
  4. Унаследовать все формы группы от базового класса. Для это необходимо:
    1. Отредактировать pas-файл каждой формы группы.
      В секции uses прописать ссылку на модуль базового класс.
      В секции type предком класса формы указать базовый класс. Например
      До:
      type
        TCDCatalogMainForm = class(TForm)
          ..
        end;
      
      После:
      type
        TCDCatalogMainForm = class(TfmDBTemplate)
          ..
        end; 
      В определении класса формы удалить все сущности перенесенные в базовый класс.
    2. Отредактировать 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 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования