Domanda

Sto realizzando un programma che scatta un'istantanea dello schermo e lo salva in una cartella come immagine Bitmap. Sembra che stia incontrando un problema, l'immagine si sovrascrive da sola.

Qualcuno può dirmi come posso farlo così quando salva, il numero sarà uno più alto dell'ultimo? Ad esempio: Salva 1: Screenshot0001.bmp Salva 2: Screenshot0002.bmp Salva 3: Screenshot0003.bmp

E così via.

È stato utile?

Soluzione

Esistono molti modi per realizzare qualcosa del genere.

  1. Fallo come fa la tua fotocamera digitale; Avere un contatore e salvarlo in un file o nel registro. Probabilmente incontrerai problemi multiutente e dovrai comunque gestire situazioni in cui un'immagine esiste già.

  2. Non utilizzare un numero crescente, ma scrivere un datetime nel nome del file. FileName: = 'Screenshot _' + FormatDateTime ('yyyymmdd-hhnnss-zzz.bmp', now ());

  3. Fai qualcosa come il codice qui sotto per trovare l'ultimo numero. Penso che questo faccia quello che stai descrivendo, ma ricorda che questo codice diventerà più lento man mano che scrivi più immagini. Con migliaia di immagini e un'unità o una rete lenta potrebbe "bloccare" il tuo programma.

..

i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
  inc(i);

Altri suggerimenti

All'avvio del programma, itera tutti i file Screenshot * .bmp, analizza la parte numerica e trova il valore più alto - assegna questo valore al tuo contatore. Quando esegui un'istantanea, vai in un ciclo che tenta di distruggere Screenshot.bmp con " crea solo se non esiste già " (CREATE_NEW) semantica, incrementando il contatore fino a trovare un nome non utilizzato.

In alternativa, usa il timestamp invece del contatore :)

È necessaria una routine come questa che imita la duplicazione dei file di Windows in cui il primo file è "Il mio file", il secondo è "Il mio file (2)", quindi "Il mio file (3)" ecc.

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top