[QMacros] 使用模板生成随机电话号码

这是一个使用 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 这样的号码,我们看运行的结果:

QQ截图20150522151731实际上,上面的代码就是 Push 了一个回调函数,由于在 Push 时没有指定宏的易变性,所以 QMacros 就认为它是一个易变的宏,每执行一次替换时都会调用回调函数来生成新值,从而达到生成随机号码的效果。

由此,我们再回顾上 QMacros 宏的易变性:

  • mvImmutable
    值是固定不变的,是一种常量状态,它会在你Push时直接调用返回固定的值,然后在编译宏表达式时直接完成替换工作,而不是在实际替换时再替换。
  • mvStable
    值是相对不变的,它在一次替换操作过程中,在第一次出现的位置调用一次,然后再出现就会直接使用。
  • mvVolatile
    值是易变的,每次获取宏的值时,返回的值都可能是不同的,所以在宏每次出现的位置,都会调用它进行替换。

 

分享到: