阅读:1889回复:2
怎样测量距离?(Delphi)procedure TForm1.Map1PolyToolUsed(Sender: TObject; ToolNum: Smallint; Flags: Integer; const Points: IDispatch; bShift, bCtrl: WordBool; var EnableDefault: WordBool); var DisSum:Double; Dis:Double; x1,y1,x2,y2:Double; pts:MapXLib_TLB.points; i:integer; begin pts:=copoints.create; //这以步出错,怎么才能把Idispatch转换成points类型。或者用其他方法实现距离测量。 pts:=Points as MapXLib_TlB.CoPoints; dissum:=0; edit1.Text:=floattostr(dissum); case flags of mipolytoolbegin: begin end; mipolytoolinprogress: begin if toolnum=cdistance then for i:=0 to pts.Count-1 do begin x1:=pts.Item.X; y1:=pts.Item.Y; x2:=pts.Item[i+1].X; y2:=pts.Item[i+1].Y; dis:=map1.Distance(x1,y1,x2,y2); dissum:=dissum+dis; edit1.Text:=floattostr(dissum); end; end; mipolytoolend: begin end; end; end; |
|
|
1楼#
发布于:2004-11-18 22:03
这样不好,我用了这个事件,另外加上mousedown,mousemove事件,做了很好用的标尺工具,跟mapinfor的一样!! TRulerMode = (rmFinished,rmProcessing); TMouseMode = (mmDown,mmMove); TRulerTool = class(Tbasetool) //Tbasetool 没有实际功能,可以换为tobject private FRulerFrm: TRulerFrm; FXDown, FYDown: Double; //记录鼠标按下的地图坐标 FXMove, FYMove: Double; //记录鼠标移到的地图坐标 FRulerMode : TRulerMode; //记录标尺的模式是处于进行状态还是完成状态 FRuleCurrDistance: Double; //记录当前两点之间的距离 FRulePastDistance: Double; //记录已经经过的距离距离 public constructor Create(const Val: TMyMap); override; destructor Destroy; override; procedure Execute(X, Y: Integer; Button: TMouseButton; Mode: TMouseMode); overload; property RulerMode: TRulerMode read FRulerMode write FRulerMode; end; procedure TRulerTool.Execute(X, Y: Integer; Button: TMouseButton; Mode: TMouseMode); var X1,Y1: Single; begin inherited; X1:= X/1.0; Y1:= Y/1.0; FMap.MapUnit:= miUnitKilometer; if (Mode = mmDown) and (Button = mbleft) then begin FMap.ConvertCoord(X1,Y1,FXDown,FYDown,miScreenToMap); if FRulerMode = rmFinished then FRulePastDistance:=0; FRulerMode:= rmProcessing; FRulePastDistance:= FRulePastDistance+FRuleCurrDistance; if not FRulerFrm.Visible then FRulerFrm.Visible:= True; end; if (Mode = mmMove) and (FRulerMode = rmProcessing) then begin FMap.ConvertCoord(X1,Y1,FXMove,FYMove,miScreenToMap); FRuleCurrDistance:= FMap.Distance(FXDown, FYDown, FXMove,FYMove); FRulerFrm.Edit1.Text:= FloatToStr(FRuleCurrDistance); FRulerFrm.Edit2.Text:= FloatToStr(FRuleCurrDistance+FRulePastDistance); end; end; procedure TMapControl.MyMapMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FMap.CurrentTool = miRulerTool then FToolManage.RulerTool.Execute(X,Y,Button,mmDown); end; procedure TMapControl.MyMapMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Button: TMouseButton; begin if FMap.CurrentTool = miRulerTool then FToolManage.RulerTool.Execute(X,Y,mbLeft,mmMove); //mbLeft没有实际意义,只是作为参数 end; procedure TMapControl.MyMapPolyToolUsed(ASender: TObject; ToolNum: Smallint; Flags: Integer; const Points: IDispatch; bShift, bCtrl: WordBool; var EnableDefault: WordBool); begin if (ToolNum = 107) and (flags = 1)then FToolManage.RulerTool.RulerMode:= rmFinished; end; 主要就是这样,因该能看懂,其中有些类如mapcontrol可以不用管,这个只是我的系统的结构的需要,换为TMap就可以了,过程是这样的就行,肯定能运行的. |
|
2楼#
发布于:2004-11-23 02:27
![]() |
|