|
Вопрос # 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: Статус вопроса изменён на решённый (изменил автор вопроса — Абрамов Павел)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|