0

我正在制作一个程序来拍摄屏幕快照,并将其作为位图图片保存到文件夹中。我似乎遇到了问题,图片只是覆盖了自己。

谁能告诉我怎么做,所以当它保​​存时,这个数字会比上一个高一个吗?例如: 保存1:Screenshot0001.bmp 保存2:Screenshot0002.bmp 保存3:Screenshot0003.bmp

等等。

4

3 回答 3

14

有很多方法可以完成这样的事情。

  1. 像你的数码相机那样做;有一个计数器并将其保存在文件或注册表中。您可能会遇到多用户问题,并且您仍然必须处理图像已经存在的情况。

  2. 不要使用递增的数字,而是在文件名中写入日期时间。文件名 := 'Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());

  3. 执行以下代码以查找最新号码。我认为这符合您的描述,但请记住,当您编写更多图像时,此代码会变慢。有数千张图片和慢速驱动器或网络,它可能会“挂起”您的程序。

..

i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
  inc(i);
于 2009-03-17T03:19:09.557 回答
2

在程序启动时,迭代所有 Screenshot*.bmp 文件,解析出数字部分并找到最高的 - 将此值分配给您的计数器。进行快照时,进入一个循环,尝试使用“仅在不存在时创建”(CREATE_NEW)语义创建 Screenshot.bmp,递增计数器直到找到未使用的名称。

或者,使用时间戳而不是计数器 :)

于 2009-03-17T03:17:45.283 回答
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;
于 2009-03-17T06:54:38.710 回答