|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите с CheckBox в анкете
Помогите доделать, пожалуйста!
1. Объявляем переменную типа byte; 2. При выборе любого чекбокса увеличивать ее на 1 3. Если чекбокс не выбран то соответственно +0 (не прибавлять) 4. Общие чекбоксы в переменную не записывать 5. Button2 - обнуление всех чекбоксов (якобы новая страница) 6. Button1 - показать результат (сумму всех значений для каждого чекбокса) Что-то типа flag:=flag+1; Например: А=1 А+А=2 ... Последний раз редактировалось GrabbeR, 15.03.2012 в 18:08. |
#2
|
||||
|
||||
Это зачем-же такое чудовище чекастое? Ужас.
Проблема в том, что у вас совершенно невозможно понять какой чекбокс куда относится. По заголовку они не уникальные, по имени они вообще просто никак не групируются. Что-бы все это громадье заново не переделывать рекомендую сделать 3-х мерный массив (Колонка,Группа,Элемент) примерно такого типа: Код:
Anketa: Array[1..3,1..6,1..5] of TCheckBox; Код:
Anketa[1,1,1] := CheckBox1; Anketa[1,1,2] := CheckBox2; Решение конечно не идеальное, но лучше пока не вижу. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#3
|
|||
|
|||
по вопросу.
всем чекбоксам на событие клик поставить единую процедуру и в нее написать If (Sender as TCheckBox).checked then Inc(flag) else Dec(flag) тем самым флаг будет содержать кол-во включенных чеков. (изначально ни один чек не выбран,флаг=0). |
Этот пользователь сказал Спасибо Snake22 за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#4
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#5
|
|||
|
|||
допустим, применить метод, предложенный Snake22, тогда будет идти подсчет каждого чекбокса, правильно ведь? как тогда посмотреть сумму чекбоксов по отдельности? ну то есть, может быть расширить форму под Memo и в нее выводить результат?
|
#6
|
||||
|
||||
У чекбоксов есть такой параметр как 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
|
|||
|
|||
Цитата:
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
|
||||
|
||||
В строке
Код:
If (Sender as TCheckBox).checked then Inc(MainFlag) else Dec(MainFlag) UPD:Вот добавил небольшой примерчик, как по Tag можно различать столбец и строку нажатого чекбокса. Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. Последний раз редактировалось Karsh, 16.03.2012 в 02:19. |
Этот пользователь сказал Спасибо Karsh за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#9
|
|||
|
|||
спасибо, сейчас попробую с массивами сделать... отпишусь че получилось
Последний раз редактировалось GrabbeR, 16.03.2012 в 02:28. |
#10
|
||||
|
||||
Цитата:
Цитата:
В принципе, если нужно вывести число в строку Edit, то делается это так: Код:
var i: integer; <...> Edit1.Text:= IntToStr(i); Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
Этот пользователь сказал Спасибо Karsh за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#11
|
|||
|
|||
Смотрите, есть две стороны по три колонки, 15 строк в каждой колонке. Будет выбран (true) какой-то один из трех чекбоксов в каждой строке (обеих сторон). Соответственно выбранные чекбоксы должны записываться в переменную. После чего нажатием кнопки "Следующий лист" все выбранные чекбоксы обнуляются (как бы новая страница создается) и проходит новая, та же процедура выборов, что и в начале. После нажатия кнопки "Результат" либо в сообщении, либо в Memo/Edit суммируются количество true для каждого чекбокса (их всего 90). Например:
в первой колонке чекбокс 1.2 был дважды выбран за все время, значит его значение суммируется и = 2. Знаю, что бред и пурга, но это очень нужно для облегчения моей работы... я даже готов заплатить, не обижу |
#12
|
||||
|
||||
Ещё бы понять, что такое:
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#13
|
||||
|
||||
Цитата:
Цитата:
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
Этот пользователь сказал Спасибо Karsh за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#14
|
||||
|
||||
Самое лучшее, если ТС сделает рисунок, как он это всё видит.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|
#15
|
||||
|
||||
Так, кажется, я понял. Вам нужно при нажатии на 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; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
Этот пользователь сказал Спасибо Karsh за это полезное сообщение: | ||
GrabbeR (17.03.2012)
|