Страница 1 из 1

Победить CheckBox

Добавлено: 27 авг 2007, 12:23
ElenaA
Всем привет!
На форме есть 3 штуки CheckBox. Нужно сделать так, чтобы выбран был только один из них, либо все три остались бы не выбранными (это важно!). То есть, нужно, чтобы галочка "перескакивала" бы с одного на другой. Бьюсь 3-й день, мозги скрипят...
Help!!!

Re: Победить CheckBox

Добавлено: 27 авг 2007, 12:36
Хыиуду
Используйте RadioGroup с дополнительным вариантом "ни один из них". Можно на него еще код повесить: если выбран 4 вариант, сделать itemindex:=-1;
Или на каждый из трех чекбоксов повесить код, который очищает два других. Типа
procedure Checkbox1Click(...);
begin
checkbox2.checked:=false;
checkbox3.checked:=false;
end;

Re: Победить CheckBox

Добавлено: 27 авг 2007, 12:45
ElenaA
RadioGroup не пойдет, к сожалению...
checkbox2.checked:=false;
checkbox3.checked:=false; - если бы было все так просто... При таком коде, конечно, два других очищаются, но вот первый выбирается не всегда - он может остаться пустым. При попытке его "загалочить" программно, прога зацикливается и сливается.

Re: Победить CheckBox

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

Пусть есть три кнопки на диалоговом окне:
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;

Re: Победить CheckBox

Добавлено: 28 авг 2007, 09:48
ElenaA
Спасибо!!!!
Работает!!!!!

Re: Победить CheckBox

Добавлено: 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]
так проще добавлять чекбоксы :)

Re: Победить CheckBox

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

cb4.Checked := (Ind = 4);

;-)

Re: Победить CheckBox

Добавлено: 30 авг 2007, 10:08
somewhere
Никто вообще-то не мешает перебрать все контролы (они же чекбоксы) с ненулевыми тэгами и делать проверку в цикле. Тогда уже не будет зависимости кода от их числа, примерно как это сделано в обычном RadioGroup

Re: Победить CheckBox

Добавлено: 03 сен 2007, 17:56
Игорь Акопян
BBB, я ж не говорю. что ничего менять не надо :) эт я так.... для обозначения масштаба творчества ;)
somewhere, тоже вон расширяет ;)