delphi mapx测距问题,运行的时候每当我点到第二个点到时候开始报错list index out of bounds下标越界

下面是完整代码,求高人指点,在网上找了一上午 没找到解决方法,在下是新手,刚接触gis 求大侠们不吝赐教,谢谢了……非常感谢!!
unit gis1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MapXLib_TLB, ComCtrls;

type
TForm1 = class(TForm)
Map1: TMap;
Button1: TButton;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure Map1PolyToolUsed(Sender: TObject; ToolNum: Smallint;
Flags: Integer; const Points: IDispatch; bShift, bCtrl: WordBool;
var EnableDefault: WordBool);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

const
MYTOOL_DISTANCE=100;

implementation

{$R *.dfm}
//{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.FormCreate(Sender: TObject);
begin
map1.CurrentTool:=miPanTool;
Map1.CreateCustomTool(MYTOOL_DISTANCE, miToolTypePoly,miCrossCursor, EmptyParam, EmptyParam, EmptyParam);
end;

procedure TForm1.Map1PolyToolUsed(Sender: TObject; ToolNum: Smallint;
Flags: Integer; const Points: IDispatch; bShift, bCtrl: WordBool;
var EnableDefault: WordBool);
var
DisSum : Double ;
i: Integer;
x1, y1, x2 , y2: Double ;
begin
DisSum:=0;
if Flags=miPolyToolInProgress then
begin
if ToolNum= MYTOOL_DISTANCE then
begin
for i:=1 to CMapXPoints(Points).Count-1 do //应该就是for循环这一片的问题
begin
x1:=CMapXPoints(Points).Item[i].X;
y1:=CMapXPoints(Points).Item[i].Y;
x2:=CMapXPoints(Points).Item[i+1].X;
y2:=CMapXPoints(Points).Item[i+1].Y;
DisSum:=DisSum+Map1.Distance(x1,y1,x2,y2);
end;
Statusbar1.Panels[0].Text:=floattostr(dissum);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
map1.CurrentTool :=MYTOOL_DISTANCE;

end;

end.

1、 for i:=1 to CMapXPoints(Points).Count-1 do //应该就是for循环这一片的问题
看一下:CMapXPoints(Points).Count-1 =?
x2:=CMapXPoints(Points).Item[i+1].X;
y2:=CMapXPoints(Points).Item[i+1].Y;
Item[i+1]????
2、既然怀疑在这部分出问题了,你可以试着修改数组相关的变量,或者单行屏蔽程序执行看下到底是哪个出的问题啊追问

多谢你的回答,已经解决了 谢谢!

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-23
-- 根据这个语句 for i:=1 to CMapXPoints(Points).Count-1 do
CMapXPoints(Points).Item的下标应该是从0开始的。
另外取值的时候先判断一下i、i+1是否大于CMapXPoints(Points).Item的下标。追问

多谢你的回答,已经解决了 谢谢!

第2个回答  2011-09-22
比如说我做了个窗体,如果实现程序运行时自动点击窗体中的某个点,如坐标(用以下函数实现^_^(虽然是C 定义写法,但是Delphi定义与之相同) VOID mouse追问

多谢你的回答,已经解决了 谢谢!

第3个回答  2011-09-23
用以下函数实现^_^(虽然是C++定义写法,但是Delphi定义与之相同)
VOID mouse_event( DWORD dwFlags,
DWORD dx,
DWORD dy,
DWORD dwData,
ULONG_PTR dwExtraInfo
);

参数说明一下:)
dwFlags 指定鼠标的动作,移动或者点击,可有以下参数
MOUSEEVENTF_ABSOLUTE 指定其后参数dx,dy为绝对坐标,否则为相对坐标
MOUSEEVENTF_MOVE 指定移动鼠标
MOUSEEVENTF_LEFTDOWN 指定鼠标左键按下
MOUSEEVENTF_LEFTUP 指定鼠标左键弹起
dx,dy 指定了鼠标的坐标,如果第一个参数有MOUSEEVENTF_ABSOLUTE 则为绝对坐标,否则为相对坐标。
最后两个参数一般设为0,具体解释请参考MSDN或Delphi帮助。

如果需要程序运行时自动点击窗体中某个点,首先需要获取该点的绝对坐标(相对于整个屏幕),一般是将窗体的坐标+上窗体内的坐标。如(50,50)的绝对坐标可能是(Form1.Left+50,Form1.Top+50),此值不一定准确,需要自己修正。
mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE,Form1.Left+50,Form1.Top+50,0,0);

mouse_event(MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE,Form1.Left+50,Form1.Top+50,0,0);
这样就可以实现模拟鼠标点击的效果。

追问

多谢你的回答,已经解决了 谢谢!

...运行的时候每当我点到第二个点到时候开始报错list index out...
2、既然怀疑在这部分出问题了,你可以试着修改数组相关的变量,或者单行屏蔽程序执行看下到底是哪个出的问题啊

相似回答
大家正在搜