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

