[QMacros]使用 QMacros 生成流水号命名文件

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