Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427

Создание компонента

25.04.2012, 19:04. Показов 7716. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый вечер, форумчане!
Пошуршил по форуму, но так и не нашел полезной мне информации. Кто может описать от начала и до конца как создать и использовать свой компонент?
Мне нужен компонент на основе ComboBox, который в себе содержит список месяцов и время года. Соответственно, при выборе месяца время года меняется, пользователь его менять не может.
Вот что у меня получилось пока:
MonthBox.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//---------------------------------------------------------------------------
 
#ifndef MonthBoxH
#define MonthBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE MonthBox : public TComboBox
{
private:
        short FSeason;
protected:
        DYNAMIC void __fastcall Change();
public:
        __fastcall MonthBox(TComponent* Owner);
__published:
        __property short Season={read=FSeason};
        __property OnChange;
};
//---------------------------------------------------------------------------
#endif
MonthBox.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "MonthBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
 
static inline void ValidCtrCheck(MonthBox *)
{
        new MonthBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall MonthBox::MonthBox(TComponent* Owner)
        : TComboBox(Owner)
{
        FSeason=-1;
        Items->Add("Январь");
        Items->Add("Февраль");
        Items->Add("Март");
        Items->Add("Апрель");
        Items->Add("Май");
        Items->Add("Июнь");
        Items->Add("Июль");
        Items->Add("Август");
        Items->Add("Сентябрь");
        Items->Add("Октябрь");
        Items->Add("Ноябрь");
        Items->Add("Декабрь");
        Style=csDropDownList;
}
//---------------------------------------------------------------------------
void __fastcall MonthBox::Change()
{
        FSeason=ItemIndex<0?ItemIndex:ItemIndex%3;
        TComboBox::OnChange(NULL);
}
//---------------------------------------------------------------------------
namespace Monthbox
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(MonthBox)};
                 RegisterComponents("Standard", classes, 0);
        }
}
//---------------------------------------------------------------------------
Собственно, я не уверен, что будет обрабатываться OnChange и почему-то не могу поместить компонент на форму, т.к. Contol has no parrent window.
Подозреваю, что возможно неправильно его регистрирую (создаю пакет, добавляю компонент, компилю и устанавливаю).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2012, 19:04
Ответы с готовыми решениями:

Создание компонента
Здравствуйте. Создал свой компонент на основе Button. Нужно сделать так, чтобы отсчитывались секунды на нажатие по кнопке. Но дело в том...

Создание компонента
Вот прочитал две книги о компнентах. Теперь пишу свой. Нужно изменить форму так что бы местами была прозрачная, подобное есть в тмс паке,...

Создание компонента
Подскажите пожалуйста что может быть не так? Я создавала новый компонент) Подключала как в методичке было

10
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.04.2012, 19:16
смотрел эту тему: Разработка визуальных компонентов - компонент потомок TGraphicControl?
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
25.04.2012, 19:20  [ТС]
Да, смотрел, но пока не помогло.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.04.2012, 19:29
уверен, что не смотрел архивы.
потому что не хватает в вашем коде следующего:
C++
1
2
3
4
5
6
__fastcall MonthBox::MonthBox(TComponent* Owner)
        : TComboBox(Owner)
{
     Parent = (TWinControl*)Owner;
    //....
}
1
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
25.04.2012, 19:39  [ТС]
Да, в архивы я не лазил, но и добавление предложенного кода Абсолютно никак не повлияло на результат работы.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.04.2012, 19:43
Цитата Сообщение от Iworb Посмотреть сообщение
Contol has no parrent window.
вышеприведенный код должен устранить эту ошибку, возможно билдер не перезапустил после компиляции
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
25.04.2012, 19:48  [ТС]
Да, спасибо, перезапуск помог =) Глупо вышло.
Теперь осталось разобраться как событие переопределить.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
25.04.2012, 21:26
Цитата Сообщение от Iworb Посмотреть сообщение
Теперь осталось разобраться как событие переопределить.
Если просто сменить перезапись события на указанное, то дублируете в паблише. А если речь о перехвате сообщений, смотрите в сторону Dispatch / макросов.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.04.2012, 21:34
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Если просто сменить перезапись события на указанное, то дублируете в паблише. А если речь о перехвате сообщений, смотрите в сторону Dispatch / макросов.
Можешь по-подробнее расписать?
Цитата Сообщение от Iworb Посмотреть сообщение
Теперь осталось разобраться как событие переопределить.
вообщем, вот.
в cpp добавить:
C++
1
2
3
4
5
void __fastcall MonthBox::Change(void)
{
        ShowMessage("hello from component"); // тут на свое изменить 
        TCustomCombo::Change(); // стандартный обработчик
}
а в h в protected:
C++
1
DYNAMIC void __fastcall Change(void);
Все стандартные события имеют соответствующие защищенные динамические методы, унаследованные от TControl, имена которых образованы от названия события без частицы "On". Например, события OnClick вызывают метод Click.

Как правило, вы сначала обращаетесь к наследованному методу, разрешая пользовательскому обработчику события произвести свои действия перед тем, как сработает код вашего переопределения. Предположим, вы пишете новую компоненту, в которой хотите модифицировать реакцию на щелчки мышью. Вместо того, чтобы присвоить соответствующий обработчик события OnClick, как это сделал бы прикладной программист, вы переопределяете защищенный метод Click

void _fastcall TMyControl::Click() {

// Стандартное обслуживание, включающая вызов обработчика

TWinControl::Click() ;

// Далее следует ваш код переопределения метода

}
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.04.2012, 22:15
Перетаскивание файлов на свой компонент
Здесь подобная проблема.
Т.е вы обращаетесь к Parent-у до того как он установлен.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.04.2012, 22:23
и если устал от теории, вот практический пример:__
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall MonthBox::Change()
{
        FSeason = ((ItemIndex+1) % 12)/3 ;
        TComboBox::Change(); // ñòàíäàðòíûé îáðàáîò÷èê
}
//---------------------------------------------------------------------------
void __fastcall MonthBox::SetSeason(short seas)
{
     if (seas >=0 && seas < 4) FSeason = seas;
}
и для MonthBox.h
C++
1
2
__published:
        __property short Season={ read=FSeason, write = SetSeason};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2012, 22:23
Помогаю со студенческими работами здесь

Создание компонента
Добрый день, создал свой компонент на основе имеджика, нужно сделать так, чтобы на нем была надпись. Как вариант - думаю динамически...

Создание компонента в C++ Builder
Ребята, у меня будет такой вопрос как сделать : На основе одного из базовых классов визуальных компонентов разработать собственный...

Создание компонента Timage
Необходимо создать компонент на основе Timage, со встроенными событиями. при OnMouseDown размеры уменьшались, а при OnMouseUp размер...

Создание визуального компонента
Всем доброго дня. Господа, нужна помощь в создании своего визуального компонента. В C++ Builder 10.3 сделал на основе TCGauge свой...

Динамическое создание компонента
Есть класс. В реализации одного метода динамически создается TabSheet, RichEdit. В другом методе необходимо непосредственно работать с...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru