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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2014, 09:47   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Запутался с CheckBox'ами

Вобщем есть 4 CheckBox'а и есть Label в котором пишет Осталось: 2 (т.е CheckBox'ов больше), если CheckBox.Checked:=True; - число в "Осталось: 2" уменьшается на единицу, если CheckBox.Checked:=False; - число увеличивается на единицу, но число не может быть больше два (как изначально указано в Label) и число не может быть меньше ноль

Вобщем накидал код он он пашет криво т.к чекбоксов много и уже несколько часов мучаюсь, можно в принципе если Осталось: 0 - выключать (Enabled:=False) все оставшиеся CheckBox'ы, а выбранные оставить включенными...

Код:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if (Label2.Caption<='0') and (CheckBox1.Checked=True) then
begin
ShowMessage('Превышен лимит: 2');
Label2.Caption:='0';
end else
if (Label2.Caption>='0') and (CheckBox1.Checked=True) then
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)-1)
else
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)+1);
end;
 
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if (Label2.Caption<='0') and (CheckBox2.Checked=True) then
begin
ShowMessage('Превышен лимит: 2');
Label2.Caption:='0';
end else
if (Label2.Caption>='0') and (CheckBox2.Checked=True) then
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)-1)
else
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)+1);
end;
 
procedure TForm1.CheckBox3Click(Sender: TObject);
begin
if (Label2.Caption<='0') and (CheckBox3.Checked=True) then
begin
ShowMessage('Превышен лимит: 2');
Label2.Caption:='0';
end else
if (Label2.Caption>='0') and (CheckBox3.Checked=True) then
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)-1)
else
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)+1);
end;
 
procedure TForm1.CheckBox4Click(Sender: TObject);
begin
if (Label2.Caption<='0') and (CheckBox4.Checked=True) then
begin
ShowMessage('Превышен лимит: 2');
Label2.Caption:='0';
end else
if (Label2.Caption>='0') and (CheckBox4.Checked=True) then
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)-1)
else
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)+1);
end;
FleXik вне форума Ответить с цитированием
Старый 13.03.2014, 09:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я лично ничего не понял из условий задачи...

Помните, что невнятная формулировка задания порождает невнятный алгоритм, который, в свою очередь невнятно работает...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2014, 10:02   #3
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию



FleXik вне форума Ответить с цитированием
Старый 13.03.2014, 10:04   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

зачем так много копий одного кода?
eval вне форума Ответить с цитированием
Старый 13.03.2014, 10:05   #5
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
зачем так много копий одного кода?
не знал на какое другое событие кинуть код)))
FleXik вне форума Ответить с цитированием
Старый 13.03.2014, 10:06   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

используйте Label только для ВЫВОДА информации (не пользуйтесь ее текущим значением для получения НОВОГО!!)
Label2.Caption:=IntToStr(StrToInt(Label2.Caption)-1)
если очень нужно заведите переменную
Код:
var
  checkedCount: integer;
корректируйте ее и выводите ЕЕ(!) значение
НО лучше всего вообще не иметь оной а вычислять данную величину (checkedCount) в каждый нужный момент.

Вычислять что-либо надо на основе ВСЕХ заинтересованных (!) и желательно это делать в одном месте программы!


поскольку прозвучало слово вычислять то логично использовать или функцию xxx:=CalcCheckedValueX;

вычисляем в одном месте (в функции CalcCheckedValueX !)
используем в о всех нужных обработчиках (т.е. там где возможно изменение наших отметок)

xxx:=CalcCheckedValueX;

if xxx.limit>2 then showmessage(превышен лимит!!)
else label2.Caption:=inttost(xxx.checkco unt);

Цитата:
не знал на какое другое событие кинуть код)))
как сделать общий код
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.03.2014 в 10:08.
evg_m вне форума Ответить с цитированием
Старый 13.03.2014, 10:14   #7
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

evg_m, как-то плохо обьяснили, ничего не понял, можно конкретнее?
FleXik вне форума Ответить с цитированием
Старый 13.03.2014, 11:04   #8
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

помогли на другой форуме
FleXik вне форума Ответить с цитированием
Старый 13.03.2014, 12:06   #9
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Учитесь присваивать обработчики и работать с Sender. Код сходу сокращается вчетверо.
XE5 вне форума Ответить с цитированием
Старый 13.03.2014, 12:18   #10
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Что то намудренно так что и не поймешь какова задача. Я бы, сперва, отделил бы логику от графики а уж потом бы что то и решал.

p.s. Вообще, все эти обработчики событий можно было бы перенести в отдельный класс, в отдельную функцию, к тому же, судя по коду, тут в Label2.Caption присваивается одно и то же значение по нескольку раз а это крайне глупо и в современных проектах не приемлемо.

Последний раз редактировалось vasek123; 13.03.2014 в 12:26.
vasek123 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выполнить функцию в случае нажатия на CheckBox, если данный CheckBox был добавлен через код? PAMAC Microsoft Office Excel 7 21.02.2013 15:33
Работа с Hint'ами MyLastHit Общие вопросы Delphi 11 10.08.2010 23:05
работа с Hint-ами nusik Общие вопросы Delphi 7 01.06.2009 11:26