Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2011, 23:41
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию Ошибка - таймер

В упор не вижу в чем проблема. Не могу понять почему выдает ошибку во время работы приложения. Точнее после запуска таймера.
Суть работы заключается в том что бы очистить определенное количество 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  
Старый 23.12.2011, 23:49
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
  IntToStr(Random(10));
Вернёт числа в диапазоне 0..9. Замени на
Код:
  IntToStr(Random(9) + 1);
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 23.12.2011, 23:51
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

(FindComponent('Edit' + IntToStr(Ran)) as TEdit).Text := '?';
..............
Box[i] := StrToInt((FindComponent('Edit' + IntToStr(i)) as TEdit).Text);

Конвертируешь '?' в число, вот и ошибка

Последний раз редактировалось YVitaliy, 23.12.2011 в 23:54.
Ответить с цитированием
  #4  
Старый 23.12.2011, 23:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Нужно весь проект глянуть, а тут почти, всё норм:
Код:
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);
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 24.12.2011, 00:05
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Нетак, так так:
Код:
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;
В любом случае символ '?' неуместен, или использовать ф-цию StrToIntDef
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
Kaktuz (24.12.2011)
  #6  
Старый 24.12.2011, 00:29
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Нашел загвоздку.
if Nol = StrToInt(Edit1.Text) then
Как я и писал в начале. Таймер не выключается и это приводит к ошибке.
Исправил на Edit9 в котором указываю нужное мне число. И все равно ошибка! Только есть написать не изменяющееся число (if Nol = 4 then), тогда правильно работает. Но мне то нужно изменять.
Ответить с цитированием
  #7  
Старый 24.12.2011, 00:33
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Все. Разобрался. Всем спасибо за активную помощь!

Цитата:
Сообщение от angvelem
Нужно весь проект глянуть, а тут почти, всё норм:
А это и есть весь проект
Ответить с цитированием
  #8  
Старый 24.12.2011, 09:03
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Появился один небольшой нюанс. Когда очищаешь некоторые боксы, то проверка выдает ошибку.
Как бы его правильно проверить. Может что-то вроде
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  
Старый 24.12.2011, 16:02
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Как я уже говорил, вся проблема у теба в ф-ции StrToInt(Edit1.Text).
Если неуверен, что в текстовых полях 100% - число, то или используй ф-цию StrToIntDef(Edit1.Text,{значение по умолчанию}), или предварительно конвертируй значения полей в отдельный массив Box1 с помощью процедуры Val(Edit1.Text,Box1[i],err), и если err<>0 то отменять действие...
Ответить с цитированием
  #10  
Старый 24.12.2011, 16:12
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Код:
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  
Старый 24.12.2011, 18:41
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

У меня Delphi ругается на StrToIntDef.
А код. Да. Я попросту заменил Box (Integer) на Box (String) и все нормально заработало.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025