题
我在做一个程序,需要一个照屏幕上,并将其保存一个文件夹作为一位画面。我似乎可以跑到一个问题,虽然,该图仅仅是复盖本身。
任何人都可以告诉我,我怎么能让它因此,当它可以节省,这个数字将是一个高于去?例如:节省1:Screenshot0001.bmp节省2:Screenshot0002.bmp 节省3:Screenshot0003.bmp
等等。
解决方案
有许多方法来完成这样的东西。
不喜欢你的数码相机不;有一个计数器并保存在一个文件中,或在注册表中。你可能会遇到的多用户问题,你会仍然必须处理的情况下的图像已经存在。
不要使用增加的数字,但是写一日期时间,在文件名称。FileName:='Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());
做什么样的代码下面找到的最新数字。我觉得这没什么你描述,但记住,这个代码将获得较慢的因为你写更多的图像。有成千上万的照片和一个缓慢的驱动或网络,它可以挂'你的节目。
..
i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
inc(i);
其他提示
在程序启动时,迭代的所有截图*.bmp文件,分析了数字的一部分,并找到最高分配这一价值到你的柜台。当做一个快照,进入一个循环的这一尝试crreating。bmp与"只有创建的,如果不存在已经"(CREATE_NEW)语义,增加反,直到找到一个未使用的名称。
交替,使用时间戳,而不是反:)
你需要一个常喜欢这个模仿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;
不隶属于 StackOverflow