自己也没想到QMacros昨天写完,今天就用上了。下面这段代码是将数据库中取出的原来的文件名,使用用户定义的格式模板替换为新的文件名,因为版权的问题,无法直接复制原来的代码,下面的代码是仿原始代码精简的一个版本,供大家参考。
下面的代码中,FFormat默认是 “[流水号]_[原文件名]”,其中,约定的宏定义起始字符串是 “[”,结束字符串是“]”,数据库脚本中取出的字段分别是:
记录号:整数
原文件名:字符串
流水号:记录关联的数据库流水号
var ASavePoint:Integer; ADataSet:TADODataSet; AMacroMgr:TQMacroManager; ANewFileName:String; AFdName:TField; begin AMacroMgr:=TQMacroManager.Create; ADataSet:=TADODataSet.Create; ... ADataSet.DisableControls; try ASavePoint:=AMacroMgr.SavePoint; AFdName:=ADataSet.FieldByName('原文件名'); AMacroMgr.Push(ADataSet,''); while not ADataSet.Eof do begin AOldFileName:=Trim(AFdName.AsString); ANewFileName:=AMacroMgr.Replace(FFormat,'[',']'); if RenameFile(AOldFileName,ANewFileName) then begin //重命名文件处理成功的后续代码 end else begin //重命名文件失败的处理代码 end; ADataSet.Next; end; finally ADataSet.Free; AMacroMgr.Restore(ASavePoint); end; ... AMacroMgr.Free;
其中用到了SavePoint和Restore函数用来保存和恢复现场。
一般来说,你Push一个宏定义时,入栈了一个新值。宏定义始终使用的是新值,如果你重复多次入栈了,可能你自己都搞不清在这些宏不再使用时,该Pop多少个多少次了。而保存点就是实现这一功能的简单方式。
1、在执行Push操作前,调用SavePoint函数获取一个当前的保存点。
2、正常的进行Push入栈操作,然后进行自己的替换操作。
3、调用Restore函数恢复现场到入栈前的状态。
这样,你不需要记住你Push了多少次,也不需要挨个Pop你的宏名称,直接用Restore恢复到开始时记录的保存点就完事了。