我正在创建一个拍摄屏幕快照的程序,并将其作为位图图片保存到文件夹中。我似乎遇到了一个问题,图片只是覆盖了自己。
任何人都可以告诉我如何保存它,这个数字会比最后一个高吗?例如:Save 1:Screenshot0001.bmp Save 2:Screenshot0002.bmp 保存3:截图0003.bmp
等等。
答案 0 :(得分:14)
有很多方法可以实现这样的目标。
就像你的数码相机一样;有一个计数器并将其保存在文件或注册表中。你可能会遇到多用户问题,你仍然需要处理图像已经存在的情况。
不要使用递增数字,而是在文件名中写入日期时间。 FileName:='Screenshot _'+ FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());
执行以下代码查找最新号码。我认为这就是您所描述的内容,但请记住,当您编写更多图像时,此代码会变慢。有数千张图片和慢速驱动器或网络,它可能会“挂起”您的程序。
...
i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
inc(i);
答案 1 :(得分:2)
在程序启动时,迭代所有Screenshot * .bmp文件,解析数字部分并找到最高 - 将此值分配给您的计数器。在进行快照时,进入一个循环,尝试使用“仅创建,如果不存在”(CREATE_NEW)语义来破坏Screenshot.bmp,递增计数器直到找到未使用的名称。
或者,使用timestamp而不是counter:)
答案 2 :(得分:0)
您需要这样的例程来模仿Windows文件复制,其中第一个文件是“我的文件”,第二个是“我的文件(2)”,然后是“我的文件(3)”等。
function AppendDuplicationNumber( const AStr : string ) : string;
// Used to make strings unique
// This examines the string AStr for trailing '(n)' where
// 'n' is an integer.
// If the (n) part is found, n is incremented, otherwise '(2)' is
// appended to the string.
var
iLH, iRH, I : integer;
S : string;
begin
Result := AStr;
iLH := CharPosBackwards( '(', Result );
If iLH > 0 then
begin
iRH := PosEx( ')', Result, iLH );
If iRH > 0 then
begin
I := StrToIntDef( Copy( Result, iLH+1, iRH-iLH-1 ), 0 );
If I > 0 then
begin
Inc(I);
S := IntToStr( I );
Delete( Result, iLH+1, iRH-iLH-1 );
Insert( S, Result, iLH+1 );
Exit;
end;
end;
end;
// Did not increment existing (n), so append it.
Result := Result + ' (2)';
end;