阅读:1891回复:2
怎样测量距离?(Delphi)
<P>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 </P> <P> 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</P> <P> end; end; end;</P> |
|
|
1楼#
发布于:2004-11-23 02:27
<img src="images/post/smile/dvbbs/em01.gif" />
|
|
2楼#
发布于:2004-11-18 22:03
<P>这样不好,我用了这个事件,另外加上mousedown,mousemove事件,做了很好用的标尺工具,跟mapinfor的一样!!</P><P>TRulerMode = (rmFinished,rmProcessing);
TMouseMode = (mmDown,mmMove); TRulerTool = class(Tbasetool) //Tbasetool 没有实际功能,可以换为tobject </P><P>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;</P><P>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;</P><P> 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;</P><P>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;</P><P>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;</P><P>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;</P><P>主要就是这样,因该能看懂,其中有些类如mapcontrol可以不用管,这个只是我的系统的结构的需要,换为TMap就可以了,过程是这样的就行,肯定能运行的.</P> |
|