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

Discussion in 'QDAC' started by swish, Mar 16, 2016.

  1. swish

    swish Moderater Staff Member Moderater

    QMacros 默认是通过宏的开始字符串和结束字符串来区隔宏名称的。但这并不是所有的时候都能满足我们的需要,比如下面的字符串中,我们用 $ 来开始宏名称,遇到非数字时,宏名称就结束:
    Replace $1.Name to $2.Name​
    根据前述规则,$1 和 $2 我们人工就可以解析出两个宏 1 和 2,而由于没有宏结束字符串,QMacros 默认无法判定宏啥时候结束,就需要用户进行干予了。先请看下面的代码:

    Code (Delphi):
    1. procedure TForm6.DoTestMacroNameEnd(ASender: TQMacroManager; p: PQCharW;
    2.   var ALen: Integer; var AType: TQMacroCharType);
    3. begin
    4.   if (p^ < '0') or (p^ > '9') then
    5.   begin
    6.     AType := mctNameEnd;
    7.     ALen := 0;
    8.   end;
    9. end;
    10.  
    11. procedure TForm6.Button8Click(Sender: TObject);
    12. var
    13.   AMgr: TQMacroManager;
    14. begin
    15.   Memo1.Text := 'Replace $1.Name to $2.Name';
    16.   AMgr := TQMacroManager.Create;
    17.   try
    18.     AMgr.OnTestNameEnd := DoTestMacroNameEnd;
    19.     AMgr.Push('1', '第一个');
    20.     AMgr.Push('2', '第二个');
    21.     Memo2.Text := AMgr.Replace(Memo1.Text, '$', '');
    22.   finally
    23.     FreeAndNil(AMgr);
    24.   end;
    25. end;
    我们为 TQMacroManager 实例 AMgr 指定了 OnTestNameEnd 事件的响应,在其中,我们如果检测到非数字,就认为宏名称定义结束,从而为 AMgr 实例对宏名称的解析提供了辅助。好了,我们看上面的代码的实际执行结果:
    kEvhuCEN6WTzcL1tXDAYrb3-_0g9Ehce.jpeg

    当然了,有结束怎么可以没有开始,QMacros 同样提供了一个 OnTestNameStart 事件,允许你自己指定宏的开始。具体就不在这儿展开说明了,大家参考上面的例子,很容易理解。两个事件的参数说明如下:
    • ASender : 触发事件的 TQMacroManager 实例;
    • p :当前解析的字符串位置,用于判定当前字符的类型;
    • ALen :当您判断当前位置的类型为 mctNameStart 或 mctNameEnd 时,返回这个起始或结束标记的长度,以便 TQMacroManager 跳过指定的字符;
    • AType :当前位置的类型
      • mctChar :默认,不需要判断,ALen 的值也不用设置;
      • mctNameStart : 当前位置是宏名称的开始位置,ALen 指定宏名称开始标记的长度;
      • mctNameEnd :当前位置是宏名称的结束位置,ALen 指定宏名称结束标记的长度;
     
    Last edited by a moderator: Nov 29, 2016