Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/108: Рейтинг темы: голосов - 108, средняя оценка - 4.53
MikeSoft
Эксперт С++
3919 / 1784 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
1

Visual Component Library: Вид изнутри, удаление и установка компонентов

30.07.2010, 00:56. Просмотров 19623. Ответов 0

1. Теоретическая часть. Знакомство с Visual Component Library.
  • 1.1. Назначение и устройство VCL.
  • 1.2. VCL-компоненты.
  • 1.3. Иерархия классов VCL.
  • 1.4. Типы компонентов.


2. Практическая часть. Регистрация VCL-компонентов в RAD Studio
  • 2.1. Загрузка исходных кодов из репозитория.
  • 2.2. Подготовка проектной группы.
  • 2.3. Установка пакетов.


3. Заключение.


_________________________________________________


1. Теоретическая часть. Знакомство с Visual Component Library.
  • 1.1. Назначение и устройство VCL.


Visual Component Library - библиотека, интегрированная в среду разработку. Основное её назначение - манипулирование классами визуальных компонентов на стадии проектирования. Поведение и вид компонентов определяются по мере разработки приложения, хотя можно модифицировать их и в процессе выполнения программы. Миссия VCL заключается в сокрытии от программиста запутанных низкоуровневых API-функций Windows.



  • 1.2. VCL-компоненты.

Компоненты - это "строительные кирпичи", из которых конструируется интерфейс программы. Компоненты постепенно обеспечивают вид приложения и закладывают в него определённое поведение и особенности. VCL-компонент представлен неким объектом, который программист способен перетащить с палитры компонентов на форму. После размещения компонента программист вправе управлять внешним видом компонента (если компонент не относится к "невидимому" или "безликому" классу), свойствами компонента, его события и наполнять его содержание кодом.

Для разработчика компоненты представляют собой классы, реализованные на Pascal, C++ или C#. Некоторые компоненты инкапсулируют типовые элементы управления из ОС Windows, другие - вносят различные эффекты и стили в существующих элементах.



  • 1.3. Иерархия классов VCL.

Компонент - логически завершённая кодовая конструкция, содержащая свойства, методы и события.
Все компоненты произведены из класса TObject. Для наглядности, предоставляю иерархию классов в VCL:

Visual Component Library: Вид изнутри, удаление и установка компонентов


Класс TObject - фундаментальный предок всех остальных классов. Именно этот класс имеет в себе параметр Sender, благодаря которому обработчики событий получают возможность идентифицировать практически любой объект-источник события.

Класс TPersistent - абстрактный класс, произведённый из TObject. Все классы, произведённые от TPersistent будут обладать способностью присваивания и поточностью.
Класс имеет методы:
  • Assign, AssignTo - Копирует объект в другой объект подобного класса.
  • DefineProperties - Определяет процедуру загрузку и сохранения в потоке особой информации (по умолчанию сохраняются только общеизвестные свойства - __published).
  • GetOwner - Возвращает владельца данного объекта.

Класс TComponent - произведён от TPersistent. Данный класс придаёт всем компонентам возможности:
  • Появления компонентов на палитре и управление ими в редакторе форм.
  • Способность владения и обслуживания других компонентов.
  • Специальные характеристики поточности.
  • Возможности создавать ActiveX- и COM-объекты.

Данный класс имеет свойства:
  • Owner - Владелец компонента, отвечающий за автоматическое разрушение и освобождение памяти.
  • ComponentCount - Общее число компонентов, находящихся во владении данного.
  • Components - Список указателей на компоненты, находящиеся во владении данного.
  • ComponentIndex - Индекс компонента в списке (начиная с 0).
  • ComponentState - Текущее состояние компонента.
  • ComponentStyle - Стиль компонента.
  • Name - Имя компонента.
  • Tag - Свойство типа int, отведённое для нужд программиста.
  • DesignInfo - Информация, используемая дизайнером форм.

Методы класса TComponent:
  • HasParent - Определяет, имеет ли данный компонент родителя.
  • InsertComponent, RemoveComponent - Добавление или удаление компонента из списка владения Components
  • Notification - Оповещает Components об исчезновении данного компонента.
  • Loaded - Инициализирует компонент.
  • FindComponent - возвращает указатель экземпляра компонента (если он присутствует в списке Components)
  • Destroying, DestroyComponents - Устанавливает свойство ComponentState данного компонента (и компонентов, которыми он владеет) в csDestroying, показывая на то, что необходимо выполнить уничтожение.

Класс TControl - определяет события, методы и свойства характерные всем видимым компонентам.
Наверное все вы видели свойства, которые не нуждаются в объяснении: Visible, Enabled, Align, ClientRect, Color, Font, Cursor и многие другие...
Один из наиболее интересных методов - метод Perform, который посылает указанное сообщение оконной процедуре WndProc элемента управления (в обход очереди Windows).
Также, класс TControl инкапсулирует основные события, которые может породить манипулятор "мышь".

Класс TWinControl - имеет особенность вводить во все производные классы оконный дескриптор (Window Handle). Стандартные оконные компоненты произведены именно от класса TWinControl. Классы, произведённые от TWinControl могут также принимать фокус ввода и могут являться родителями других элементов управления.

Свойства класса TWinControl:
  • Brush - Определяет цвет и стиль заполнения фона окна.
  • ClientOrigin - Экранные координаты левого верхнего угла клиентской области компонента.
  • ClientRect - Размер клиентской области компонента.
  • ControlCount - Число дочерних компонентов данного оконного элемента.
  • Controls - Массив дочерних компонентов оконного элемента.
  • Ctl3D - Определяет, будет ли компонент выглядеть объемным или плоским.
  • Handle - Оконный дескриптор.
  • HelpContext - Номер контекстно-зависимой встроенной справки.
  • ParentWindow - Дескриптор родительского окна, не являющегося визуальным компонентом.
  • ParentCtl3D - Управляет наследованием родительского свойства Ctl3D.
  • Showing - Определяет, виден ли компонент в данный момент.
  • TabOrder - Указывает позицию компонента в последовательности табуляции.
  • TabStop - Определяет, может ли пользователь перевести фокус на компонент клавишей табуляции.
  • WindowHandle - Аналог Handle, имеющий возможность изменения.

Методы класса TWinControl:
  • CanFocus - Определяет, может ли компонент получать фокус, то есть получать сообщения пользователя.
  • ContainsControl - Определяет, является ли указанный компонент прямым или косвенным наследником данного оконного элемента.
  • ControlAtPos - Возвращает ссылку на потомка, расположенного в заданных координатах
  • FindNextControl - Возвращает очередной оконный компонент в последовательности табуляции.
  • Focused - Определяет, находится ли оконный элемент в фокусе.
  • GetTabOrderList - Строит список дочерних компонентов в последовательности табуляции.
  • HandleAllocated - Проверяет наличие дескриптора окна компонента.
  • HandleNeeded -Создает дескриптор окна, если он до этого не существовал.
  • Invalidate - Сообщает о необходимости перерисовки компонентов.
  • Realign - Выравнивает компоненты в оконном элементе.
  • Repaint - Перерисовывает изображение компонента на экране с помощью Invalidate.
  • ScaleBy - Масштабирует оконный элемент и все содержащиеся в нем компоненты.
  • ScaleControls - Изменяет масштаб компонентов в оконном элементе, не изменяя масштаба самого оконного элемента.
  • ScrollBy - Сдвигает содержимое оконного элемента.
  • SelectFirst - Передает фокус первому дочернему компоненту.
  • SelectNext - Передает фокус следующему компоненту.
  • SetBounds - Одновременно устанавливает положение и размера компонента (Left, Top, Width, Height). Раздельное изменение менее эффективно, т.к. всякий раз вызывает перерисовку.
  • SetChildOrder - Изменяет позицию компонента в списке дочерних компонентов.
  • SetFocus - Передает фокус элементу (активизирует его).
  • SetZOrder - Перемещает компонент вверх или вниз относительно других компонентов.
  • Update - Немедленная перерисовка компонента.

Специальные методы класса TWinControl:
  • CreateWnd - Создаёт окно.
  • DestroyWnd - Уничтожает окно.
  • CreateWindowHandle - Создаёт оконный дескриптор.
  • DestroyWindowHandle - Уничтожает оконный дескриптор.
  • CreateParams - Инициализирует значения оконных параметров. Перегрузка метода позволяет менять параметры окна, установленные по умолчанию.

Класс TCustomControl - класс, производный от TWinControl. Его можно рассматривать как "строительную площадку" для создания компонентов, соответствующих оригинальным требованиям пользователя. Данный класс предоставляет полотно для рисования (класс TCanvas) и виртуальный метод Paint, перегрузка которого позволит отображать компоненты так, как вы пожелаете.
Будучи оконным элементом управления, TCustomControl может принимать фокус ввода.

Класс TGraphicControl - предназначен для создания визуальных компонентов, которые не являются окнами, т.е. не могут содержать в себе других компонентов и не могут получать фокус ввода. Главное предназначение данного класса - способность отображать графику или текст на компоненте. Класс TGraphicControl также передает своим потомкам свойство Сanvas. Виртуальный метод Paint вызывается в ответ на сообщение WM_PAINT, принимаемое родительским элементом управления. Класс TGraphicControl не пользуется системными ресурсами Windows, т.к. не требует оконного дескриптора. Методы рисования исполняются немного быстрее за счёт того, что перерисовка компонента не связана с диспетчеризацией Windows-сообщений, а реализуется процессом, заложенным в родителе данного элемента.



  • 1.4. Типы компонентов.

Все компоненты являются прямыми или косвенными потомками класса TComponent. Большинство компонентнов представляют собой элементы управления интерфейсом с пользователем. Компоненты никогда не размещаются в стеке! Размещаются только в куче (heap), с помощью оператора new.

Стандартные компоненты - инкапсулируют типовые управляющие элементы ОС Windows. Любой компонент из вкладки Standart ведёт себя точно также, как соответствующий родительский Windows-элемент (VCL добавляет оболочку, позволяющую изменять внешний вид)

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

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

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

Контейнерные компоненты - компоненты, которые могут владеть другими компонента или выступать в роли их родителя. Владелец в этом случае будет ответственным за освобождение памяти. При динамическом создании компонента конструктору, в качестве параметра, передаётся владелец.
Для того, чтобы компонент отобразился на форме ему необходимо назначить родителя, ответственного за его прорисовку (свойство Parent)
Для примера, динамически создадим объект класса TPanel и отдадим объект класса TButton во владение:
C++
1
2
3
4
TPanel *Panel = new TPanel(this);
Panel->Parent = this;
TButton *Button = new TButton(Panel);
Button->Parent = Panel;
Таким образом, мы видим, что Panel выступает контейнером для Button и отвечает за отображение и автоматическое уничтожение последнего.



2. Практическая часть. Регистрация VCL-компонентов в RAD Studio
  • 2.1. Загрузка исходных кодов из репозитория.


В практической части я расскажу вам о том, как установить VCL-компоненты в RAD Studio.
Для примера, я возьму компоненты Indy, которые поставляются с открытым исходным кодом.
Как известно, компоненты Indy поставляются с IDE в "стандартном наборе". Однако, их разработка не стоит на месте, и нам может потребоваться более актуальная версия.

Значит, первым делом нам необходимо удалить их из состава IDE. Открываем RAD Studio и переходим к Component -> Install Packages ...
Находим пакеты, поставляемые Indy (обычно это Indy Core и Indy Protocols). Снимаем с них пометки, после чего удаляем с помощью кнопки Remove. Таким образом, мы удалили пакет из IDE. Также, исключим пути к старым файлам. Для этого откроем Tools -> Options -> Environment Options -> Delphi Options -> Library -Win32 и удалим все пути, в которых упоминается слово Indy.

Теперь необходимо удалить исходные коды и библиотеки.

Закрываем RAD Studio и переходим в папку, в которую она была установлена.
По умолчанию, RAD Studio 2010 устанавливается в папку: C:\Program Files\Embarcadero\RAD Studio\7.0.
Для того, чтобы больше не останавливаться на этом пути, обозначим его переменной RS.

В папке RS\Sources\Indy находятся исходные коды Indy. Удаляем эту папку.
В папке RS\Include\Indy могут находится заголовочные файлы Indy. Удаляем эту папку.
В папке RS\Lib находятся библиотеки Indy. Удаляем все файлы, которые принадлежат к Indy (для этого выполним поиск по файлам, содержащим в себе фразу "Indy")

Как правило, в папке RS\.. лежат также файлы справки, примеры и др. файлы, связанные с Indy.
Если хотите, можете удалить и их (но не увлекайтесь, мы удаляем только Indy)

Вот мы и удалили старые версии. Пора обзавестись новыми.
Репозиторий Indy расположен по адресу: https://svn.atozed.com:444/svn/Indy10/
Для доступа будет использовать публичное имя пользователя: Indy-Public-RO
Пароль не нужен.

Перед нами стоит задача скачать всё содержимое папок. Для этого советую воспользоваться бесплатным SVN клиентом TortoiseSVN:
Visual Component Library: Вид изнутри, удаление и установка компонентов

Указываем ссылку на репозиторий и папку, в которую будем скачивать Indy (для этих целей я использовал ту папку, в которую установлена RAD Studio):
Visual Component Library: Вид изнутри, удаление и установка компонентов

Ждём завершения процесса закачки.

  • 2.2. Подготовка проектной группы.


После завершения начинается самое интересное...
Компоненты Indy написаны для использования в Delphi. Но это не значит, что мы не воспользуемся ими в С++ Builder.
Итак, открываем RAD Studio (именно её, если планируется пользование компонентами и в С++ Builder). Если был открыт проект по умолчанию - его нужно закрыть.
Папку, куда мы экспортировали репозиторий Indy назовём переменной RIndy
Переходим к Tools -> Options -> Environment Options -> Delphi Options -> Library -Win32 и в Library Path добавляем 3 пути:
  • RIndy\Branches\Tiburon\Lib\System
  • RIndy\Branches\Tiburon\Lib\Core
  • RIndy\Branches\Tiburon\Lib\Protocols

Добавим в проектную группу те файлы, которые нам понадобятся для установки. Для этого просто откроем файлы в следующей последовательности:
  • IndySystemX0.dpk
  • IndyCoreX0.dpk
  • IndyProtocolsX0.dpk
  • dclIndyCoreX0.dpk
  • dclIndyProtocolsX0.dpk

X - Версия вашей RAD Studio (для 2010 - это число 14).

Для того, чтобы компонентами можно было воспользоваться в С++ Builder перейдём в свойства проекта каждого из пяти добавленных пакетов: Project -> Options -> Delphi Compiler -> Linking -> Linker Output и выберем опцию Generate all C++ Builder files (including package libs).
Сохраним проектную группу (для того, чтобы в случае неудачи не повторять одни и те же действия).



  • 2.3. Установка пакетов.


Осталось выполнить компиляцию и установку.
Для первых трёх пакетов (IndySystemX0.dpk, IndyCoreX0.dpk, IndyProtocolsX0.dpk) выполняем: Project -> Compile.
Для оставшихся двух (dclIndyCoreX0.dpk, dclIndyProtocolsX0.dpk) выполняем: Install.
Visual Component Library: Вид изнутри, удаление и установка компонентов

Если всё выполнено правильно, то будет выведено сообщение о том, что компоненты были установлены.

Примечание 1: При первом запуске приложения с новыми компонентами, IDE возможно запросит путь к заголовочным файлам и выведет вам окно поиска. Для Indy укажите: RIndy\Branches\Tiburon\Lib\Core

Примечание 2: В случае, когда компилятор по неизвестной причине не сгенерировал какой-либо *.hpp или *.dcu файл, получить его можно вручную. Для этого, в командной строке необходимо перейти в каталог с файлом (либо указать абсолютный путь) и выполнить следующую команду (пример для файла IdStruct.pas):
Код
dcc32 -JPHNE IdStruct.pas
3. Заключение.

Данная статья позволит Вам узнать внутреннее устройство библиотеки визуальных компонентов, познакомится с иерархией основных классов в VCL, научиться различать типы компонентов.
Также, Вы научитесь удалять и устанавливать компоненты. Полезным окажется возможность использования компонентов, предназначенных для Delphi в среде С++ Builder.


_________________________________________________
С уважением, Михаил (a.k.a MikeSoft)
28
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2010, 00:56
Ответы с готовыми решениями:

Установка компонентов на форму в С++ Builder
Здравствуйте. Прошу помощи с установкой компонентов на форму в С++ Builder 6....

Установка компонентов для Delphi на С++ Builder
Как проавильно устанавливать компоненты для делфи на С++ билдер? Вот я не...

Установка сторонних компонентов на Embarcadero XE4
Доброго всем дня! Подскажите, никак не могу разобраться как устанавливать...

Динамическое удаление компонентов
Господа, доброго времени суток. Имеется форма, на которой динамически...

Удаление компонентов динамически
такая проблема. Объявляю глобально переменные. TStringGrid *StringGrid1;...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2010, 00:56

Удаление динамически-созданных компонентов
Использую класс, компонентами которого кроме всего прочего, являются StaticText...

Создание и удаление компонентов в коде
Создаю форму с 16 кнопками. Кнопки создаю из кода , а не спомощью графического...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru