Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не изменяется PopupMenu, в run-time 
V
    Опции темы
ksili
Дата 2.4.2007, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Не могу изменить состояние итемов всплывающего меню во время работы программы. Пытаюсь сделать неактивным/активным или выдимым/невидимым. Свойства вроде меняются , но на внешнем виде это никак не отображается. В хелпе вычитал, что для изменения структуры меню или каких-то его свойств надо использовать событие OnChange. Вот его описание:
Код

Occurs when the menu changes.

typedef void __fastcall (__closure *TMenuChangeEvent)(System::TObject* Sender, TMenuItem* Source, bool Rebuild);
__property TMenuChangeEvent OnChange = {read=FOnChange, write=FOnChange};

Description

Write an OnChange event handler to respond to changes in the menu’s structure. OnChange occurs when the menu is loaded into memory, and in response to property changes that affect the menu’s structure.

The Sender parameter is the menu that changed. The Source parameter indicates the menu item (if any) whose properties changed. Rebuild indicates whether the menu will be rebuilt to reflect the change (for example when items are added or deleted).

Попробовал так:

Код

void __fastcall TForm1::PopupMenu2Popup(TObject *Sender)
{
 if(All_chnls->chnls[JvMainGrid->Row-1].started)
    {
     PopupMenu2->Items[0].Enabled = false;
     PopupMenu2->Items[1].Enabled = true;
    }
 else
    {
     PopupMenu2->Items[0].Enabled = true;
     PopupMenu2->Items[1].Enabled = false;
    }
 PopupMenu2Change(Sender,&PopupMenu2->Items[0],true);
 PopupMenu2Change(Sender,&PopupMenu2->Items[1],true);
}

Но ругается, что надо определить функцию PopupMenu2Change. Что там писать, я не понимаю. Я ведь и так уже всё сделал в OnPopup. А OnChange я думал просто перестроит меню.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ama_kid
Дата 2.4.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Чо-та у меня ощущение, что ты сильно накручиваешь ненужное...
Проверь так: брось на форму StringGrid, Button и PopupMenu. Меню привяжи к соответствующим свойствам грида и кнопки и добавь ему два пунтка "Действия для кнопки", "Действия для таблицы". В обработчике OnPopUp напиши:
Код

void __fastcall TForm1::PopupMenu1Popup(TObject *Sender)
{
    if (((TPopupMenu *)Sender)->PopupComponent->ClassName().operator AnsiString()=="TStringGrid")
    {
        ((TPopupMenu *)Sender)->Items[1].Enabled=false;
        ((TPopupMenu *)Sender)->Items[2].Enabled=true;
    } else
    if (((TPopupMenu *)Sender)->PopupComponent->ClassName().operator AnsiString()=="TButton")
    {
        ((TPopupMenu *)Sender)->Items[1].Enabled=true;
        ((TPopupMenu *)Sender)->Items[2].Enabled=false;
    }
}
при вызове менюшки на кнопки и на гриде доступно будет тока соответствующее действие. У меня все работает. Сравни, что у тебя не так \


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ksili
Дата 2.4.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Попробовал. Та же проблема - все пункты меню остаются активными. При этом на первом щелчке по таблице выскакивает исключение, типа обращаюсь к нулевому адресу, со второго щелчка всё нормально.
Использую BCB6. 

И ещё - итемы вроде с нуля должны нумероваться, а не с единицы. Пробовал и так, и так - одинаково.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ama_kid
Дата 2.4.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Хм... странно... Это работает и в Дельфи 7 (современник BCB6) и в Turbo C++ Builder (Developer Studio). Я прикреплю на всякий случай тестовые исходники c откомпилированным файлом, проверь еще раз. Если все так же - тогда я могу пенять только на 6-й билдер. К сожалению, под рукой BCB6 нету... :(
Цитата
И ещё - итемы вроде с нуля должны нумероваться, а не с единицы. Пробовал и так, и так - одинаково.
А вот я при нумерации с 0 получал, что один из итемов не работал, к сожалению, не нашел в хелпе, из-за чего так, возможно в 0-м итеме хранится какая-то информация (возможно, скрытый пункт меню)

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  ForKsili.rar 41,96 Kb


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ksili
Дата 2.4.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Проверил. Исходники сходятся с моими один к одному. Исполняемый файл проверить не смог, так как нету нужной библиотеки vcl100.
Скорее всего косяк с менюшками из-за Билдера. Ладно, в принципе, для моей программы это не критично.
Спасибо.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Vyacheslav
Дата 2.4.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(ksili @  2.4.2007,  12:22 Найти цитируемый пост)
Скорее всего косяк с менюшками из-за Билдера

Бедный Билдер. Все валим на него.
 А у Билдера в данном случае все впорядке. Вот такой простейший  обработчик поочередно дисейблит одно  из двух пунктов меню. Так что ищите ощибку у себя
Код

void __fastcall TForm1::PopupMenu1Popup(TObject *Sender)
{
         MenuItem1->Enabled = ! MenuItem1->Enabled;
         MenuItem2->Enabled = ! MenuItem1->Enabled;
}

 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
ksili
Дата 3.4.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Действительно, такой код работает. Тогда возникает вопрос, почему такой код работает:
Код

MenuItem1->Enabled = false;

а такой нет:
Код

PopupMenu2->Items[0].Enabled = false;

Или Items содержит не MenuItem'ы? Я кстати проверял caption'ы пунктов меню так:
Код

PopupMenu2->Items[0].Caption
PopupMenu2->Items[1].Caption
PopupMenu2->Items[2].Caption
PopupMenu2->Items[3].Caption
...

Так вот они оказались почему-то или "", или NULL, хотя названия конечно были. Получается свойство Items вообще непонятно для чего


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Vyacheslav
Дата 4.4.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(ksili @  3.4.2007,  07:22 Найти цитируемый пост)
а такой нет:

И не должен smile
Работает такой
Код

PopupMenu2->Items->Items[0]->Enabled = false;


Код

void __fastcall TForm1::PopupMenu1Popup(TObject *Sender)
{
         if (TPopupMenu* menu = dynamic_cast<TPopupMenu*>(Sender)) {

            menu->Items->Items[0]->Enabled = !  menu->Items->Items[0]->Enabled;
            menu->Items->Items[1]->Enabled = !menu->Items->Items[0]->Enabled; 
        }
}


Добавлено через 2 минуты и 4 секунды
Цитата(ksili @  3.4.2007,  07:22 Найти цитируемый пост)
Так вот они оказались почему-то или "", или NULL, хотя названия конечно были. Получается свойство Items вообще непонятно для чего 

А так ? smile
Код

PopupMenu2->Items->Items[0]->Caption
PopupMenu2->Items->Items[1]->Caption
PopupMenu2->Items->Items[2]->Caption
PopupMenu2->Items->Items[3]->Caption



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.