Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/373: Рейтинг темы: голосов - 373, средняя оценка - 4.69
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540

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

30.07.2010, 00:56. Показов 80437. Ответов 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:



Класс 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:

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

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

  • 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.

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

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

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

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


________________________________________ _________
С уважением, Михаил (a.k.a MikeSoft)
29
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2010, 00:56
Ответы с готовыми решениями:

Установка компонентов Visual Studio
Кто знает, какие компоненты Visual Studio необходимо установить, чтобы в меню "Новый проект" появилось приложение Windows Forms?

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2010, 00:56
Помогаю со студенческими работами здесь

Удаление класса изнутри
Завершается все корректно. Но насколько безопасна такая конструкция? class A { public: A(){} void func(){ delete this; } ...

Создание компонентов windows control library в VS 2015
Всем привет. Вот пытаюсь создать свой компонент под C# на VS 2015. Делаю по книге "C#. Разработка компонентов в MS Visual Studio...

Установка Xpages Extension Library
Всем привет! Хотел установить XPages Extension Library. В инструкции указано, что необходимо установить IBM Lotus Notes and Domino V8.5.3...

Установка Extension Library На Client 8.5.2
Как установить Extension Library на ноутсовский клиент (без дизайнера)? У меня в настройках клинта нет пункта Domino Designer. ...

Visual c++Runtime Library
При разработке спокойно отлаживал программу в дебаг-версии, спокойно компилировалась и запускалась. Но как-то раз пересобрал проект и...


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

Или воспользуйтесь поиском по форуму:
1
Закрытая тема Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru