![]() |
|
|
#1
|
|||
|
|||
|
В упор не вижу в чем проблема. Не могу понять почему выдает ошибку во время работы приложения. Точнее после запуска таймера.
Суть работы заключается в том что бы очистить определенное количество Edit-тов выбрав их случайным образом. Все данные записываются, проверяются. Но все же что-то не так. Если кто-то нашел ошибку, укажите её пожалуйста (вроде как таймер не выключается после окончания или выключается раньше времени) Код:
var
Form1: TForm1;
Box: array [1..9] of Integer;
Rez: array [1..6] of Integer;
Num: array [1..9] of Integer;
Ran: Integer;
Nol: Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
Randomize;
Nol := 9;
for i:=1 to 9 do
(FindComponent('Edit' + IntToStr(i)) as TEdit).Text := IntToStr(Random(10));
for i:=1 to 9 do
Box[i] := StrToInt((FindComponent('Edit' + IntToStr(i)) as TEdit).Text);
Rez[1] := Box[1]+Box[2]+Box[3];
Rez[2] := Box[4]+Box[5]+Box[6];
Rez[3] := Box[7]+Box[8]+Box[9];
Rez[4] := Box[1]+Box[4]+Box[7];
Rez[5] := Box[2]+Box[5]+Box[8];
Rez[6] := Box[3]+Box[6]+Box[9];
for i:=1 to 6 do
(FindComponent('Label' + IntToStr(i)) as TLabel).Caption := IntToStr(Rez[i]);
for i:=1 to 9 do
Num[i] := 1;
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
Ran := Random(10);
if Ran > 0 then
begin
if Num[Ran] = 1 then
begin
(FindComponent('Edit' + IntToStr(Ran)) as TEdit).Text := '?';
Num[Ran] := 0;
Nol := Nol - 1;
if Nol = StrToInt(Edit1.Text) then
begin
Timer1.Enabled := False;
ShowMessage('GO!');
end;
end;
end;
end; |
|
#2
|
||||
|
||||
|
Код:
IntToStr(Random(10)); Код:
IntToStr(Random(9) + 1); |
|
#3
|
||||
|
||||
|
(FindComponent('Edit' + IntToStr(Ran)) as TEdit).Text := '?';
.............. Box[i] := StrToInt((FindComponent('Edit' + IntToStr(i)) as TEdit).Text); Конвертируешь '?' в число, вот и ошибка Последний раз редактировалось YVitaliy, 23.12.2011 в 23:54. |
|
#4
|
||||
|
||||
|
Нужно весь проект глянуть, а тут почти, всё норм:
Код:
for i:=1 to 9 do
(FindComponent('Edit' + IntToStr(i)) as TEdit).Text := IntToStr(Random(10));
for i:=1 to 9 do
Box[i] := StrToInt((FindComponent('Edit' + IntToStr(i)) as TEdit).Text); |
|
#5
|
||||
|
||||
|
Нетак, так так:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
Ran := Random(10);
if Ran > 0 then
begin
if Num[Ran] = 1 then
begin
(FindComponent('Edit' + IntToStr(Ran)) as TEdit).Text := '?';
Num[Ran] := 0;
Nol := Nol - 1;
if Nol = StrToInt(Edit1.Text) then
begin
Timer1.Enabled := False;
ShowMessage('GO!');
end;
end;
end;
end; |
| Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Kaktuz (24.12.2011)
| ||
|
#6
|
|||
|
|||
|
Нашел загвоздку.
if Nol = StrToInt(Edit1.Text) then Как я и писал в начале. Таймер не выключается и это приводит к ошибке. Исправил на Edit9 в котором указываю нужное мне число. И все равно ошибка! Только есть написать не изменяющееся число (if Nol = 4 then), тогда правильно работает. Но мне то нужно изменять. |
|
#7
|
|||
|
|||
|
Все. Разобрался.
Всем спасибо за активную помощь!Цитата:
![]() |
|
#8
|
|||
|
|||
|
Появился один небольшой нюанс. Когда очищаешь некоторые боксы, то проверка выдает ошибку.
Как бы его правильно проверить. Может что-то вроде if Box[1] and Box[2] ... <> ' ' then (хотя видно где-то я ошибся тут в чем-то) Код:
if Box[1] = StrToInt(Edit1.Text) then
if Box[2] = StrToInt(Edit2.Text) then
if Box[3] = StrToInt(Edit3.Text) then
if Box[4] = StrToInt(Edit4.Text) then
if Box[5] = StrToInt(Edit5.Text) then
if Box[6] = StrToInt(Edit6.Text) then
if Box[7] = StrToInt(Edit7.Text) then
if Box[8] = StrToInt(Edit8.Text) then
if Box[9] = StrToInt(Edit9.Text) then
begin
Timer2.Enabled := False;
MessageBeep(mb_IconAsterisk);
ShowMessage('Ãîòîâî!!!');
end; |
|
#9
|
||||
|
||||
|
Как я уже говорил, вся проблема у теба в ф-ции StrToInt(Edit1.Text).
Если неуверен, что в текстовых полях 100% - число, то или используй ф-цию StrToIntDef(Edit1.Text,{значение по умолчанию}), или предварительно конвертируй значения полей в отдельный массив Box1 с помощью процедуры Val(Edit1.Text,Box1[i],err), и если err<>0 то отменять действие... |
|
#10
|
||||
|
||||
|
Код:
var err,err1,i:integer;
Box1: array [1..9] of Integer;
b:Boolean;
begin
..........................
err1:=0;
for i:=1 to 9 do begin
val((FindComponent('Edit' + IntToStr(i)) as TEdit).Text,Box1[i],err);
err1:=err1+err;
end;
if err1=0 then begin
b:=true;
for i:=1 to 9 do
b:=(b) and (Box1[i]=Box[i]);
if b then begin
Timer2.Enabled := False;
MessageBeep(mb_IconAsterisk);
ShowMessage('Ãîòîâî!!!');
end;
end;
end; |
|
#11
|
|||
|
|||
|
У меня Delphi ругается на StrToIntDef.
А код. Да. Я попросту заменил Box (Integer) на Box (String) и все нормально заработало. |