1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

ЧекБоксы и госпожа Рекурсия

27.05.2012, 00:04. Показов 780. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, задача банальная. Есть ряд чекбоксов, при выбор одного из них остальные надо отключать.
Скрин приложен.

Привожу пример 2ух чекбоксов:

3ий чекбокс:
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
void __fastcall TForm2::CheckBox3Click(TObject *Sender)
{
        this->CheckBox1->Checked=false;
        this->CheckBox2->Checked=false;
        this->CheckBox4->Checked=false;
        this->CheckBox5->Checked=false;
        this->CheckBox6->Checked=false;
 
        //this->CheckBox3->Checked=true;
        if (this->CheckBox3->Checked==true)
        {
        this->Edit5->Enabled=true;
        this->Edit6->Enabled=true;
        this->Edit5->Text="Жанр";
        this->Edit6->Text="Автор";
        this->Edit5->SetFocus();
        }
        else
        {
        this->Edit5->Enabled=false;
        this->Edit6->Enabled=false;
        this->Edit5->Text="Жанр";
        this->Edit6->Text="Автор";
        }
}
4ый чекбокс:
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
void __fastcall TForm2::CheckBox4Click(TObject *Sender)
{
        this->CheckBox1->Checked=false;
        this->CheckBox2->Checked=false;
        this->CheckBox3->Checked=false;
        this->CheckBox5->Checked=false;
        this->CheckBox6->Checked=false;
 
        //this->CheckBox4->Checked=true;
        if (this->CheckBox4->Checked==true)
        {
        this->Edit7->Enabled=true;
        this->Edit8->Enabled=true;
        this->Edit7->Text="Издательство";
        this->Edit8->Text="Жанр";
        this->Edit7->SetFocus();
        }
        else
        {
        this->Edit7->Enabled=false;
        this->Edit8->Enabled=false;
        this->Edit7->Text="Издательство";
        this->Edit8->Text="Жанр";
        }
}
Итак, чем я недоволен: предположим изначально щелкнули на 3ий чекбокс. Он активирнулся, все ок. Теперь щелкаем на 4ый - по первому щелчку происходит:

C++
1
2
3
4
5
6
7
        this->CheckBox1->Checked=false;
        this->CheckBox2->Checked=false;
        this->CheckBox3->Checked=false; /* попадаем сюда, срабатывает
событие CheckBox3Click (т.к. CheckBox3 сейчас активен), в котором только 
что отмеченный CheckBox4 деактивируется*/
        this->CheckBox5->Checked=false;
        this->CheckBox6->Checked=false;
Ну и приходится щелкать еще раз - только после этого CheckBox4 активируется.

Вот как это победить? Если снять комменты:
C++
1
2
        //this->CheckBox3->Checked=true;
        //this->CheckBox4->Checked=true;
то по понятным причинам вылазит рекурсия и все зависает...

В общем, мозгов не хватает... Может флаг какой надо или условие... Не могу додумать
Миниатюры
ЧекБоксы и госпожа Рекурсия  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2012, 00:04
Ответы с готовыми решениями:

Чекбоксы для строк в выпадающем списке ComboBox
Собственно есть ли компонент или как его сделать, чтоб в выпадающем списке были чекбоксы?

Чекбоксы в DBGreadEH + Недостаточные сведения о столбце обновления
Доброго времени суток, уважаемые форумчане. Перейду сразу к делу. Использую компонент DBGreadEH для постановки галочек. Если использую...

чекбоксы
вообщем редакритую user.js и хочю сделать что-бы настройки пользователя хранились в локале...но вот столкнулся с такой проблемой..с помощью...

7
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.05.2012, 00:57
Используй радиоБатоны вместо чеков.Или напиши компонент наподобии TRadioGroup
1
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
27.05.2012, 00:59
я б добавил их в лист, присвоил все один обработчик, далее в цикле сравнение сендера с текущим элементом списка, если он знач ставим енейбл, если не он ставим дисейблд. ну это так, как то сомнительно звучит, но работает.
ну или сделай как сказал товарищ Avazart
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
27.05.2012, 01:19  [ТС]
Да с радио-то понятно, но хотелось как-то так оставить...

Добавлено через 4 минуты
Цитата Сообщение от Flyer Посмотреть сообщение
я б добавил их в лист
Чего-то сообразить не могу, а как их в лист добавить?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.05.2012, 01:26
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
std::vector<TCheckBox*> v;
//---------------------------------------------------------------------------
bool post_check;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
post_check=false;
v.push_back(CheckBox1);
v.push_back(CheckBox2);
v.push_back(CheckBox3);
v.push_back(CheckBox4);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)// Общее событие для всех чеков
{
if(!post_check)
 {
 post_check= true;
 for(unsigned i=0;i<v.size();i++)
   if(v[i]!= Sender)  v[i]->Checked=false;
 post_check= false;
 }
}
//---------------------------------------------------------------------------
2
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
27.05.2012, 01:31  [ТС]
Avazart, где вы такие мозги берете...
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
27.05.2012, 01:35
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// где то сначала
TList *List = new TList;
 
List->Add(CheckBox1);
List->Add(CheckBox2);
List->Add(CheckBox3);
List->Add(CheckBox4);
 
//на нужном ивенте
 
    if (((TCheckBox*)Sender)->Name == ((TCheckBox*)List->Items[i])->Name) {
 
            ((TCheckBox *)Sender)->Enabled=true;
 
        }
        else {
            ((TCheckBox *)Sender)->Enabled=false;
 
        }
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.05.2012, 01:48
Avazart, где вы такие мозги берете...
Вопрос не в том куда где брать а куда бы их всунуть...

Добавлено через 1 минуту
Flyer, не люблю TList какой то он неправильный относительно dynamic_cast<>

Добавлено через 11 минут
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
TList *L;
//---------------------------------------------------------------------------
bool post_check;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
post_check=false;
L= new TList;
L->Add(CheckBox1);
L->Add(CheckBox2);
L->Add(CheckBox3);
L->Add(CheckBox4);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(!post_check)
 {
 post_check= true;
 for(int i=0;i<L->Count;i++)
// if( dynamic_cast<TCheckBox*>(L->Items[i]) != Sender) /* [BCC32 Error] Unit3.cpp(35): E2307 Type 'void' is not a defined class with virtual functions*/
//     ( dynamic_cast<TCheckBox*>(L->Items[i]) )->Checked=false;
   if( ((TCheckBox*)L->Items[i])!= Sender)  ((TCheckBox*)L->Items[i])->Checked=false;
 post_check= false;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete L;
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2012, 01:48
Помогаю со студенческими работами здесь

Чекбоксы
доброго времени суток!! ниразу не работал с чекбоксами, и вот такой вопрос: есть список постов на странице и у каждого есть свой...

чекбоксы
как сделать чтобы при нажатии на один чекбокс с другого бокса снималась отметка(если он был отмечен) и он ставал прозрачным и невозможным к...

Чекбоксы
Здравствуйте! Помогите, пожалуйста! Есть список чекбоксов, который создается динамически.Как сделать, чтобы после нажатия на кнопку,...

чекбоксы
вот тест с несколькими правильными ответами,допустим2 из 3, но я столкнулся с такой проблемой, что если в чекбоксе выбран хотя бы один...

Не работают чекбоксы из-за js
Не работают чекбоксы c js. В чем здесь проблема &lt;!doctype html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;!-- Required meta tags --&gt; ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
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
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru