【注】 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。实际执行效果如下图所示 :