[QMacros] 一个参数化宏替换的示例代码

【注】 QMacros 已经内置了参数化的支持,请大家参考 :[QMacros] 更新:新增内置的参数化宏定义支持

下面的代码是给群里的一位朋友写的 QMacros 的一个简单的示例,通过参数控制宏替换时的值的范围。但这个代码只是一个简单的示例,创建的 PRangeMacro 实例未在最后释放,请大家使用时,自行加上相关的代码。

type
  TRangeMacro = record
    StartChar, StopChar: WideChar;
  end;

  PRangeMacro = ^TRangeMacro;

procedure TForm1.Button1Click(Sender: TObject);
var
  AMacros: TQMacroManager;
begin
  AMacros := TQMacroManager.Create;
  try
    AMacros.SetOnMacroMiss(
      procedure(ASender: TQMacroManager; AName: QStringW; const AQuoter: QCharW;
        var AHandled: Boolean)
      var
        AParam: String;
        AStartChar, AStopChar: WideChar;
        p: PWideChar;
        AItem: PRangeMacro;
      begin
        AParam := ValueOfW(AName, ':');
        if Length(AParam) > 0 then // 参数化
        begin
          p := PWideChar(AParam);
          if StartWithW(p, '[', true) then
          begin
            New(AItem);
            Inc(p);
            AItem.StartChar := p^;
            Inc(p);
            if p^ = '-' then
            begin
              Inc(p);
              AItem.StopChar := p^;
            end
            else if p^ = '\' then
            begin
              Inc(p);
              AItem.StopChar := p^;
            end
            else
              AItem.StopChar := p^;
            Inc(p);
            if p^ = ']' then
            begin
              AHandled := true;
              ASender.Push(AName,
                procedure(AMacro: TQMacroItem; const AQuoter: QCharW)
                var
                  I: Integer;
                  ARange: PRangeMacro;
                begin
                  ARange := PRangeMacro(AMacro.Value.Tag);
                  AMacro.Value.Value:= WideChar(Ord(ARange.StartChar) +
                    random(Ord(ARange.StopChar) - Ord(ARange.StartChar)));
                end, mvVolatile, IntPtr(AItem));
            end;
          end;
        end;
      end);
    Edit1.Text:=AMacros.Replace('186(D2:[2-9])45','(',')',0);
  finally
    FreeAndNil(AMacros);
  end;
end;

上面的代码给定了格式为 宏名称:[字符范围] 这样子的格式,字符范围做为宏每次返回值的控制参数。

Edit1.Text:=AMacros.Replace(‘186(D2:[2-9])45’,'(‘,’)’,0);

这句代码要每次替换时,186 后面跟2-9之间的任意数字,然后再后面跟的是45。实际执行效果如下图所示 :

paramedmacros

分享到: