Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2011, 16:06   #1
nervniy
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 52
По умолчанию переключение checkbox'ов

на форме есть 2 checkbox'a,в первом по умолчанию стоит галочка.как сделать так чтобы кликнув на втором checkbox в нем появилась галочка а в первом исчезла и наоборот.пробовал через if then получается один раз переключить,потом просто зацикливается.может кто знает??
nervniy вне форума Ответить с цитированием
Старый 29.08.2011, 16:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вот, попробуйте.
решение "в лоб"
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckBox2.Checked := Not CheckBox1.Checked;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  CheckBox2.Checked := Not CheckBox1.Checked;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  CheckBox1.Checked := Not CheckBox2.Checked;
end;
код на события onCreate формы,
на OnClick первого чекбокса
и на OnClick второго чекбокса
соответственно.


p.s. может быть Вам нужно использовать RadioButton'ы ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.08.2011, 16:34   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

все просто.
Код:
procedure TForm1.ChkBox1Click(Sender: TObject);
begin
ChkBox2.checked:=not ChkBox1.checked;
end;

procedure TForm1.ChkBox2Click(Sender: TObject);
begin
ChkBox1.checked:=not ChkBox2.checked;
end;
компилятор сам разберётся. Все дело в компоненте.
Самое главное это - факт, что свойство checked в событии OnClick становится в false первым, и только после этого начивает выполнятся код самого OnClick.
Человек_Борща вне форума Ответить с цитированием
Старый 29.08.2011, 17:14   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Может вам лучше подходит RadioButton?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 29.08.2011, 17:25   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
решение "в лоб"
Которое скорее всего нарвет на переполнение стека в связи с зацикливанием.
Предлагаю свою универсалку:
Код:
procedure TForm1.CheckBox1Click(Sender: TObject);
var i:integer;
begin
  for i := 0 to controlcount-1 do
   if Controls[i] is TCheckBox then begin
    TCheckBox(Controls[i]).OnClick:=nil;
    TCheckBox(Controls[i]).Checked:=Controls[i]=sender;
    TCheckBox(Controls[i]).OnClick:=CheckBox1Click;
   end;
end;
Учитывая что этот обработчик присвоен всем чекам, которые нужно обрабатывать.

P.S. А чего, радиобуттоны уже отменили?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2011, 17:34   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Stilet
Цитата:
решение "в лоб"
Которое скорее всего нарвет на переполнение стека в связи с зацикливанием.
вот это уже намного интересней!
Теоретически, должно происходить зацикливание.
Практически - нет, не происходит.
Вопрос - почему?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.08.2011, 17:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вот это уже намного интересней!
Теоретически, должно происходить зацикливание.
Практически - нет, не происходит.
Вопрос - почему?!
Дык дергается по обработчикам пока в одном из них True в True не присваиваивается или False в False и рекурсия прекращается, в отладке хорошо видно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.08.2011, 17:51   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Которое скорее всего нарвет на переполнение стека в связи с зацикливанием.
С чего бы это вдруг?
Мне кажется компилятор просто делает так:
Из

Код:
CheckBox1.Checked:=not CheckBox2.Checked;
в

Код:
if CheckBox2.Checked = False then
begin
CheckBox1.Checked:=True;
end;
Я уже написал почему нет зацикливания. Потому что свойство checked ставится в True или False и только потом вызывается нажатие.

Последний раз редактировалось Человек_Борща; 29.08.2011 в 17:56.
Человек_Борща вне форума Ответить с цитированием
Старый 29.08.2011, 17:53   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Мне кажется компилятор просто делает так:
А по-моему он должен вызвать обработчик, если он описан. Во всяком случае я на такое нарывался уже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2011, 17:56   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Смотрим
Код:
procedure TCustomCheckBox.SetChecked(Value: Boolean);
begin
  if Value then State := cbChecked else State := cbUnchecked;
end;

procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переключение активности RebOOter Общие вопросы Delphi 3 07.06.2011 18:08
Массовое включение CheckBox'ов Crunkordie Общие вопросы Delphi 3 10.03.2011 23:06
Cписок отмеченных Checkbox'ов Tycuk Компоненты Delphi 2 29.09.2010 14:18
Иерархия из CheckBox'ов minarett JavaScript, Ajax 1 22.02.2010 13:42
CSS, border у checkbox'ов и radio Angfal HTML и CSS 8 29.05.2009 11:41