Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 22.07.2017
Сообщений: 121
1
RAD 2009-XE3

Создание собственного VCL компонента. Динамическое изменение количества колонок в зависимости от размера объекта

13.10.2018, 23:36. Показов 1221. Ответов 4
Метки нет (Все метки)

Доброго времени суток всем. Решил при создании своего компонента на основе TStringGrid инкапсулировать в него ряд свойств.
Хочется реализовать следующие вещи:
  1. Выравнивание текста по центру ячейки
  2. Добавить свойство ячейки, отвечающее за её цвет
  3. Изменение количества строк таблицы в зависимости от её высоты

Первые два пункта я могу реализовать при работе со стандартным TStringGrid, прописывая перерисовку ячейки внутри OnDrawCell.
Третий пункт тоже можно реализовать при работе с TStringGrid, но как его инкапсулировать в него? Наверное нужно создать функцию, которая реагирует на изменение размера компонента, но я в этом деле, к сожалению, не опытен, поэтому даже не могу понять с чего начать.
Третий пункт у меня в приоритете, но первые два я тоже не знаю как реализовать. Можно ли их как-то приставить к OnDrawCell при модификации компонента или как это лучше реализовать? Чтобы уже при работе с готовым компонентом такими вещами не заниматься.
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2018, 23:36
Ответы с готовыми решениями:

Динамическое изменение размера компонента
Добрый день. Имеются N компонентов shape (может быть любой, сути не меняет). Пробую изменить его...

Изменение локации объекта в зависимости от размера формы
Как изменить свойство объекта(button, picturebox и т. д.) - Location, в зависимости от изменения...

Создание VCL компонента - манометр
Всем привет! Реализую вышеописанный графический компонент. Решил наследовать от TCustomControl ...

создание редактора свойств vcl компонента
Доброго времени суток. Нужна помощь в создании свойства моего компонента: необходимо добавить...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
14.10.2018, 01:56 2
1 и 2 - достаточно переопределить метод DrawCell у грида. Для реализации третьей части - перегрузить у грида метод Resize и при его срабатывании (а сработает он при изменении размера) менять количество строк.

Добавлено через 1 минуту
Обязательно компонент писать? Класса-перехватчика не достаточно?
0
1 / 1 / 1
Регистрация: 22.07.2017
Сообщений: 121
14.10.2018, 14:29  [ТС] 3
volvo, да, идея с классом-перехватчиком звучит лучше. Ознакомился с вашим постом про них и у меня к сожалению не выходит задать класс TStringGrid:

C++
1
2
3
4
5
6
7
8
namespace MyStringGrid
{
    class TStringGrid : public Grids::TStringGrid // Не определёно Grids 
    {
            // Какая-то реализация. 
    };
};
#define TStringGrid MyStringGrid::TStringGrid
А на самом сайте embarcadero пишут, как я понял, что TStringGrid принадлежит TDrawGrid, но у меня так и не получилось подключить какой-либо модуль, который бы мог содержать Grids или TDrawGrid. Пробовал подключать vcl.h, но там голяк. На сайте embarcdero (http://docwiki.embarcadero.com... StringGrid) указано, что источником TStringGrid является Vcl.Grids.hpp, но данный модуль подключить не получается.

Плюс есть ещё один вопрос. У меня в проекте находятся два TStringGrid и выполняют они разные функции. Как задать, например, два класса перехватчика для каждого или задать класс-перехватчик для одного, но чтобы не мешался другому?

Добавлено через 17 минут
volvo, подключил Grids.hpp и всё заработало.

Добавлено через 24 минуты
volvo, попробовал переопределить метод DrawCell в перехватчике, но даже пробная закраска цвета ячеек в красный не выходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace MyStringGrid
{
    class TStringGrid : public Grids::TStringGrid
    {
        public:
            DYNAMIC void __fastcall Resize(void)
            {
                //
            }
 
            virtual void __fastcall DrawCell(int ACol, int ARow, TRect &Rect, TGridDrawState AState)
            {
                this->Canvas->Brush->Color = clRed;
                this->Canvas->FillRect(Rect);
            }
    };
}
#define TStringGrid MyStringGrid::TStringGrid
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
14.10.2018, 14:50 4
Лучший ответ Сообщение было отмечено Insomnia4ever как решение

Решение

Insomnia4ever, внимательно на прототип DrawCell посмотри (по ссылке, которую я привел) и добавь тот спецификатор const, который там есть, а у тебя его почему-то нет. И обращай внимание на подсказки компилятора, там все написано...
1
1 / 1 / 1
Регистрация: 22.07.2017
Сообщений: 121
14.10.2018, 16:07  [ТС] 5
volvo, большое спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2018, 16:07

Создание собственного компонента
Ребята, помогите разобраться плиз. Создаю собственный компонент: unit EditId; interface ...

Создание собственного компонента
Подскажите сайт, где подробно рассказывается о создании компонента, а то я сегодня по моему весь...

Создание собственного компонента
Доброго времени суток!!! Возникла идея создания собственного универсального компонента, у...

Создание собственного компонента
Создайте компонент FontCombo- комбинированный список для выбора шрифта.


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

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

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