PDA

Показать полную графическую версию : Головоломка


Olessya88
28-03-2014, 10:09
Всем привет. Я сделала головоломку и приложение запускается - но не работает так как нужно. При запуску приложения просто прожимаются все чекбоксы. А нужно чтобы при нажатии 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.

Гуллипут
29-03-2014, 21:21
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.


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

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

lxa85
01-04-2014, 20:18
Olessya88, приложи пожалуйста архив с приложением или с "болванкой", что алгоритм "головоломки" остался тайной, а проблемное место - нет.

Olessya88
02-04-2014, 22:33
Вот файлы проекта.

Гуллипут
02-04-2014, 23:45
Цитата 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 (умному достаточно).




© OSzone.net 2001-2012