Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

вот, попробуйте.
решение "в лоб"
Код:

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,429
Репутация: 2769
По умолчанию

все просто.
Код:

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
Репутация: 73

icq: 634474495
skype: chertovich1992
По умолчанию

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

Цитата:
решение "в лоб"
Которое скорее всего нарвет на переполнение стека в связи с зацикливанием.
Предлагаю свою универсалку:
Код:

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
Сообщений: 25,412
Репутация: 5596
По умолчанию

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

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

Цитата:
Сообщение от 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,815
Репутация: 6832
По умолчанию

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

Смотрим
Код:

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;

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


08:02.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru