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 实例对宏名称的解析提供了辅助。好了,我们看上面的代码的实际执行结果:
当然了,有结束怎么可以没有开始,QMacros 同样提供了一个 OnTestNameStart 事件,允许你自己指定宏的开始。具体就不在这儿展开说明了,大家参考上面的例子,很容易理解。两个事件的参数说明如下:
- ASender : 触发事件的 TQMacroManager 实例;
- p :当前解析的字符串位置,用于判定当前字符的类型;
- ALen :当您判断当前位置的类型为 mctNameStart 或 mctNameEnd 时,返回这个起始或结束标记的长度,以便 TQMacroManager 跳过指定的字符;
- AType :当前位置的类型
- mctChar :默认,不需要判断,ALen 的值也不用设置;
- mctNameStart : 当前位置是宏名称的开始位置,ALen 指定宏名称开始标记的长度;
- mctNameEnd :当前位置是宏名称的结束位置,ALen 指定宏名称结束标记的长度;