画圆圈报错(MapX4.5) (50分)

  • 主题发起人 主题发起人 popi
  • 开始时间 开始时间
P

popi

Unregistered / Unconfirmed
GUEST, unregistred user!
在运行到ftNewObj:=MapMain.FeatureFactory.CreateCircularRegion时报错“点对象无效”,不知道是什么原因,这函数我初始化画圆时是对的,但程序运转之后当接受到画圆信息后开始报错。传进去的A_ftCurrent是我预先创建这些图元时保存好的值,跟踪过是对的和一开始初始化值一样!
请各位大虾帮忙~
procedure TfrmMain.DrawCirCle(A_ftCurrent:Variant;A_Radius1,A_Radius2,A_Radius3:Double);
var
lyrCurr,ftNewObj,ftNew:Variant;
pt:Variant;
begin

pt:=CreateOleObject('MapX.Point.4');
pt.Set(A_ftCurrent.CenterX,A_ftCurrent.CenterY);
lyrCurr:=MapMain.Layers.Item(gDrawLayerName);
FeatureInfLink.HasCirCle:=True;
//在图元点周边画三个红色圆
lyrCurr.style.RegionPattern:=0;
lyrCurr.style.regiontransparent:=true;
lyrCurr.style.regionborderwidth:=2;
lyrCurr.style.regionbordercolor:=miColorRed;
ftNewObj:=MapMain.FeatureFactory.CreateCircularRegion(0,pt,A_RADIUS1,miUnitmeter,EmptyParam,lyrCurr.Style);//报错
ftNew:=lyrCurr.AddFeature(ftNewObj);
FeatureInfLink.ftOneCircle:=ftNew;
ftNewObj:=MapMain.FeatureFactory.CreateCircularRegion(0,pt,A_RADIUS2,miUnitmeter,400,lyrCurr.Style);
ftNew:=lyrCurr.AddFeature(ftNewObj);
FeatureInfLink.ftTwoCircle:=ftNew;
ftNewObj:=MapMain.FeatureFactory.CreateCircularRegion(0,pt,A_RADIUS3,miUnitmeter,EmptyParam,lyrCurr.Style);
ftNew:=lyrCurr.AddFeature(ftNewObj);
FeatureInfLink.ftThreeCircle:=ftNew;
//MapMain.ZoomTo(gFindZoom,A_ftCurrent.CenterX,A_ftCurrent.CenterY);
A_ftCurrent.Style.SymbolBitmapName:='DoorOpen.bmp';
A_ftCurrent.Update;
varClear(pt);
end;
 
第一,你要把A_ftCurrent传出去,你的过程修改为:
procedure TfrmMain.DrawCirCle(var A_ftCurrent:Variant;
A_Radius1, A_Radius2, A_Radius3:do
uble);
第二,你把pt的修改试一下使用。
var pt:Point;(定义)
pt:=coPoint.Create;
pt.Set 改为pt.Set_
第三,你的点的坐标是不是经纬度坐标?
你可以将CreateCircularRegion(0,改为CreateCircularRegion(1,
//0-- miCircleTypeScreen, 1--miCircleTypeMap
还有A_ftCurrent.Style.SymbolBitmapName:='DoorOpen.bmp';这句话也可能有问题!好像不能这样设置。
 
不行,我试了,问题我觉得应该是pt这个点有问题,但不知道怎么解决。
这函数我初始化画圆时也是多次调用此函数,是对的呀,但程序运转之后当接受到画圆协议后开始调用此函数时报错,晕~
ftNewObj:=MapMain.FeatureFactory.CreateCircularRegion(0,pt,A_RADIUS1,miUnitmeter,EmptyParam,lyrCurr.Style);//报错
后面的可以不理的,就在此就报错了
 
上面这句代码本身没什么问题,但你用了很多的Variant变量,没有人工释放。
建议将Variant类型改为确定的类型,或者将Variant变量人工释放。
 
已经搞定了,跟这段代码没有关系,是因为我在线程里直接调用此函数,而没有使用Synchronize,谢谢~
 
后退
顶部