Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как изменить свойство Checked у RadioButton, не вызывая при этом обработчик OnClick 
V
    Опции темы
Нитонисе
Дата 12.8.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

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



Вопрос в названии темы вобщем-то. Надо изменить выбранный элемент в группе переключателей RadioButton. Выполняя это таким способом:
Код

RadioButton1->Checked = true;

автоматически вызывается обработчик OnClick. Как этого избежать?
PM MAIL   Вверх
mes
Дата 12.8.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



решение в лоб: запомнить и обнулить обработчик, изменить свойство, востановить обработчик..
если конечно нет свойства типа DisableClick(), тогда заморачиватьсяне надо..


Это сообщение отредактировал(а) mes - 12.8.2012, 15:06


--------------------
PM MAIL WWW   Вверх
volvo877
Дата 12.8.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



Код

RadioButton1->Perform(BM_SETCHECK, 1, 0);


Этому багу сто лет уже, и править его не хотят. "Обратная совместимость", видите ли, на это глючное поведение завязано много тысяч строк кода.

Это сообщение отредактировал(а) volvo877 - 12.8.2012, 15:12
PM MAIL   Вверх
Нитонисе
Дата 12.8.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

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



volvo877, ваш код не переключает кнопки.

Добавлено через 9 минут и 43 секунды
Вот нашел немного извратный способ.
Код

TNotifyEvent cl = RadioButton1->OnClick;
RadioButton1->OnClick = NULL;
RadioButton1>Checked = true;
RadioButton1->OnClick = cl;

Работает, пока буду это использовать...
PM MAIL   Вверх
artsb
Дата 12.8.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Нитонисе @  12.8.2012,  15:20 Найти цитируемый пост)
Вот нашел немного извратный способ.

Вам тоже самое mes посоветовал.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 12.8.2012, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

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



Цитата(artsb @  12.8.2012,  19:22 Найти цитируемый пост)
Вам тоже самое mes посоветовал.

Да, точно. Я просто без кода как-то не воспринял его реплику smile
PM MAIL   Вверх
wolver17
Дата 5.6.2016, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.5.2011

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



Цитата(Нитонисе @ 12.8.2012,  15:20)
volvo877, ваш код не переключает кнопки.

Добавлено @ 15:30
Вот нашел немного извратный способ.
Код

TNotifyEvent cl = RadioButton1->OnClick;
RadioButton1->OnClick = NULL;
RadioButton1>Checked = true;
RadioButton1->OnClick = cl;

Работает, пока буду это использовать...

На самом деле всё гораздо проще. У меня тоже возникла потребность в снятии Checked с RadioButton (он открывал новую форму, а в её методе OnClose() висело FormShow() исходной формы, и когда возвращалось управление этой форме - дебаг прыгал на FormActivate, после которого checked выбранного радиобаттона срабатывал, даже с добавлением этого кода, что вы привели).
Вся проблема в том, что когда вы снимаете checked, у Radiobutton остаётся фокус нажатия, поэтому нужно снимать и его:
Код

    TNotifyEvent cl = Form1->RadioButton1->OnClick;
    Form1->RadioButton1->OnClick = NULL;
    Form1->RadioButton1->Checked = false;                //принудительное снятие выбора с радиобаттон в обход OnClick
    Form1->RadioButton1->OnClick = cl;
    Form1->DefocusControl(Form1->RadioButton1, 0);  //снятие фокуса


или что ещё проще, т.к. дебаг показывает аналогичное поведение, а кода меньше:
Код

    Form1->RadioButton1->Checked = false;
    Form1->DefocusControl(Form1->RadioButton1, 0);

 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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