Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 137, средняя оценка - 4.70
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
#1

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

30.07.2010, 00:56. Просмотров 18463. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Visual Component Library: Вид изнутри, удаление и установка компонентов (C++ Builder):

Установка компонентов на форму в С++ Builder - C++ Builder
Здравствуйте. Прошу помощи с установкой компонентов на форму в С++ Builder 6. Никак не получается, даже по инструкции (...

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

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

Удаление компонентов динамически - C++ Builder
такая проблема. Объявляю глобально переменные. TStringGrid *StringGrid1; TPageControl *PageControl1; TTabSheet *TabSheet1; ...

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

Удаление динамически-созданных компонентов - C++ Builder
Использую класс, компонентами которого кроме всего прочего, являются StaticText и Edit, графическое изображение. Создаю экземпляр класса...

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

Динамическое создание и удаление компонентов. - C++ Builder
Понадобилось динамическое создание нескольких компонентов, при нажатии на кнопку. Несколько нажатий - несколько раз создаются компоненты....

Установка дополнительных компонентов (RAD Studio XE5 C++ Builder) - C++ Builder
Установил EhLib компоненты без проблем. Но при компиляции нового проекта с этими компонентами просит указать путь. если поставить...

Компактная установка Visual Studio с минимальным набором компонентов - Visual Studio
Добрый день. Мне нужно на планшет на 8.1 поставить VS. Потому, что носить весь день с собой ноут, что бы сдать 1 лабу не удобно, но...

Установка/удаление Microsoft Visual C++ 2005 - Windows 7
Всем привет! Не могу установить или удалить данные пакеты, вылезает ошибка типа: Знаю, что в папке Windows или в той степи лежат...


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

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

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