[QMacros] 使用宏替换在百度地图上加标注

这段代码是我实际使用的一段代码,贴出来分享给大家。

procedure TBaiduMapMarker.Changed;
var
  S: String;
  ASavePoint: Integer;
const
  STempate: String = 'if(typeof(%MarkerName%) != ''undefined'')'#13#10 +
  // 定义了就直接设置属性
    '  {'#13#10 +
    '  %MarkerName%.setPosition(new BMap.Point(%Pos_Lng%,%Pos_Lat%));'#13#10 +
  // 位置
    '  %MarkerName%.setAnimation(%Animation%);'#13#10 + // 动画
    '  }'#13#10 + //
    'else'#13#10 + // 未定义就添加
    '  {'#13#10 +
    '  %MarkerName%=new BMap.Marker(new BMap.Point(%Pos_Lng%,%Pos_Lat%));'#13#10
    + // 位置
    '  map.addOverlay(%MarkerName%);'#13#10 + // 添加图层
    '  %MarkerName%.setAnimation(%Animation%);'#13#10 + // 添加完成
    '  }' + 'if(%Dragable%)'#13#10 + // 需要拖拽
    ' %MarkerName%.enableDragging();'#13#10 + // 启用
    'else'#13#10 + //
    ' %MarkerName%.disableDragging();'#13#10; // 禁用
begin
  if not Owner.JSVars.Defined[Name] then
    Owner.JSVars.ExecuteScript('var ' + Name);
  with (Owner as TBaiduMapProvider).FMacros do
  begin
    ASavePoint := SavePoint;
    try
      Push('Pos_Lat', FloatToStr(Position.Lat));
      Push('Pos_Lng', FloatToStr(Position.Lng));
      Push('MarkerName', Name);
      if Animate then
        Push('Animation', 'BMAP_ANIMATION_BOUNCE')
      else
        Push('Animation', 'null');
      if Dragable then
        Push('Dragable', 'true')
      else
        Push('Dragable', 'false');
      S := Replace(STempate, '%', '%');
      Owner.JSVars.ExecuteScript(S);
    finally
      Restore(ASavePoint);
    end;
  end;
end;

这段代码的功能是在百度地图上,添加一个 marker 标记出指定的位置。当然这段代码你没法直接执行,因为缺少完整的定义,不过可以看出来如何在代码中通过 QMacros 将代码与脚本的模板进行分离。在调用 Replace 将宏替换为具体的值以后,将其交付浏览器执行,就可以方便的百度地图上添加标记了。下面是运行效果的一个截图:

QMacrosBaidumap

分享到: