Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как изменить свойство Checked у RadioButton


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

RadioButton1->Checked = true;

автоматически вызывается обработчик OnClick. Как этого избежать?

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

Автор: volvo877 12.8.2012, 15:09
Код

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


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

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

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

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

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

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

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

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

Да, точно. Я просто без кода как-то не воспринял его реплику smile

Автор: wolver17 5.6.2016, 15:12
Цитата(Нитонисе @ 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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)