画面のスナップショットを取り、それをビットマップ画像としてフォルダーに保存するプログラムを作成しています。問題が発生しているようですが、画像が上書きされるだけです。
保存すると、数値が前回より1つ大きくなるようにする方法を誰か教えてもらえますか? 例: 保存 1: Screenshot0001.bmp 保存 2: Screenshot0002.bmp 保存 3: Screenshot0003.bmp
等々。
このようなことを達成する方法はたくさんあります。
デジタルカメラと同じようにしてください。カウンターを作成し、ファイルまたはレジストリに保存します。マルチユーザーの問題が発生する可能性があり、イメージが既に存在する状況を処理する必要があります。
増分番号を使用しないでください。ただし、ファイル名に日時を記述してください。FileName := 'スクリーンショット_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());
以下のコードのようなことを実行して、最新の番号を見つけます。これはあなたが説明していることだと思いますが、このコードは、より多くの画像を書き込むほど遅くなることに注意してください。何千枚もの画像と遅いドライブまたはネットワークでは、プログラムが「ハング」する可能性があります。
..
i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
inc(i);
プログラムの起動時に、すべての Screenshot*.bmp ファイルを反復処理し、数値部分を解析して最大のものを見つけます。この値をカウンターに割り当てます。スナップショットを作成するときは、「まだ存在しない場合のみ作成する」(CREATE_NEW) セマンティクスを使用して Screenshot.bmp を作成しようとするループに入り、未使用の名前が見つかるまでカウンターを増やします。
または、カウンタの代わりにタイムスタンプを使用してください:)
最初のファイルが「マイファイル」、2番目のファイルが「マイファイル(2)」、次に「マイファイル(3)」などのWindowsファイルの複製を模倣するこのようなルーチンが必要です。
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;