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

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

25.04.2012, 19:04. Показов 7744. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru