Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.03.2012, 18:05
GrabbeR GrabbeR вне форума
Новичок
 
Регистрация: 15.03.2012
Сообщения: 53
Версия Delphi: 7
Репутация: 10
По умолчанию Помогите с CheckBox в анкете

Помогите доделать, пожалуйста!

1. Объявляем переменную типа byte;
2. При выборе любого чекбокса увеличивать ее на 1
3. Если чекбокс не выбран то соответственно +0 (не прибавлять)
4. Общие чекбоксы в переменную не записывать
5. Button2 - обнуление всех чекбоксов (якобы новая страница)
6. Button1 - показать результат (сумму всех значений для каждого чекбокса)

Что-то типа flag:=flag+1;

Например:
А=1
А+А=2
...
Вложения
Тип файла: 7z Anketa.7z (154.6 Кбайт, 18 просмотров)

Последний раз редактировалось GrabbeR, 15.03.2012 в 18:08.
Ответить с цитированием
  #2  
Старый 15.03.2012, 19:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Это зачем-же такое чудовище чекастое? Ужас.
Проблема в том, что у вас совершенно невозможно понять какой чекбокс куда относится. По заголовку они не уникальные, по имени они вообще просто никак не групируются. Что-бы все это громадье заново не переделывать рекомендую сделать 3-х мерный массив (Колонка,Группа,Элемент) примерно такого типа:
Код:
Anketa: Array[1..3,1..6,1..5] of TCheckBox;
и ручками их связать:
Код:
Anketa[1,1,1] := CheckBox1;
Anketa[1,1,2] := CheckBox2;
Тогда можно уже будет что-то считать по элементам массива Anketa.
Решение конечно не идеальное, но лучше пока не вижу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
GrabbeR (17.03.2012)
  #3  
Старый 15.03.2012, 19:34
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

по вопросу.
всем чекбоксам на событие клик поставить единую процедуру и в нее написать
If (Sender as TCheckBox).checked then Inc(flag)
else Dec(flag)
тем самым флаг будет содержать кол-во включенных чеков.
(изначально ни один чек не выбран,флаг=0).
Ответить с цитированием
Этот пользователь сказал Спасибо Snake22 за это полезное сообщение:
GrabbeR (17.03.2012)
  #4  
Старый 15.03.2012, 19:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Snake22
по вопросу.
всем чекбоксам на событие клик поставить единую процедуру и в нее написать
If (Sender as TCheckBox).checked then Inc(flag)
else Dec(flag)
тем самым флаг будет содержать кол-во включенных чеков.
(изначально ни один чек не выбран,флаг=0).
К сожалению данное предложение не решает основную проблему, получения суммы по группам, столбцам и т.д. Так мы сможем посчитать только общее количество.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
GrabbeR (17.03.2012)
  #5  
Старый 15.03.2012, 23:33
GrabbeR GrabbeR вне форума
Новичок
 
Регистрация: 15.03.2012
Сообщения: 53
Версия Delphi: 7
Репутация: 10
По умолчанию

допустим, применить метод, предложенный Snake22, тогда будет идти подсчет каждого чекбокса, правильно ведь? как тогда посмотреть сумму чекбоксов по отдельности? ну то есть, может быть расширить форму под Memo и в нее выводить результат?
Ответить с цитированием
  #6  
Старый 16.03.2012, 00:05
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

У чекбоксов есть такой параметр как Tag, для первой группы устанавливаем 10, для второй - 20, и так далее. Потом модернизируем вариант Snake22:
Код:
var
  MainFlag: integer = 0; //общее кол-во отмеченных чекеров
  Group1Flag: integer = 0; //Кол-во отмеченных из первой группы
  Group2Flag: integer = 0; //из второй

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If (Sender as TCheckBox).checked then Inc(MainFlag) else Dec(MainFlag);
  case TCheckBox(Sender).Tag of
    10: if TCheckBox(Sender).Checked then Inc(Group1Flag) else Dec(Group1Flag);
    20: if TCheckBox(Sender).Checked then Inc(Group2Flag) else Dec(Group2Flag);
  end;
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.

Последний раз редактировалось Karsh, 16.03.2012 в 00:10.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
GrabbeR (17.03.2012)
  #7  
Старый 16.03.2012, 01:04
GrabbeR GrabbeR вне форума
Новичок
 
Регистрация: 15.03.2012
Сообщения: 53
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Karsh
У чекбоксов есть такой параметр как Tag, для первой группы устанавливаем 10, для второй - 20, и так далее. Потом модернизируем вариант Snake22:
Код:
var
  MainFlag: integer = 0; //общее кол-во отмеченных чекеров
  Group1Flag: integer = 0; //Кол-во отмеченных из первой группы
  Group2Flag: integer = 0; //из второй

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  If (Sender as TCheckBox).checked then Inc(MainFlag) else Dec(MainFlag);
  case TCheckBox(Sender).Tag of
    10: if TCheckBox(Sender).Checked then Inc(Group1Flag) else Dec(Group1Flag);
    20: if TCheckBox(Sender).Checked then Inc(Group2Flag) else Dec(Group2Flag);
  end;
end;

var
Form1: TForm1;
MainFlag: integer = 0; //общее кол-во отмеченных чекеров
Group1Flag: integer = 0; //Кол-во отмеченных из первой группы
Group2Flag: integer = 0; //из второй
Group3Flag: integer = 0;
Group4Flag: integer = 0;
Group5Flag: integer = 0;
Group6Flag: integer = 0;
...
...
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
If (Sender as TCheckBox).checked then Inc(MainFlag) else Dec(MainFlag)
case TCheckBox(Sender).Tag of
10: if TCheckBox(Sender).Checked then Inc(Group1Flag) else Dec(Group1Flag);
20: if TCheckBox(Sender).Checked then Inc(Group2Flag) else Dec(Group2Flag);
30: if TCheckBox(Sender).Checked then Inc(Group3Flag) else Dec(Group3Flag);
...
...
end;

end;

в строке: case TCheckBox(Sender).Tag of
[Error] Unit1.pas(215): Missing operator or semicolon
[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'

что не так?
Ответить с цитированием
  #8  
Старый 16.03.2012, 02:04
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

В строке
Код:
If (Sender as TCheckBox).checked then Inc(MainFlag) else Dec(MainFlag)
точку с запятой в конце поставьте.

UPD:Вот добавил небольшой примерчик, как по Tag можно различать столбец и строку нажатого чекбокса.
Вложения
Тип файла: 7z test1.7z (4.3 Кбайт, 3 просмотров)
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.

Последний раз редактировалось Karsh, 16.03.2012 в 02:19.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
GrabbeR (17.03.2012)
  #9  
Старый 16.03.2012, 02:21
GrabbeR GrabbeR вне форума
Новичок
 
Регистрация: 15.03.2012
Сообщения: 53
Версия Delphi: 7
Репутация: 10
По умолчанию

спасибо, сейчас попробую с массивами сделать... отпишусь че получилось

Последний раз редактировалось GrabbeR, 16.03.2012 в 02:28.
Ответить с цитированием
  #10  
Старый 16.03.2012, 02:29
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от GrabbeR
а как теперь вывести результат каждого чека в Edit?
Если честно, то я не понял, какой результат вам нужно вывести.
Цитата:
сумму всех значений для каждого чекбокса
Каких именно значений каждого чекбокса? Помечен он или нет?

В принципе, если нужно вывести число в строку Edit, то делается это так:
Код:
var
  i: integer;
<...>
  Edit1.Text:= IntToStr(i);
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
GrabbeR (17.03.2012)
  #11  
Старый 16.03.2012, 02:51
GrabbeR GrabbeR вне форума
Новичок
 
Регистрация: 15.03.2012
Сообщения: 53
Версия Delphi: 7
Репутация: 10
По умолчанию

Смотрите, есть две стороны по три колонки, 15 строк в каждой колонке. Будет выбран (true) какой-то один из трех чекбоксов в каждой строке (обеих сторон). Соответственно выбранные чекбоксы должны записываться в переменную. После чего нажатием кнопки "Следующий лист" все выбранные чекбоксы обнуляются (как бы новая страница создается) и проходит новая, та же процедура выборов, что и в начале. После нажатия кнопки "Результат" либо в сообщении, либо в Memo/Edit суммируются количество true для каждого чекбокса (их всего 90). Например:
в первой колонке чекбокс 1.2 был дважды выбран за все время, значит его значение суммируется и = 2.

Знаю, что бред и пурга, но это очень нужно для облегчения моей работы... я даже готов заплатить, не обижу
Ответить с цитированием
  #12  
Старый 16.03.2012, 03:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ещё бы понять, что такое:
Цитата:
Смотрите, есть две стороны по три колонки...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
GrabbeR (17.03.2012)
  #13  
Старый 16.03.2012, 03:15
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Будет выбран (true) какой-то один из трех чекбоксов в каждой строке (обеих сторон).
Так нужен TRadioButton?
Цитата:
в первой колонке чекбокс 1.2 был дважды выбран за все время, значит его значение суммируется и = 2.
Т.е. первый раз он был выбран на "первом листе", и второй - когда "лист" перевернули?
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
GrabbeR (17.03.2012)
  #14  
Старый 16.03.2012, 03:26
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Самое лучшее, если ТС сделает рисунок, как он это всё видит.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
GrabbeR (17.03.2012)
  #15  
Старый 16.03.2012, 03:27
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Так, кажется, я понял. Вам нужно при нажатии на Button1 проверить все чекбоксы, и если чекбокс помечен, увеличить его переменную? Если да, то все куда проще: просто поставьте у всех чекбоксов Tag в значение 0, и при нажатии Button1 делайте так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
begin
  for i:= 0 to Form1.ComponentCount - 1 do
  begin
    if not (Form1.Components[i] is TCheckBox) then continue; //если не чекер, то пропускаем
    if TCheckBox(Form1.Components[i]).Checked then
      TCheckBox(Form1.Components[i]).Tag:= TCheckBox(Form1.Components[i]).Tag + 1;
    TCheckBox(Form1.Components[i]).Checked:= False; //заодно и снимем пометку, раз новый лист делаем
  end;
end;
А чтобы вывести результат просто в событии Button2 проверьте значение Tag у каждого чекера - оно и будет отражать, сколько раз он был выбран.
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
GrabbeR (17.03.2012)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter