Delphi - Головоломка

Ответить
Аватара пользователя
Olessya88

Delphi - Головоломка

Сообщение Olessya88 »

Всем привет. Я сделала головоломку и приложение запускается - но не работает так как нужно. При запуску приложения просто прожимаются все чекбоксы. А нужно чтобы при нажатии 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.
Аватара пользователя
Гуллипут

Re: Delphi - Головоломка

Сообщение Гуллипут »

Цитата Olessya88:



for Index:= 0 to 4 do if Sender=Controls then break; if not (Controls[Index] as TCheckBox).Checked
Delphi - Головоломка




Этот кусок сомнителен, потому что

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.

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

Re: Delphi - Головоломка

Сообщение Olessya88 »

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

Re: Delphi - Головоломка

Сообщение lxa85 »

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

Re: Delphi - Головоломка

Сообщение Olessya88 »

Вот файлы проекта.
Вложения
Новая папка.rar
(308.41 КБ) 0 скачиваний
Новая папка.rar
(308.41 КБ) 0 скачиваний
Аватара пользователя
Гуллипут

Re: Delphi - Головоломка

Сообщение Гуллипут »

Цитата Гуллипут:



Цитата Olessya88:

for Index:= 0 to 4 do if Sender=Controls then break; if not (Controls[Index] as TCheckBox).Checked »

Этот кусок сомнителен, потому что

1. i не присвоена, но используется.

2. Index - параметр цикла, но внутри цикла не используется.

3. Цикл кончается оператором break (нет блока begin-end), но дальше используется переменная Index. Так задумано ? Возможно, конечно, но сомнительно.
Delphi - Головоломка




Объясняю.

Параметр цикла - переменная Index. Наверно, и индексом при обращении к массиву должна быть она же, а не переменная i, которая даже не присвоена к моменту использования.

Кроме того, очень похоже на то, что телом цикла должен быть не один только оператор "if Sender=Controls then break", а и последующие. Но для этого надо всё тело цикла окружить "операторными скобками", то есть командами begin|end ! Я не вникал в алгоритм, тебе виднее, какие именно операторы ты предполагала использовать в качестве тела цикла, поэтому не могу сказать, где ставить "end". Но "begin" должен быть сразу после "do".

Sapienti sat (умному достаточно).
Ответить

Вернуться в «Программирование и базы данных»