Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

работа с CheckBox'ами. Организация завимости?

489
10 октября 2007 года
NeO_u
277 / / 11.10.2006
Возникла такая проблема: есть группа чекбоксов. Есть несколько родителей, т.е. основных, и несколько дочерних чекбоксов и некоторые дочерние чекбоксы могу выступать для других чекбокосов родителями. Тогда, какую функцию надо написать, что бы сделать ряд проверок
1) если был помечен родительский чекбокс, то автоматически помечаются все дочерние
2) если был помечен дочерний чекбокс, то автоматически выделяется родительский чекбокс
3) если были выключены все дочерние чекбоксы, то автоматически снимается выделение с родительского чекбокса...

Подскажите, у кого какие идеи есть:-)
10K
10 октября 2007 года
FAngel
77 / / 13.09.2006
В общем идей немного. Ничего быстрого я незнаю (ну так шоб раз и все работает:) ). Я бы делал фсе ручками, тоесть родитель кликаем - всех детей делаем такими же как и родитель. А для детей одного родителя определил бы какую нить переменную, которая считает количество, скажем, отмеченных боксов. Когда их ноль - родителя делаем неотмеченым или просто меньше, чем количество "детей". Когда их столько же, сколько и "детей", то делаем родителя отмеченным.
Можно попробовать еще придумать чего нить с GroupBox, но я там ничего полезного не заметил:( . Хотя вариант плохой из-за сложностей при маштабировании. Вот так :( . Если кто предложит вариант получше, буду признателен.
489
10 октября 2007 года
NeO_u
277 / / 11.10.2006
Идея не плохая..но когда чекбоксы создаются динамически и их может быть до 100 штук, прописывать их вручную мягко выражаясь геморойно...:-)
263
10 октября 2007 года
koltaviy
816 / / 16.12.2004
Я бы завернул chb в класс:
1) _value - ук-ль на сам chb
2) _parent - ук-ль на родителя(либо null)
3) _children - список/вектор деток

Каждый экземпляр класса засунул бы в список/вектор и т.п.. Назначил бы всем chb один обработчик. При событии сравнивал бы Sender'а со значениями _value объектов из списка. При нахождении делал бы соответствующие действия с родителем/детками и т.д..
Тяжеловесно, но все-таки мой вариант :)
489
11 октября 2007 года
NeO_u
277 / / 11.10.2006
Идея хорошая, но вот реализовать ее оказывется очень тяжело. Возникла проблема: при изменении чекбокса (CheckBox->Checked = true), вызывается событие OnClick(), и следовательно. если меняется дочерний чекбокс, то сначало вызывается OnClick() для дочернего чекбокса, а потом вызывается OnClick() для родительского чекбокса и, следовательно, помечаются все дочерние чекбоксы:-(
490
11 октября 2007 года
frid-karatel
357 / / 15.09.2007
я если сделать массив из элементов в виде дерева, т.е. создать переменную, в которой будут храниться имена (или указатели) на чекбоксы, но переменная будет представлена в виде дерева, т.е. будет присутствовать иерархия...

В итоге при обращении к любому элементу ты находишь его в твоем дереве и делаешь с его подузлами все, что тебе необходимо....:
CheckBox1
CheckBox2
CheckBox3
CheckBox4
CheckBox5
CheckBox6
CheckBox7
CheckBox8
CheckBox9
и т.д.

1. Можно реализовать так: кидаешь на форму компонент дерева, и при создании CheckBox'ов, заполняешь это дерево... Так удобней отследить создаваемую архитектуру

2. Создать переменную в виде списка, у каждого элемента будет ID и родитель...
489
11 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: koltaviy
Я бы завернул chb в класс:
1) _value - ук-ль на сам chb
2) _parent - ук-ль на родителя(либо null)
3) _children - список/вектор деток

Каждый экземпляр класса засунул бы в список/вектор и т.п.. Назначил бы всем chb один обработчик. При событии сравнивал бы Sender'а со значениями _value объектов из списка. При нахождении делал бы соответствующие действия с родителем/детками и т.д..
Тяжеловесно, но все-таки мой вариант :)



Спасибо. Поступил как ты говорил:-) немного изменил, _parent - это номер в структуре родительского чекбокса.
кому интересно выкладываю код реализации:
.сpp

Код:
void setTrue(TCheckBox *cb)
{
    cb->State = cbChecked;
}
void setFalse(TCheckBox *cb)
{
    cb->State = cbUnchecked;
}

void TForm3::removeCheckBox(int id)
{
    if(checkbox[id].parent != -1)
        {
                bool found=false;
                vector<TCheckBox*>::iterator it;
                it = checkbox[checkbox[id].parent].child.begin();
                for(;it!=checkbox[checkbox[id].parent].child.end();it++)
                {
                        if((*it)->Checked ==true)
                                found = true;
                }
                if(found == false)
                {
                        checkbox[checkbox[id].parent].chb->OnClick = NULL;
                        checkbox[checkbox[id].parent].chb->Checked = false;
                        checkbox[checkbox[id].parent].chb->OnClick = CheckBoxClick;
                }

        }
    else
        for_each(checkbox[id].child.begin(),checkbox[id].child.end(),setFalse);
}
void TForm3::setCheckBox(int id)
{
    if(checkbox[id].parent != -1)
        {
                        checkbox[checkbox[id].parent].chb->OnClick = NULL;
                        checkbox[checkbox[id].parent].chb->Checked = true;
                        checkbox[checkbox[id].parent].chb->OnClick = CheckBoxClick;
        }
    else
        for_each(checkbox[id].child.begin(),checkbox[id].child.end(),setTrue);
}


.h
 
Код:
struct  chb
    {
        TCheckBox *chb;
        int parent;
        vector<TCheckBox*> child;
    };
    chb checkbox[24];


ЗЫ: событию onclick пришлось присваивать null, а потом обратно, для того что бы избежать заполения всех полей, т.к. при изменении Checked вызывается событие OnClick:-)

ЗЫЫ: Спасибо всем за помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог