这是一个使用 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
值是易变的,每次获取宏的值时,返回的值都可能是不同的,所以在宏每次出现的位置,都会调用它进行替换。