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

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

27.05.2012, 00:04. Просмотров 503. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос ЧекБоксы и госпожа Рекурсия (C++ Builder):

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

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

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

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

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

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

7
Avazart
Эксперт С++
7685 / 5594 / 543
Регистрация: 10.12.2010
Сообщений: 25,077
Записей в блоге: 17
27.05.2012, 00:57 #2
Используй радиоБатоны вместо чеков.Или напиши компонент наподобии TRadioGroup
1
Flyer
wtf!?
747 / 278 / 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
Эксперт С++
7685 / 5594 / 543
Регистрация: 10.12.2010
Сообщений: 25,077
Записей в блоге: 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!?
747 / 278 / 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
Эксперт С++
7685 / 5594 / 543
Регистрация: 10.12.2010
Сообщений: 25,077
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

Чекбоксы в документе
Здравствуйте. Подскажите пожалуйта, можно - ли создать документ Word, с чекбоксами, которые можно отмечать кликом мышки?

чекбоксы в ListView
Как добавить чекбоксы в ListView, например как в торренте? Тоесть папка рядом + и чекбокс, нажимаешь + открывается древо и у каждого...


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

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

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