烦烦烦!!!谁帮我看一下这段代码,错在哪里 (50分)

  • 主题发起人 主题发起人 彭真
  • 开始时间 开始时间

彭真

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我一调用那个xyscreen2world过程,就会出错,显示无效的float数据,帮我看一下,这几个过程
主要是xyworld2screen ,xyscreen2world和pan
type
TForm1 = class(TForm)
.......................
...........
procedure drawmap;
procedure drawgrid;
end;
type
Tgeodrv =class(Tobject)
private
sScale:single;
screenleft,screentop,screenright,screenbottom:integer;
public
xworldmin,yworldmin,xworldmax,yworldmax:single;
canvas:Tcanvas;
constructor create(Acanvas:Tcanvas);
procedure xyworld2screen(x,y:single;var xx,yy:integer);
virtual;
procedure xyscreen2world(x,y:integer;var xx,yy:single);
virtual;
.........
end;
var
Form1: TForm1;
Gdrv:TGeodrv;
implementation
......
//着两个坐标转换过程怎么总是有错啊???
procedure Tgeodrv.xyworld2screen(x,y:single;var xx,yy:integer);
begin
xx:=trunc((x-xworldmin)*sscale)+screenleft;
yy:=trunc((yworldmax-y)*sscale)+screentop;
end;
procedure Tgeodrv.xyscreen2world(x,y:integer;var xx,yy:single);
begin
xx:=(x-screenleft/sscale+xworldmin);
yy:=yworldmax-(y-screentop)/sscale;
end;

procedure Tform1.drawmap;
begin
Gdrv.clear;
form1.drawgrid;
end;

..........
procedure TForm1.FormCreate(Sender: TObject);
begin
....
gdrv:=tgeodrv.create(form1.PaintBox1.Canvas);
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
var xt,yt:single;
begin
//每次调用都显示出错,真搞不懂。本来是很简单,却不知道错在哪里?
Gdrv.xyscreen2world(x,y,xt,yt);
statusbar1.simpletext:=format('(%d,%d)-(%f,%f)',[x,y,xt,yt]);
end;
end.
 
看的眼都花了
 
拜托,把觉得可能有错的贴出来就行了。
 
昨天来不及了,今天把问题简化了一下,不好意思啊
 
你設斷點跟蹤一下,看看運行的時侯,各變量的值。
 
xx:=trunc((x-xworldmin)*sscale)+screenleft;
yy:=trunc((yworldmax-y)*sscale)+screentop;
跟踪一下这两行xworldmin、sscale之类,看这个值会不会很大,运算结果超出int64的范围
 
可能又2个原因:
溢出;出现负值
 
多人接受答案了。
 
后退
顶部