Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 811

Раздел: Delphi » Прочее
/ вопрос решён /

Здравствуйте, эксперты!
При перетягивании формы возникает ошибка "Invalid floating point operation". На форме таймер и TImage. Код процедуры таймера в приложении. Ошибка не возникает, если убрать строку:

 img2.Canvas.Ellipse(Round(xr-2),Round(yr+2),Round(xr+2),Round(yr-2));
В чем дело и как это можно исправить?

Приложение:
  1. {{code}}procedure TForm1.tmr1Timer(Sender: TObject);
  2. var ss,k:integer;
  3. x,y,xk,yr,xr,r,yk,xkol:Real;
  4. s:string;
  5. begin
  6. img2.Canvas.Brush.Color:=clBlack;
  7. img2.Canvas.Pen.Color:=clBlack;
  8. img2.Canvas.Rectangle(0,0,img2.Width,img2.Height);
  9. s:=TimeToStr(Time);
  10. Lbl1.Caption:=s;
  11. ss:=StrToInt(s[7]+s[8]);
  12. r:=130/30;
  13. x:=(-1)*r;
  14. k:=ss;
  15. y:=50;
  16. xk:=1;
  17. yk:=1;
  18. img2.Canvas.Brush.Color:=clLime;
  19. while k<>0 do
  20. begin
  21. xkol:=xkol+xk*1;
  22. if xkol=16 then begin xk:=-1;xkol:=14;end;
  23. if xkol=-16 then begin xk:=1;xkol:=-14;end;
  24. yk:=xk;
  25. x:=xkol*r;
  26.  
  27. y:=yk*Sqrt(Abs(Sqr(65)-Sqr(x)));
  28. xr:=x+67;
  29. yr:=67-y;
  30. img2.Canvas.Ellipse(Round(xr-2),Round(yr+2),Round(xr+2),Round(yr-2));
  31. k:=k-1;
  32. end;
  33.  
  34. end;
  35. {{/code}}


Абрамов Павел Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Абрамов Павел (статус: Посетитель)
Вопрос отправлен: 11 декабря 2011, 23:08
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 13 декабря 2011, 01:51; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 12 декабря 2011, 00:38 [#1]:

Вот смотрю я на код и думаю, откуда берется значение xkol. С другой стороны, xkol - вещественное, а Вы его сравниваете с целым... Такое сравнение будет истинным только в некоторых, совершенного уникальных случаях. А в xkol тем временем будет записан мусор.
Также нужно понимать, что компилятор делфи последнее время стал очень умный. Он смотрит, что строку закомментировали, и значения xr, yr не используются и не вычисляет их. Ну и часть кода выше.
Галочка "подтверждения прочтения" - вселенское зло.
Абрамов Павел

Абрамов Павел (статус: Посетитель), 12 декабря 2011, 01:33 [#2]:

xkol вот тут изменяется. в зависимости от xk увеличивается или уменьшается.
xkol:=xkol+xk*1;
Абрамов Павел

Абрамов Павел (статус: Посетитель), 12 декабря 2011, 01:35 [#3]:

Скажите, а почему при перетаскивании эта ошибка всегда получается? Если форму не трогать, то такая ошибка крайне редко появляется(не получается отследить). А если начать перетаскивать, то при очередном срабатывании таймера обязательно ошибка.
Перетаскивать пытался и другим способом(через MouseMove). Получается то же самое. Если в момент срабатывания таймера(интервал 1 секунда). форма в режиме перемещения, то ошибка 100%
Вадим К

Вадим К (статус: Академик), 12 декабря 2011, 17:45 [#4]:

xkol:=xkol+xk*1;
а начальная инициализация где??? А так как ее нет, то начальное значение может быть любое...

Когда Вы коментируете строку, то компилятор упрощает код где то до такого
procedure TForm1.tmr1Timer(Sender: TObject);
var ss,k:integer;
x,y,xk,yr,xr,r,yk,xkol:Real;
s:string;
begin
 img2.Canvas.Brush.Color:=clBlack;
 img2.Canvas.Pen.Color:=clBlack;
 img2.Canvas.Rectangle(0,0,img2.Width,img2.Height);
  s:=TimeToStr(Time);
  Lbl1.Caption:=s;
  ss:=StrToInt(s[7]+s[8]);
  k:=ss;
  img2.Canvas.Brush.Color:=clLime;
  // подозреваю, что эти четыре строки тоже пропадут, но не факт
  while k<>0 do
  begin
    k:=k-1;
  end;
 
end;

То есть, я с 99% уверен, что проблема именно в неинициализированной переменной xkol. Компилятор за Вас сам не присвоит ей ноль.

Но почему она все же выскакивает при перетаскивании... а в программе ещё код есть или это весь код?
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 12 декабря 2011, 18:57 [#5]:

Проверил, если добавить после begin xkol := 0; то рисует что то правдоподобное.
Галочка "подтверждения прочтения" - вселенское зло.
Абрамов Павел

Абрамов Павел (статус: Посетитель), 13 декабря 2011, 01:51 [#6]:

Я учел все вышесказанное и уменьшил кол-во переменных .остались только самые необходимые. И... ошибок больше нет. Спасибо! Похоже он действительно некоторые переменные пропускал при вычислениях

13 декабря 2011, 01:51: Статус вопроса изменён на решённый (изменил автор вопроса — Абрамов Павел)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.