Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
The_Immortal
1560 / 496 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
1

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

27.05.2012, 00:04. Просмотров 513. Ответов 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
Миниатюры
ЧекБоксы и госпожа Рекурсия  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 00:04
Ответы с готовыми решениями:

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

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

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

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

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

7
Avazart
Эксперт С++
7738 / 5648 / 550
Регистрация: 10.12.2010
Сообщений: 25,495
Записей в блоге: 17
27.05.2012, 00:57 2
Используй радиоБатоны вместо чеков.Или напиши компонент наподобии TRadioGroup
1
Flyer
wtf!?
748 / 279 / 24
Регистрация: 21.05.2010
Сообщений: 732
27.05.2012, 00:59 3
я б добавил их в лист, присвоил все один обработчик, далее в цикле сравнение сендера с текущим элементом списка, если он знач ставим енейбл, если не он ставим дисейблд. ну это так, как то сомнительно звучит, но работает.
ну или сделай как сказал товарищ Avazart
1
The_Immortal
1560 / 496 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
27.05.2012, 01:19  [ТС] 4
Да с радио-то понятно, но хотелось как-то так оставить...

Добавлено через 4 минуты
Цитата Сообщение от Flyer Посмотреть сообщение
я б добавил их в лист
Чего-то сообразить не могу, а как их в лист добавить?
0
Avazart
Эксперт С++
7738 / 5648 / 550
Регистрация: 10.12.2010
Сообщений: 25,495
Записей в блоге: 17
27.05.2012, 01:26 5
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
The_Immortal
1560 / 496 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
27.05.2012, 01:31  [ТС] 6
Avazart, где вы такие мозги берете...
0
Flyer
wtf!?
748 / 279 / 24
Регистрация: 21.05.2010
Сообщений: 732
27.05.2012, 01:35 7
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
Эксперт С++
7738 / 5648 / 550
Регистрация: 10.12.2010
Сообщений: 25,495
Записей в блоге: 17
27.05.2012, 01:48 8
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
27.05.2012, 01:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 01:48

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

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

Отметить чекбоксы
Всем привет! Подскажите как модифицировать скрипт, чтобы при выборе одного или...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru