Победить CheckBox

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
ElenaA
Сообщения: 15
Зарегистрирован: 09 июн 2006, 10:00

27 авг 2007, 12:23

Всем привет!
На форме есть 3 штуки CheckBox. Нужно сделать так, чтобы выбран был только один из них, либо все три остались бы не выбранными (это важно!). То есть, нужно, чтобы галочка "перескакивала" бы с одного на другой. Бьюсь 3-й день, мозги скрипят...
Help!!!
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

27 авг 2007, 12:36

Используйте RadioGroup с дополнительным вариантом "ни один из них". Можно на него еще код повесить: если выбран 4 вариант, сделать itemindex:=-1;
Или на каждый из трех чекбоксов повесить код, который очищает два других. Типа
procedure Checkbox1Click(...);
begin
checkbox2.checked:=false;
checkbox3.checked:=false;
end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
ElenaA
Сообщения: 15
Зарегистрирован: 09 июн 2006, 10:00

27 авг 2007, 12:45

RadioGroup не пойдет, к сожалению...
checkbox2.checked:=false;
checkbox3.checked:=false; - если бы было все так просто... При таком коде, конечно, два других очищаются, но вот первый выбирается не всегда - он может остаться пустым. При попытке его "загалочить" программно, прога зацикливается и сливается.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

27 авг 2007, 16:18

Делал подобное, но с двумя кнопками. Т.е. может быть "включено" одновременно не более одной.
С тремя, полагаю, аналогично

Пусть есть три кнопки на диалоговом окне:
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;
ElenaA
Сообщения: 15
Зарегистрирован: 09 июн 2006, 10:00

28 авг 2007, 09:48

Спасибо!!!!
Работает!!!!!
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

29 авг 2007, 15:42

в качестве тринировки извращения можно всё запихать в одну процедуру :)
кидаем на форму 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]
так проще добавлять чекбоксы :)
Изображение
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

30 авг 2007, 09:45

Игорь Акопян писал(а):так проще добавлять чекбоксы :)
Но все равно пр-ру TForm1.CBClick при добавлении нового чек-бокса придется чуть модифицировать: добавлять строки вида:

cb4.Checked := (Ind = 4);

;-)
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 авг 2007, 10:08

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

03 сен 2007, 17:56

BBB, я ж не говорю. что ничего менять не надо :) эт я так.... для обозначения масштаба творчества ;)
somewhere, тоже вон расширяет ;)
Изображение
Ответить