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

怎样测量距离?(Delphi)

楼主#
更多 发布于:2004-11-16 12:47
<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>
喜欢0 评分0
"血可流,皮鞋不能没有油"
QQ :173322101
giggs12347
路人甲
路人甲
  • 注册日期2004-09-18
  • 发帖数62
  • QQ
  • 铜币155枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-11-23 02:27
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
mrjiou
路人甲
路人甲
  • 注册日期2004-07-03
  • 发帖数78
  • QQ
  • 铜币474枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部