Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Не выбран ни однин из чекбоксов Delphi7

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
 
Вот есть к примеру 30 чекбоксов, как для них записать условие?  
 
Для одного понятно:

Код:
if not CheckBox1.Checked then
showmessage('Ни один из чекбоксов не отмечен');

 
Подавляющее большинство пользователей интернета очень похожи на бомжей, рыскающих в огромной помойке в поисках чего-нибудь более менее стоящего))
А для 30? Заранее спасибо.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 03:17 24-02-2014 | Исправлено: Ugnetatel, 10:25 24-02-2014
Rudia



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Либо в лоб - писать if (not CheckBox1.Checked) and (not CheckBox2.Checked) .... then .
Грамотнее засунуть их в контейнер (TList к примеру) и пройтись циклом. Либо циклом пройтись по всем объектам на форме, проверяя, являются ли они чекбоксами.

Всего записей: 324 | Зарегистр. 13-09-2006 | Отправлено: 10:56 24-02-2014 | Исправлено: Rudia, 11:00 24-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rudia
Не, в лоб не надо, больно же))
Конструкция and не годится тут, если их 300 будет, то, что and, and до 300))
Про and я знал до этого, как сжато написать?

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 13:03 24-02-2014
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ugnetatel
тебе правильно сказали:

Цитата:
Грамотнее засунуть их в контейнер (TList к примеру) и пройтись циклом. Либо циклом пройтись по всем объектам на форме, проверяя, являются ли они чекбоксами.

как они вообще на форме появились? если сгенерены в рантайме - перед генерацией их надо добавлять в TList. если руками в дизайнере создал, то цикл по форме - см. св-ва ControlCount, Controls[]

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 16:32 24-02-2014 | Исправлено: A_V, 16:35 24-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Хм, а если попробовать пойти от обратного?
Если изначально ни один из CheckBox-ов не должен быть отмечен, то заводим целочисленную переменную CheckedCount (равную 0 при запуске) и обрабатываем событие onClick у CheckBox-ов с таким кодом:
if (Sender an TCheckBox).Checked then inc(CheckedCount) else dec(CheckedCount)
А в событии onClick на кнопке проверяем CheckCount - если больше нуля, то делаем действия, если меньше - выводим сообщение..
И не надо будет пробегать все компоненты и возиться с TList-ом.

Всего записей: 667 | Зарегистр. 07-07-2004 | Отправлено: 16:48 24-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IJCuper Точно
Я вот пока набросал такой код, понимаю, что он не правильный, не пойму прада в чем именно, но получилось у меня так:

Код:
Var i: integer;
begin
for i:= 1 to 30 do
if (FindComponent('sCheckbox'+IntToStr(i)) as TsCheckBox).Checked = false then
showmessage('Трам-пам-пам, не выбран ни один из чекбоксов');
end;

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 17:10 24-02-2014 | Исправлено: Ugnetatel, 17:23 24-02-2014
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ugnetatel
ну так, у тебя если не выбран хотя бы один из 30, будет это сообщение.
и вообще FindComponent 30 раз вызывать не гуд, он ведь каждый раз пробегает все компоненты на форме.
 
по твоей логике тогда:
 
Var i: integer;  
wasChecked: boolean;
begin  
wasChecked := false;
for i:= 1 to 30 do  
if (FindComponent('sCheckbox'+IntToStr(i)) as TsCheckBox).Checked then begin
wasChecked := true;  
break;
end;
if not wasChecked then
showmessage('Трам-пам-пам, не выбран ни один из чекбоксов');  
end;
 

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 17:30 24-02-2014 | Исправлено: A_V, 17:39 24-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ок, подходит, сяпки

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 18:18 24-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Возвращаясь к своему предложению. Код может выглядеть так (с учетом прошлых тем, поднятых топикстартером):
Большой фрагмент кода скрыт здесь
 
 
 
Добавлено:
A_V
ну тогда может вот так лучше будет выглядеть?  

Код:
 
Var i: integer;  
wasChecked: boolean;
begin  
  wasChecked := false;
  i := 1;
  while (i<=30) and (not wasChecked) do
  begin
    wasChecked := wasChecked and (FindComponent('sCheckbox'+IntToStr(i)) as TsCheckBox).Checked;
    inc(i);
  end;
  if wasChecked then  
    begin
       // что-то делаем если выбран хотя бы один CheckBox
    end
   else showmessage('Трам-пам-пам, не выбран ни один из чекбоксов');  
end;  
 

Всего записей: 667 | Зарегистр. 07-07-2004 | Отправлено: 22:55 24-02-2014 | Исправлено: IJCuper, 23:07 24-02-2014
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IJCuper

Цитата:
Возвращаясь к своему предложению. Код может выглядеть так (с учетом прошлых тем [?], поднятых топикстартером):  
Большой фрагмент кода скрыт здесь [?]  
 
P.S. надо предусмотреть CheckBoxCheckedCount =0 при нажатии на кнопку "Снять все отметки CheckBox", а также CheckBoxCheckedCount = 30 при нажатии "Отметить все CheckBox"  это будет домашним заданием уже..
 

да вообще-то не надо, т.к и при программной простановке Checked будет вызван обработчик OnClick.  
и лучше таки делать не глобальную переменную, а приватное поле FCheckBoxCheckedCount.
ну а вообще-то, по хорошему, так делать вообще не надо - все отвалится при установке чекбоксу св-ва AllowGrayed (ну или надо это отдельно обрабатывать). с listoм'/проходом кмк все равно проще и понятней.
 

Цитата:
ну тогда может вот так лучше будет выглядеть?

чем лучше, не уловил?

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 01:44 25-02-2014 | Исправлено: A_V, 01:51 25-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
A_V, IJCuper - спасибо за помощь, ответы , решил сделать так и не заморачиваться:

Код:
procedure TForm1.sButton105Click(Sender: TObject);
Var i: integer;  wasChecked: boolean;
begin
wasChecked := false;
for i:= 1 to 30 do
if (FindComponent('sCheckbox'+IntToStr(i)) as TsCheckBox).Checked then begin
wasChecked := true;
sPanel3.Visible:= True; Form1.Caption:= 'Текст 1!!!'; //Иначе
PlaySound(PChar(ExtractFilePath(Application.ExeName) + '1.wav'), 0,SND_FILENAME OR SND_NOSTOP OR SND_ASYNC);//Иначе
break;
end;
if not wasChecked then //Если чекбокс не отемечены
showmessage('Текст2!');  
end;

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 10:36 25-02-2014 | Исправлено: Ugnetatel, 14:23 25-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
A_V

Цитата:
 чем лучше, не уловил?

Да как-то оператор break глаз режет, привычка

Цитата:
 да вообще-то не надо, т.к и при программной простановке Checked будет вызван обработчик OnClick.  

хм.. вот об этом уже не подумал. Да, вы правы.  
Просто не очень нравится идея каждый раз опрашивать все компоненты, тем более при помощи FindComponent.
 
 

Всего записей: 667 | Зарегистр. 07-07-2004 | Отправлено: 13:51 25-02-2014
saidumar

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А не проще использовать CheckListBox?

Всего записей: 92 | Зарегистр. 10-04-2011 | Отправлено: 16:46 05-03-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Не выбран ни однин из чекбоксов Delphi7


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru