Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование и создание визуальных компонент 6....doc
Скачиваний:
4
Добавлен:
08.07.2019
Размер:
236.54 Кб
Скачать

6.6 Иерархия классов vcl

Ранее в этой главе мы ознакомились с характеристиками четырех базисных типов компонент: стандартные, оригинальные, графические и невидимые. Теперь покажем место и назначение этих типов в иерархии объектов.

Рис. 6.7 показывает ключевые классы в иерархической структуре, от которых произведены все компоненты VCL. Каждый объект представляет некоторый набор методов, событий и свойств и имеет специальное назначение.

TObiect

TPersistent

TComponent

TControl

TGraphicControl TWinControl

TCustomControl

Рис. 6.7. Иерархия ключевых базовых классов VCL.

Подобно тому как TObject является базовым классом для всех порождаемых классов, TComponent является базовым классом для всех порождаемых компонент. $

Невидимые компоненты произведены от класса TComponent. Графические компоненты, не ассоциированные с оконными элементами управления, произведены от класса TGraphicControl.

Являясь оконными элементами, компоненты стандартного управления произведены непосредственно от класса TWinControl, а оригинальные компоненты — косвенно от класса TCustomControl, восходящего к TWinControl. Именно на уровне TWinControl и вводится "оконный дескриптор" (window handle). Рис. 6.8 S продолжает иерархическую структурную схему компонентных классов VCL.

* TButtonControl

о TButton

+ TBitBtn о TCustomCheckBox

+ TCheckBox

+ TDBCheckBox о TRadioButton

* TCustomComboBox о TComboBox о TDBComboBox о TDriveComboBox о TFilterComboBox

* TCustoinControl

о TCustomGrid

+ TCustomDBGrid + TDBGrid + TDBLookupList

+ TPopupGrid + TCustomOutline

+ TOutline + TDrawGrid

+ TStringGrid о TCustomGroupBox

+ TCustomRadioGroup + TDBRadioGroup + TRadioGroup

+ TGroupBox о TCustomPanei

+ TDBNavigator

+ TPanel о TDBImage о TDBLookupControl

+ TDBLookupComboBox

+ TDBLookupListBox

+ TPopupDataList о THeader о THintWindow о TMediaPlayer о TNotebook о TOleContainer о TPage о TScroller о TTabSet

* TCuatonEdit

о TCustomMaskEdit

+ TDBEdit

+ TInplaceEdit

+ TMaskEdit о TCustomMemo

+ TCustomRichEdit + TRichEdit

+ TDBMemo

+ TMemo о TDBLookupCombo о TEdit

* TCustomHotKey о THotKey

* TCuafcomListBox о TDBListBox о TDirectoryListBox о TFileListBox о TListBox

* TCuetomLietView о TListView

* TCuetomTabControl о TPageControl о TTabbedNotebook о TTabControl

* TCustomTreeView о TTreeView

* TCustomUpDown 0 TUpDown

* TDBCtrlGrid

* TDBCtrlPanel

* THeaderControl

* TOleControl

* TProgressBar

* TScrollBar

* TScrollingWinControl

о TForm

+ TDesignWindow + TInputReqDialog + TLoginDialog + TPasswordDialog

о TScrollBox

* TStatueBar

* TTabPage

* TTabSheet

* TTrackBar

Puc. 6.8. Дерево производных компонент от TCustomControl и TWinConlrol.

6.6.1 TObject

TObject является базовым классом для всех прочих порождаемых классов. TObject инкапсулирует общее для всех объектов системы C++Builder функциональное поведение, обусловленное методами, которые обеспечивают:

• Способность конструктора создавать, а деструктора разрушать объект-экземпляр класса в динамической памяти. Конструктор TObject возвращает указатель на создаваемый объект.

• Информацию RTTI об имени, типе производного объекта и его свойствах, которые объявлены как _published.

• Поддержку обработки сообщений.

Большинство этих методов предназначены для внутреннего использования средой C++Builder, поэтому не следует прямо обращаться к ним из вашей программы. Часть методов TObject объявлены как статические (с ключевым словом static). Это означает, что вам не нужно создавать экземпляр данного класса для того, чтобы обратиться к его статическим методам.

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

Используйте TObject для объявления простых объектов, которые не являются компонентами и не нуждаются в поточности и присваивании. Среди полезных не компонентных классов отметим TStringList, TIniFile и TPrinter.

6.6.2 TPersistent

Класс TPersistent непосредственно произведен от TObject. Этот абстрактный класс не определяет никаких специальных свойств или событий, однако его производные приобретают особые способности присваивания и поточности.

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

• Assign позволяет присваивать значения свойствам.

• AssignTo позволяет присваивать содержимое одного объекта другому (например, как делает это производный от TPersistent класс TClipboard).

• DefineProperties позволяет определить процедуру загрузки и сохранения в потоке особых дополнительных свойств. По умолчанию сохраняются только свойства, объявленные как _published.

6.6.3 TComponent

Класс TComponent непосредственно произведен от TPersistent. Как уже было сказано, все компоненты являются производными от TComponent и могут находится в его владении. TComponent инкапсулирует общее для всех компонент функциональное поведение, обусловленное свойствами и методами, которые обеспечивают:

• Перенос на форму из Палитры компонент и манипуляции в окне Редактора

форм.

• Способность владения и обслуживания других компонент.

• Специальные характеристики поточности, с которыми может манипулировать Инспектор объектов на этапе проектирования.

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

Класс TComponent определяет ряд свойств, которые придают объекту особую функциональность:

Свойство Назначение

Owner_______| Ссылается на владельца компоненты.

ComponentCount | Число компонент в перечне, которыми владеет данная компонента.

Componentlndex Индекс компоненты в перечне, начиная с 0.

Components | Свойство, содержащее перечень компонент, которыми владеет данная компонента.

ComponentState Текущее состояние компоненты.

ComponentStyle Стиль, определяющий поведение компоненты.

Name Имя компоненты.

Tag | Свойство типа int, которое не имеет предопределенного значения и может содержать любые данные или указате-ли, по усмотрению программиста.

Designlnfo | Используется Редактором форм.

Класс TComponent определяет ряд методов, которые придают объекту право владения другими компонентами и возможность доступа к ним посредством Инспектора объектов:

• Destroying и DestroyComponents устанавливают атрибуты данной компоненты и компонент, которыми она владеет, в состояние, указывающее на то, что они подлежат уничтожению.

• HasParent возвращает булево значение, указывающее на наличие родителя компоненты. Обращаться к этому методу следует до ссылок к родителю данной компоненты. Отметим, что наличие владельца компоненты не идентифицируется.

• insertComponent добавляет компоненту, передаваемую в качестве параметра, к перечню компонент, которыми владеет данная компонента, а RemoveComponent удаляет компоненту из этого перечня.

• FindComponent возвращает указатель экземпляра компоненты, о которой известно только имя, но неизвестна ссылка на владельца. Допустим, что форма содержит экземпляр компоненты TEdit с именем Editl. Чтобы получить указатель на экземпляр Editl и адресовать его текст, используйте следующий код:

void_fastcall TFormI::ButtonlClick(TObject *Sender)

{

TEdit * Editlnstance = FindComponent("Editl");

(TEdit *)(FindComponent("Editl"))->Text = "Hello";

}

He создавайте экземпляров класса TComponent. Используйте TComponent в качестве базового класса при создании невидимых компонент.

6.6.4 TControl

Класс TControl определяет общие для видимых компонент члены данных, методы и события. Поскольку элементы TControl обладают способностью отображать себя, некоторые его свойства оперируют с положением, размером и видом объекта (Top, Left, Width, Height и Cursor, Hint), а другие свойства относятся к параметрам области клиента (ClientRect, ClientWidth и ClientHeight).

TControl также вводит свойства, устанавливающие видимость, доступность” цвет и шрифт элементов управления (Visible, Enabled, Color и Font). Свойств” Text и Caption обеспечивают установку редактируемых текстов и названий.

Наличие свойства Parent (Родитель), содержащего соответствующую ссылку, обусловлено возможностью класса TControl иметь родителя. Этот родитель может быть производным от TWinControl, поскольку родители обязаны быть оконными элементами управления.

TControl содержит ряд событий, возникающих при манипуляциях мышью над, видимыми элементами управления (OnClick, OnDblClick, OnMouseDowit, OnMouseMove, OnMouseUp, OnDragOver, OnDragDrop и OnEndDrag).

Поскольку TControl редко используется непосредственно, его события большинство свойств объявлены в секции protected. Разработчики производных компонент могут, таким образом, выбирать, какие свойства и события перенести в секцию public или _published, расширяя тем самым права доступа.

Большинство компонент являются производными от TWinControl или TGraphicControl. Эти базовые классы рассматриваются в следующих параграфах.

6.6.5 TWinControl

Класс TWinControl инкапсулирует оконные элементы управления с дескрипторами. Некоторые производные от TWinControl (компоненты TEdit, TListBox и TComboBox) инкапсулируют стандартные элементы управления Windows — поля редактирования, простые и комбинированные списки и т.д. Поэтому вам не придется манипулировать с ними посредством стандартных функций Windows API, a пользоваться свойствами и методами, предоставляемыми самими компонентами.

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

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

Controls Содержит список элементов управления, для которых TWinControl является родителем.

ControlCount Содержит число элементов управления, для которых TWinControl является родителем.

Ctl3d Определяет, требуется ли трехмерное отображение компоненты.

Handle Ссылается на оконный дескриптор объекта Windows, который инкапсулирует TWinControl. Это свойство передается тем стандартным функциям Windows API, которые принимают дескриптор как параметр.

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

Showing Указывает, видима или невидима компонента.

TabStop Указывает, можно ли использовать клавишу табуляции для выбора нужной компоненты.

TabOrder Определяет позиции табулятора выбора компонент.

Методы TWinControl главным образом ориентированы на разработчиков компонент и предназначены для управления фокусом, получения статусной информации, диспетчеризации сообщений и позиционирования:

• Broadcast используется для рассылки сообщений всем потомкам TWinControl.

• CanFocus возвращает булево значение, которое определяет, может ли TWinControl принять фокус ввода. Например, компонента не сможет принять фокус, если ее свойство Visible имеет значение false.

• ContainsControl определяет, содержится ли данный элемент управления внутри класса TWinControl. Этот метод не сообщает о том, является ли данный элемент потомком по отношению к TWinControl. Например, внешний класс TWinControl может быть родителем другого элемента, и эта родительская преемственность может продолжаться далее. Однако, все внутренние элементы содержатся во внешнем классе TWinControl.

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

• DisableAlign и EnableAlign используются для временного запрещения или разрешения выравнивания компонент внутри TWinControl.

• Focused возвращает значение true, если TWinControl находится в фокусе ввода, т.е. является активным элементом формы, на которой он размещен.

• HandleAl located возвращает значение true, если элемент управления имеет оконный дескриптор. HandleNeeded создает новый дескриптор, если он еще не был создан. Аналогичное действие выполняется автоматически при прямом обращении к свойству Handle.

• InsertControl добавляет элемент управления к свойству Controls (типа массив), делая TWinControl своим родителем. Лучший способ добавить потомка во время работы программы — просто присвоить ссылку на родителя свойству Parent. RemoveControl удаляет элемент управления из массщ Controls.

• Invalidate и Repaint выполняют перерисовку компоненты. Мето;

Repaint обрабатывает сообщение WMJPAINT, обращается к метол Update, который в свою очередь вызывает функцию Windows АP UpdaleWindow. PaintTo может использоваться для перерисовки содержимого TWinControl в область (device context) другого элемента управления. ReAlign вызывает повтор выравнивания компонент внутри TWinControl. ScaleBy используется для масштабирования TWinControl в заданном процентном отношении к исходному размеру. ScrollBy можно использовать, если вам не нравится логика прокрутки TWinControl, принятая по умолчанию.

• SetBounds устанавливает свойства границ компоненты (Left, Top, Width, Height) для TWinControl. Прямое изменение каждого из указанных свойств менее эффективно, поскольку всякий раз сопряжено с перерисовкой SetFocus активизирует TWinControl.

Другие методы, применяемые разработчиками компонент, предназначены для создания и уничтожения инкапсулированных TWinControl окон и их дескрипторов: .

• CreateWnd создает оконный элемент управления, инкапсулированны TWinControl, посредством последовательного обращения к CreateParams и CreateWindowHandle.

• CreateParams инициирует начальные значения всех оконных параметров Перегрузка этого метода позволяет менять оконные параметры, установлен ные по умолчанию.

• CreateWindowHandle создает оконный дескриптор путем обращения функции Windows API Create WindowEx.

• DestroyWnd уничтожает инкапсулированный оконный элемент управления путем обращения к методу DestroyWindowHandle, который в свою очередь обращается к функции Windows API Destroy Window.

TWinControl имеет события, вызываемые взаимодействием с клавиатурой i изменением фокуса (OnKeyDown, OnKey Press, OnKeyUp, OnEnter и OnExif).

Разрабатываемые компоненты редко происходят непосредственно от TWinControl. Лучше производить новые компоненты от общего класса TCustomControl, который предоставляет канву для рисования и обрабатывает сообщение WM_PAINT, или от некоторых более специализированных классов (TButtonControl, TCustomComboBox, TCustomEdit или TCustomListBox).

6.6.6 TGraphicControl

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

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

Производные TGraphicControl имеют обработчики событий, вызываемые манипуляциями с мышью.

TGraphicControl возлагает на пользователя операции перерисовки. Этот класс содержит свойство Canvas (Канва), которое обеспечивает доступ к отведенной для рисования поверхности, и виртуальный метод Paint, который вызывается в ответ на сообщение WM_PAINT, принимаемое родительским элементом управления.

6.6.7 TCustomControl

Стандартные компоненты, как производные от TWinControl (например, TEdit и TListbox), уже имеют способности собственного отображения, предоставленные инкапсулированными элементами управления Windows. А как создать оконную компоненту, которая отображает себя в виде, соответствующем оригинальным требованиям пользователя? Решение именно этой задачи и обеспечивает TCustomControl.

Будучи производным от класса TWinControl, TCustomControl является оконным элементом управления и, следовательно, может принять фокус ввода. Разработанные компоненты могут быть произведены от TCustomControl. Как и TGraphicControl, TCustomControl содержит свойство Canvas (Канва), которое предоставляет возможность произвольного рисования на выбранной прямоугольной области. По существу, производные компоненты от TCustomControl предоставляют в ваше распоряжение виртуальный метод Paint, перегрузка которого позволит рисовать компоненты так, как вы пожелаете.

6.7 Схема разработки компонент

Процесс разработки собственной компоненты (мы будем называть ее TMyComponent) проходит через выполнение следующих этапов:

1. Создание модуля для новой компоненты.

2. Наследование производного класса от существующего базового компонентного класса.

3. Добавление нужных свойств, событий и методов.

4. Регистрация компоненты в C++Builder.

5. Отладка.

6. Инсталляция компоненты на Палитру.

7. Сохранение файлов компоненты.

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

6.7.1 Создание модуля компоненты

Программный модуль состоит из двух файлов МуСотр.срр и MyComp.h, которые компилируются в объектный файл с расширением MyComp.obj C++Builder использует модули в различных целях - каждая форма и большинств компонент (или их логических групп) имеют свой собственный модуль. При paзработке компоненты вы либо создаете новый модуль для компоненты, или до бавляете ее к существующему модулю.

Чтобы создать модуль, выполните команду File | New и в открывшемся диалоre New Items выберите значок Unit. Чтобы добавить компоненту к существую щему модулю, выполните команду File | Open и в открывшемся диалоге отьшите ваш файл МуСотр.срр. Имея открытый модуль в окне Редактора кода, вы можете приступить к разработке компоненты. Для начала перечислите в МуСотр.h необходимые файлы фазы предкомпиляции и объявите производный класс ваше компоненты (Листинг 6.12).

^include <vcl\sysutils.hpp>

#include <vcl\controls.hpp>

#include <vcl\classes.hpp>

#include <vcl\forms.hpp>

class TMyComponent : public < базовый компонентный класс >

{

};

Листинг 6.12. Заготовка файла MyComp.h модуля компоненты. 1

Пока мы создали компоненту, которая ничем не отличается от своего родите", ля. В следующем разделе описываются варианты наследования в зависимости от выбранного типа базового компонентного класса.