自己也没想到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恢复到开始时记录的保存点就完事了。
