默认头像
路人甲
路人甲
  • 注册日期2003-09-30
  • 发帖数260
  • QQ173322101
  • 铜币5枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1889回复:2

怎样测量距离?(Delphi)

楼主#
更多 发布于:2004-11-16 12:47

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;

喜欢0 评分0
"血可流,皮鞋不能没有油"
QQ :173322101
默认头像
路人甲
路人甲
  • 注册日期2004-07-03
  • 发帖数78
  • QQ
  • 铜币474枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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就可以了,过程是这样的就行,肯定能运行的.

举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-09-18
  • 发帖数62
  • QQ
  • 铜币155枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-11-23 02:27
举报 回复(0) 喜欢(0)     评分
默认头像

返回顶部