[QMacros] 更新:增加对用户自定义规则的宏名称解析的支持

QMacros 默认是通过宏的开始字符串和结束字符串来区隔宏名称的。但这并不是所有的时候都能满足我们的需要,比如下面的字符串中,我们用 $ 来开始宏名称,遇到非数字时,宏名称就结束:

Replace $1.Name to $2.Name

根据前述规则,$1 和 $2 我们人工就可以解析出两个宏 1 和 2,而由于没有宏结束字符串,QMacros 默认无法判定宏啥时候结束,就需要用户进行干予了。先请看下面的代码:

procedure TForm6.DoTestMacroNameEnd(ASender: TQMacroManager; p: PQCharW;
  var ALen: Integer; var AType: TQMacroCharType);
begin
  if (p^ < '0') or (p^ > '9') then
  begin
    AType := mctNameEnd;
    ALen := 0;
  end;
end;

procedure TForm6.Button8Click(Sender: TObject);
var
  AMgr: TQMacroManager;
begin
  Memo1.Text := 'Replace $1.Name to $2.Name';
  AMgr := TQMacroManager.Create;
  try
    AMgr.OnTestNameEnd := DoTestMacroNameEnd;
    AMgr.Push('1', '第一个');
    AMgr.Push('2', '第二个');
    Memo2.Text := AMgr.Replace(Memo1.Text, '$', '');
  finally
    FreeAndNil(AMgr);
  end;
end;

我们为 TQMacroManager 实例 AMgr 指定了 OnTestNameEnd 事件的响应,在其中,我们如果检测到非数字,就认为宏名称定义结束,从而为 AMgr 实例对宏名称的解析提供了辅助。好了,我们看上面的代码的实际执行结果:

qmacrouserending

当然了,有结束怎么可以没有开始,QMacros 同样提供了一个 OnTestNameStart 事件,允许你自己指定宏的开始。具体就不在这儿展开说明了,大家参考上面的例子,很容易理解。两个事件的参数说明如下:

  • ASender : 触发事件的 TQMacroManager 实例;
  • p :当前解析的字符串位置,用于判定当前字符的类型;
  • ALen :当您判断当前位置的类型为 mctNameStart 或 mctNameEnd 时,返回这个起始或结束标记的长度,以便 TQMacroManager 跳过指定的字符;
  • AType :当前位置的类型
    • mctChar :默认,不需要判断,ALen 的值也不用设置;
    • mctNameStart : 当前位置是宏名称的开始位置,ALen 指定宏名称开始标记的长度;
    • mctNameEnd :当前位置是宏名称的结束位置,ALen 指定宏名称结束标记的长度;
分享到: