这是一个使用 QMacros 的 Volatile 类型的宏来实现的小例子,首先我们看代码:
procedure TfrmMain.Button1Click(Sender: TObject);
var
AMacros: TQMacroManager;
AReplace:TQMacroComplied;
I: Integer;
begin
AMacros := TQMacroManager.Create;
AMacros.Push('n',
procedure(AMacro: TQMacroItem; const AQuoter: QCharW)
begin
AMacro.Value.Value := IntToStr(Random(10));
end);
Memo1.Lines.Add('替换 186[n][n][n][n]5678 十次的结果');
AReplace:=AMacros.Complie('186[n][n][n][n]5678','[',']');
for I := 0 to 9 do
begin
Memo1.Lines.Add(AReplace.Replace);
end;
FreeObject(AReplace);
FreeObject(AMacros);
end;
上面的代码将 186[n][n][n][n]5678 中的 [n] 每次替换为一个随机的 0-9 之间的数字,然后形成 186xxxx5678 这样的号码,我们看运行的结果:
实际上,上面的代码就是 Push 了一个回调函数,由于在 Push 时没有指定宏的易变性,所以 QMacros 就认为它是一个易变的宏,每执行一次替换时都会调用回调函数来生成新值,从而达到生成随机号码的效果。
由此,我们再回顾上 QMacros 宏的易变性:
- mvImmutable
值是固定不变的,是一种常量状态,它会在你Push时直接调用返回固定的值,然后在编译宏表达式时直接完成替换工作,而不是在实际替换时再替换。 - mvStable
值是相对不变的,它在一次替换操作过程中,在第一次出现的位置调用一次,然后再出现就会直接使用。 - mvVolatile
值是易变的,每次获取宏的值时,返回的值都可能是不同的,所以在宏每次出现的位置,都会调用它进行替换。
