Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3

Добавить поле в класс TMenuItem

18.09.2014, 12:21. Показов 2098. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В класс, TMenuItem добавил параметр "SelectIndex"....для того что бы нумеровать динамически пополняемый TPopupMenu.

C
1
2
3
4
5
6
7
 for(int i =0; i<10;i++)
   {
       TMenuItem* mi = new TMenuItem( Form3 );
        mi->Caption = "New"+ IntToStr(i);
        mi->SelectIndex=i;
        PopupMenu1->Items->Add( mi );
   }
но вот проблема, с добавлением параметра "SelectIndex"...программа при закрытии выдает ошибку,а так же если хочу очистить TPopupMenu.

Так добавляю параметр (думаю что что то не верно делаю)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class DELPHICLASS TMenu;
class PASCALIMPLEMENTATION TMenuItem : public System::Classes::TComponent
{
    typedef System::Classes::TComponent inherited;
    
public:
    TMenuItem* operator[](int Index) { return Items[Index]; }
    
private:
    System::UnicodeString FCaption;
...........
    void __fastcall SetAutoLineReduction(const TMenuItemAutoFlag Value);
    int FSelectIndex;    // <----------------------------------------------------ВОТ ОПРЕДЕЛИЛ
 
protected:
...........
    
public:
...........
    __property int SelectIndex= { read=FSelectIndex, write=FSelectIndex };  // <----------------------------------------------------ВОТ ОПРЕДЕЛИЛ
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.09.2014, 12:21
Ответы с готовыми решениями:

Проблема с TMenuItem
ку всем проблема с TMenuItem, вообщем вместо строки при выборе получаю крокозябру... пример допустим попменю содержит такие строки ...

TMenuItem - размеры, цвет и шрифт
Друзья, доброго дня. Подскажите по TMenuItem Я крашу и увеличиваю шрифт и фон в одном пункте меню void __fastcall...

Как узнать что выбран пункт меню TMenuItem в С++ Builder 2010?
Здравствуйте! Нужно узнать что пользователь нажал на определенный пункт меню. На форме есть компонент MainMenu. В нем есть подпункты...

19
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
18.09.2014, 12:31
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Никогда больше так не делай, не лазь в VCL. Все, что может понадобиться - это написать простейший перехватчик:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Перед классом формы:
namespace MenuItem_SelectIndex
{
    class TMenuItem : public Menus::TMenuItem
    {
    private:
        int FSelectIndex;
    public:
        __fastcall virtual TMenuItem(System::Classes::TComponent* AOwner)
            : Menus::TMenuItem(AOwner)
        {
        }
        __property int SelectIndex= { read=FSelectIndex, write=FSelectIndex };
    };
}
#define TMenuItem MenuItem_SelectIndex::TMenuItem
 
// Дальше твоя форма, без изменений ...
class TForm1 : public TForm
// ...
Если этот функционал нужен в нескольких формах - то вынеси namespace (вместе с #define-ом) в отдельный hpp-файл, и приInclude его перед каждой формой, где необходимо измененное поведение...

Проверено, при использовании этого перехватчика никаких ошибок при закрытии приложения не возникает...
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 12:41  [ТС]
Дай Бог здоровичка!!!!!!
0
18.09.2014, 16:14

Не по теме:

А там что свойства Tag разве нет?

0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 16:18  [ТС]
а можно еще аналогичный пример для класса TTreeNode...из которого строятся ветки компонента TreeView....не получается сделать для него точно такой же перехватчик

Добавлено через 41 секунду
Цитата Сообщение от Avazart Посмотреть сообщение
Tag
возвращает всегда 0 почум то
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 16:19
Цитата Сообщение от Dinkin Посмотреть сообщение
возвращает всегда 0 почум то
Какой установишь такой и будет возвращать.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
18.09.2014, 16:27
Цитата Сообщение от Avazart Посмотреть сообщение
А там что свойства Tag разве нет?
Есть, и что? Ты думаешь, один такой умный, и кроме тебя его никто и никогда не может использовать? Молодой еще, не встречался с чересчур умными компонентописателями, которые думают также, как ты, что только они имеют право на использование Tag-а. А вот с FSelectIndex я гарантирую, что никто, кроме меня, его не изменит никогда... Для наляпанных на коленке программ можно и Tag-ом, но только тогда надо сразу в заголовке давать тег "[говнокод приветствуется]"
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 16:32  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Какой установишь такой и будет возвращать.
Спасибо, это тоже как вариант...но натолкнулся на этом же форуме что с ним бывают проблемы


Но для TreeView такого параметра нет как я понял
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 16:38
Цитата Сообщение от Dinkin Посмотреть сообщение
Спасибо, это тоже как вариант...но натолкнулся на этом же форуме что с ним бывают проблемы
Первый раз слышу...

Добавлено через 1 минуту
Цитата Сообщение от Dinkin Посмотреть сообщение
Но для TreeView такого параметра нет как я понял
А зачем он TreeView ? Там вроде свой ->Selected[index] возвращающий выделенный нод
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 16:44  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем он TreeView ? Там вроде свой ->Selected[index] возвращающий выделенный нод
Задача стоит для каждого нода сделать дополнительный эдинтификатор, который периодически можно будет в ручную менять
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 16:51
В нодах там вроде есть указатель на TObject* или void* не помню точно, его можно использовать, но возможно даже Tag есть.

Добавлено через 5 минут
Кстати если ноды создаются динамически, то без проблем можно прибегнуть к обычному наследованию.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 16:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
В нодах там вроде есть указатель на
Действительно есть некий OverlayIndex...тест показал что возвращает то что нужно
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 16:59
Я имел ввиду
C++
1
TreeView1->Items->AddChildObject();
http://docwiki.embarcadero.com... hildObject
И
C++
1
2
TTreeNode* Node;
/* ...= */Node->Data;
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 17:02  [ТС]
тогда непонятно для чего OverlayIndex
По суте переводится как раз как накладной индекс
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 17:05
http://docwiki.embarcadero.com... erlayIndex
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 17:10  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
/Node->Data;
только не понятно как к этому можно подцепить дополнительный - свой индекс
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 17:21
Цитата Сообщение от Dinkin Посмотреть сообщение
только не понятно как к этому можно подцепить дополнительный - свой индекс
Ну можно грубо использовать каст указателя к int и обратно предполагая что sizeof(int)<=sizeof(void*), а можно создать свой класс который будет хранить int SomeIndex и если надо еще какие либо поля, и присваивать указатель на его объект Data и обратно главное не забыть что ресурсы нужно чистить.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 17:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
а можно создать свой класс который будет хранить int SomeIndex
Самое оптимальное на мой взгляд, но вот почему то с нодами ка то все сложно,не добавляются доп параметры
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.09.2014, 17:29
Добавлено через 20 секунд
Цитата Сообщение от Dinkin Посмотреть сообщение
Самое оптимальное на мой взгляд,
Я делал наследованием от TTreeNode как-то, по-моему это самое оптимальное, хотя опять каст нужен будет.

Цитата Сообщение от Dinkin Посмотреть сообщение
Самое оптимальное на мой взгляд, но вот почему то с нодами ка то все сложно,не добавляются доп параметры
Потому что VCL, а не Qt ...
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
18.09.2014, 18:08  [ТС]
Не знаю на сколько правильно и не будет ли с этим в будущем проблем. Принудительно Data делаю в int, и как бы тоже работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2014, 18:08
Помогаю со студенческими работами здесь

Можно ли в TStringList добавить дополнительное поле?
Можно ли к каждой строке данного класса приставить дополнительный параметр, а еще лучше массив?

Как добавить поле?
ALTER TABLE 'As' ADD 'Bolleb' 'bool' Почему мой код не работает? Добавлено через 10 минут Пишет ошибка синтаксиса при определении...

Добавить в существующую таблицу новое поле
Привет всем. Есть программа, работающая с БД MS Access. Юзаю ADOTable. Вопрос: можно ли программно добавлять поля (столбцы) к имеющейся...

Программно добавить вычисляемое поле в DBGrid
Есть БД(Paradox), TTable, TDataSource и TDBGrid. БД к таблице подключается программно (через сессию). И вот возникла нужда добавить...

В класс В добавить поле-массив
Помогите пожалуйста! Нужно в класс В добавить поле-массив. Разработать конструктор для инициализации массива, который при своем вызове...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru