Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Головоломка

Ответить
Настройки темы
Delphi - Головоломка

Аватара для Olessya88

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 28-03-2014
Всем привет. Я сделала головоломку и приложение запускается - но не работает так как нужно. При запуску приложения просто прожимаются все чекбоксы. А нужно чтобы при нажатии 1 чекбокса - менялись другие. Помогите пожалуйста.
Код: Выделить весь код
implementation
var s: boolean;
{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
s:=False;
end;



procedure TForm1.CheckBox1Click(Sender: TObject);
   var Index, i, num: Integer; e: Boolean;
begin
if s then Exit;
s:=True;
for Index:= 0 to 4 do
if Sender=Controls[i] then break;
if not (Controls[Index] as TCheckBox).Checked
then (Controls[Index] as TCheckBox).Checked:=True
else
begin
num:=Index+1;
if Index=4 then num:= 0;
(Controls[num] as TCheckBox).Checked:=not (Controls[num] as TCheckBox).Checked;
 num:=num+1; if Index=3 then num:=0;
(Controls[num] as TCheckBox).Checked :=not (Controls[num] as TCheckBox).Checked;
end;
e:=True;
for i:= 0 to 4 do
e:=e and (Controls[i] as TCheckBox).Checked;
   if e then
  for i:=0 to 4 do begin
(Controls[i] as TCheckBox).Caption:= 'Победа!';
(Controls[i] as TCheckBox).Enabled:=False;
end;
s:=False;
end;



end.

Отправлено: 10:09, 28-03-2014

 

Пользователь


Сообщения: 70
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата Olessya88:
for Index:= 0 to 4 do if Sender=Controls[i] then break; if not (Controls[Index] as TCheckBox).Checked »
Этот кусок сомнителен, потому что
1. i не присвоена, но используется.
2. Index - параметр цикла, но внутри цикла не используется.
3. Цикл кончается оператором break (нет блока begin-end), но дальше используется переменная Index. Так задумано ? Возможно, конечно, но сомнительно.

Вот что получилось, когда я расставил отступы для большей читабельности программы:
Код: Выделить весь код
implementation
var s: boolean;
{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  s:=False;
end;



procedure TForm1.CheckBox1Click(Sender: TObject);
   var Index, i, num: Integer; e: Boolean;
begin
  if s then Exit;
  s:=True;
  for Index:= 0 to 4 do
    if Sender=Controls[i] then break;

  if not (Controls[Index] as TCheckBox).Checked
  then (Controls[Index] as TCheckBox).Checked:=True
  else
  begin
    num:=Index+1;
    if Index=4 then num:= 0;
    (Controls[num] as TCheckBox).Checked:=not (Controls[num] as TCheckBox).Checked;
    num:=num+1; 
    if Index=3 then num:=0;
    (Controls[num] as TCheckBox).Checked :=not (Controls[num] as TCheckBox).Checked;
  end;
  e:=True;
  for i:= 0 to 4 do
    e:=e and (Controls[i] as TCheckBox).Checked;
  if e then
    for i:=0 to 4 do begin
      (Controls[i] as TCheckBox).Caption:= 'Победа!';
      (Controls[i] as TCheckBox).Enabled:=False;
    end;

  s:=False;
end;



end.
Рекомендую всегда так делать, чтобы не запутаться.

-------
Разумный человек приспосабливается к миру, неразумный пытается приспособить мир к себе. Поэтому прогресс делают люди неразумные. (Дж. Б. Шоу)


Последний раз редактировалось Гуллипут, 29-03-2014 в 21:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:21, 29-03-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Olessya88

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я, может туплю конечно, но я не поняла где исправить, что бы заработала программа. То что ты в пример привел мой же текст, исправленный для лучшей читабельности - это понятно. Спасибо за ответ. Но мне бы поконкретнее узнать: что и как исправить....

Отправлено: 10:30, 01-04-2014 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Olessya88, приложи пожалуйста архив с приложением или с "болванкой", что алгоритм "головоломки" остался тайной, а проблемное место - нет.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 20:18, 01-04-2014 | #4


Аватара для Olessya88

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar Новая папка.rar
(308.4 Kb, 26 просмотров)

Вот файлы проекта.

Отправлено: 22:33, 02-04-2014 | #5


Пользователь


Сообщения: 70
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата Гуллипут:
Цитата Olessya88:
for Index:= 0 to 4 do if Sender=Controls[i] then break; if not (Controls[Index] as TCheckBox).Checked »
Этот кусок сомнителен, потому что
1. i не присвоена, но используется.
2. Index - параметр цикла, но внутри цикла не используется.
3. Цикл кончается оператором break (нет блока begin-end), но дальше используется переменная Index. Так задумано ? Возможно, конечно, но сомнительно. »
Объясняю.
Параметр цикла - переменная Index. Наверно, и индексом при обращении к массиву должна быть она же, а не переменная i, которая даже не присвоена к моменту использования.
Кроме того, очень похоже на то, что телом цикла должен быть не один только оператор "if Sender=Controls[i] then break", а и последующие. Но для этого надо всё тело цикла окружить "операторными скобками", то есть командами begin|end ! Я не вникал в алгоритм, тебе виднее, какие именно операторы ты предполагала использовать в качестве тела цикла, поэтому не могу сказать, где ставить "end". Но "begin" должен быть сразу после "do".
Sapienti sat (умному достаточно).

-------
Разумный человек приспосабливается к миру, неразумный пытается приспособить мир к себе. Поэтому прогресс делают люди неразумные. (Дж. Б. Шоу)


Отправлено: 23:45, 02-04-2014 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Головоломка

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Головоломка с DNS и AD CyberDYne Microsoft Windows NT/2000/2003 3 09-08-2011 17:22
Головоломка с str_replace venuko Вебмастеру 14 18-01-2009 21:22




 
Переход