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);
}
работа с CheckBox'ами. Организация завимости?
1) если был помечен родительский чекбокс, то автоматически помечаются все дочерние
2) если был помечен дочерний чекбокс, то автоматически выделяется родительский чекбокс
3) если были выключены все дочерние чекбоксы, то автоматически снимается выделение с родительского чекбокса...
Подскажите, у кого какие идеи есть:-)
Можно попробовать еще придумать чего нить с GroupBox, но я там ничего полезного не заметил:( . Хотя вариант плохой из-за сложностей при маштабировании. Вот так :( . Если кто предложит вариант получше, буду признателен.
Идея не плохая..но когда чекбоксы создаются динамически и их может быть до 100 штук, прописывать их вручную мягко выражаясь геморойно...:-)
1) _value - ук-ль на сам chb
2) _parent - ук-ль на родителя(либо null)
3) _children - список/вектор деток
Каждый экземпляр класса засунул бы в список/вектор и т.п.. Назначил бы всем chb один обработчик. При событии сравнивал бы Sender'а со значениями _value объектов из списка. При нахождении делал бы соответствующие действия с родителем/детками и т.д..
Тяжеловесно, но все-таки мой вариант :)
Идея хорошая, но вот реализовать ее оказывется очень тяжело. Возникла проблема: при изменении чекбокса (CheckBox->Checked = true), вызывается событие OnClick(), и следовательно. если меняется дочерний чекбокс, то сначало вызывается OnClick() для дочернего чекбокса, а потом вызывается OnClick() для родительского чекбокса и, следовательно, помечаются все дочерние чекбоксы:-(
В итоге при обращении к любому элементу ты находишь его в твоем дереве и делаешь с его подузлами все, что тебе необходимо....:
CheckBox1
CheckBox2
CheckBox3
CheckBox4
CheckBox5
CheckBox6
CheckBox7
CheckBox8
CheckBox9
и т.д.
1. Можно реализовать так: кидаешь на форму компонент дерева, и при создании CheckBox'ов, заполняешь это дерево... Так удобней отследить создаваемую архитектуру
2. Создать переменную в виде списка, у каждого элемента будет ID и родитель...
Цитата: koltaviy
Я бы завернул chb в класс:
1) _value - ук-ль на сам chb
2) _parent - ук-ль на родителя(либо null)
3) _children - список/вектор деток
Каждый экземпляр класса засунул бы в список/вектор и т.п.. Назначил бы всем chb один обработчик. При событии сравнивал бы Sender'а со значениями _value объектов из списка. При нахождении делал бы соответствующие действия с родителем/детками и т.д..
Тяжеловесно, но все-таки мой вариант :)
1) _value - ук-ль на сам chb
2) _parent - ук-ль на родителя(либо null)
3) _children - список/вектор деток
Каждый экземпляр класса засунул бы в список/вектор и т.п.. Назначил бы всем chb один обработчик. При событии сравнивал бы Sender'а со значениями _value объектов из списка. При нахождении делал бы соответствующие действия с родителем/детками и т.д..
Тяжеловесно, но все-таки мой вариант :)
Спасибо. Поступил как ты говорил:-) немного изменил, _parent - это номер в структуре родительского чекбокса.
кому интересно выкладываю код реализации:
.сpp
Код:
.h
Код:
struct chb
{
TCheckBox *chb;
int parent;
vector<TCheckBox*> child;
};
chb checkbox[24];
{
TCheckBox *chb;
int parent;
vector<TCheckBox*> child;
};
chb checkbox[24];
ЗЫ: событию onclick пришлось присваивать null, а потом обратно, для того что бы избежать заполения всех полей, т.к. при изменении Checked вызывается событие OnClick:-)
ЗЫЫ: Спасибо всем за помощь.