| 
| 
 | Вопрос # 5 811/ вопрос решён / | 
 |  Здравствуйте, эксперты!При перетягивании формы возникает ошибка "Invalid floating point operation". На форме таймер и TImage. Код процедуры таймера в приложении. Ошибка не возникает, если убрать строку:
 
  img2.Canvas.Ellipse(Round(xr-2),Round(yr+2),Round(xr+2),Round(yr-2));В чем дело и как это можно исправить? Приложение:Переключить в обычный режим {{code}}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]);  r:=130/30;  x:=(-1)*r;  k:=ss;  y:=50;  xk:=1;  yk:=1;  img2.Canvas.Brush.Color:=clLime;  while k<>0 do  begin    xkol:=xkol+xk*1;     if xkol=16 then  begin xk:=-1;xkol:=14;end;     if xkol=-16 then begin xk:=1;xkol:=-14;end;     yk:=xk;    x:=xkol*r;     y:=yk*Sqrt(Abs(Sqr(65)-Sqr(x)));    xr:=x+67;    yr:=67-y;  img2.Canvas.Ellipse(Round(xr-2),Round(yr+2),Round(xr+2),Round(yr-2));    k:=k-1;  end; end;{{/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: Статус вопроса изменён на решённый (изменил автор вопроса — Абрамов Павел) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |