Победить CheckBox
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Всем привет!
На форме есть 3 штуки CheckBox. Нужно сделать так, чтобы выбран был только один из них, либо все три остались бы не выбранными (это важно!). То есть, нужно, чтобы галочка "перескакивала" бы с одного на другой. Бьюсь 3-й день, мозги скрипят...
Help!!!
На форме есть 3 штуки CheckBox. Нужно сделать так, чтобы выбран был только один из них, либо все три остались бы не выбранными (это важно!). То есть, нужно, чтобы галочка "перескакивала" бы с одного на другой. Бьюсь 3-й день, мозги скрипят...
Help!!!
Используйте RadioGroup с дополнительным вариантом "ни один из них". Можно на него еще код повесить: если выбран 4 вариант, сделать itemindex:=-1;
Или на каждый из трех чекбоксов повесить код, который очищает два других. Типа
procedure Checkbox1Click(...);
begin
checkbox2.checked:=false;
checkbox3.checked:=false;
end;
Или на каждый из трех чекбоксов повесить код, который очищает два других. Типа
procedure Checkbox1Click(...);
begin
checkbox2.checked:=false;
checkbox3.checked:=false;
end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
RadioGroup не пойдет, к сожалению...
checkbox2.checked:=false;
checkbox3.checked:=false; - если бы было все так просто... При таком коде, конечно, два других очищаются, но вот первый выбирается не всегда - он может остаться пустым. При попытке его "загалочить" программно, прога зацикливается и сливается.
checkbox2.checked:=false;
checkbox3.checked:=false; - если бы было все так просто... При таком коде, конечно, два других очищаются, но вот первый выбирается не всегда - он может остаться пустым. При попытке его "загалочить" программно, прога зацикливается и сливается.
Делал подобное, но с двумя кнопками. Т.е. может быть "включено" одновременно не более одной.
С тремя, полагаю, аналогично
Пусть есть три кнопки на диалоговом окне:
cb_1: TCheckBox;
cb_2: TCheckBox;
cb_3: TCheckBox;
Вешаем на них (на каждую) процедуры-обработчики OnClick.
Смысл обработчика: если кнопка включается, то принудительно
выключить соседние. Если выключается, то ничего дополнительно
не предпринимать.
С тремя, полагаю, аналогично
Пусть есть три кнопки на диалоговом окне:
cb_1: TCheckBox;
cb_2: TCheckBox;
cb_3: TCheckBox;
Вешаем на них (на каждую) процедуры-обработчики OnClick.
Смысл обработчика: если кнопка включается, то принудительно
выключить соседние. Если выключается, то ничего дополнительно
не предпринимать.
Код: Выделить всё
procedure TMyForm.cb_1YClick(Sender: TObject);
begin
// Если кнопка включена, то выключаем "соседние" кнопки
if (cb_1.Checked) then begin
cb_2.Checked := FALSE;
cb_3.Checked := FALSE;
end;
end;
procedure TMyForm.cb_2YClick(Sender: TObject);
begin
// Если кнопка включена, то выключаем "соседние" кнопки
if (cb_2.Checked) then begin
cb_1.Checked := FALSE;
cb_3.Checked := FALSE;
end;
end;
procedure TMyForm.cb_3YClick(Sender: TObject);
begin
// Если кнопка включена, то выключаем "соседние" кнопки
if (cb_3.Checked) then begin
cb_1.Checked := FALSE;
cb_2.Checked := FALSE;
end;
end;
Спасибо!!!!
Работает!!!!!
Работает!!!!!
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
в качестве тринировки извращения можно всё запихать в одну процедуру 
кидаем на форму 3 Чекбокса, вешаем всех на одну процедуру:
[syntax='delphi']
TForm1 = class(TForm)
cb1: TCheckBox;
cb2: TCheckBox;
cb3: TCheckBox;
procedure CBClick(Sender: TObject);
private
{ Private declarations }
Ind: byte;
Changing: boolean;
public
{ Public declarations }
end;
----skip-------
procedure TForm1.CBClick(Sender: TObject);
begin
if not Changing then
begin
Changing := true;
try
if not (Sender as TCheckBox).Checked then Abort;
ind := (Sender as TComponent).Tag;
cb1.Checked := Ind = 1;
cb2.Checked := Ind = 2;
cb3.Checked := Ind = 3;
finally
Changing := false;
end;
end;
end;
[/syntax]
так проще добавлять чекбоксы

кидаем на форму 3 Чекбокса, вешаем всех на одну процедуру:
[syntax='delphi']
TForm1 = class(TForm)
cb1: TCheckBox;
cb2: TCheckBox;
cb3: TCheckBox;
procedure CBClick(Sender: TObject);
private
{ Private declarations }
Ind: byte;
Changing: boolean;
public
{ Public declarations }
end;
----skip-------
procedure TForm1.CBClick(Sender: TObject);
begin
if not Changing then
begin
Changing := true;
try
if not (Sender as TCheckBox).Checked then Abort;
ind := (Sender as TComponent).Tag;
cb1.Checked := Ind = 1;
cb2.Checked := Ind = 2;
cb3.Checked := Ind = 3;
finally
Changing := false;
end;
end;
end;
[/syntax]
так проще добавлять чекбоксы


Но все равно пр-ру TForm1.CBClick при добавлении нового чек-бокса придется чуть модифицировать: добавлять строки вида:Игорь Акопян писал(а):так проще добавлять чекбоксы![]()
cb4.Checked := (Ind = 4);
;-)
Никто вообще-то не мешает перебрать все контролы (они же чекбоксы) с ненулевыми тэгами и делать проверку в цикле. Тогда уже не будет зависимости кода от их числа, примерно как это сделано в обычном RadioGroup
It's a long way to the top if you wanna rock'n'roll
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
BBB, я ж не говорю. что ничего менять не надо
эт я так.... для обозначения масштаба творчества 
somewhere, тоже вон расширяет


somewhere, тоже вон расширяет

