Pregunta

Estoy creando un programa que toma una instantánea de la pantalla y la guarda en una carpeta como una imagen de mapa de bits. Sin embargo, parece que me encuentro con un problema, la imagen simplemente se sobrescribe.

¿Alguien puede decirme cómo puedo hacerlo para que, cuando guarde, el número sea uno más alto que el anterior? Por ejemplo: Guardar 1: Screenshot0001.bmp Guardar 2: Screenshot0002.bmp Guardar 3: Screenshot0003.bmp

Y así sucesivamente.

¿Fue útil?

Solución

Hay muchas formas de lograr algo como esto.

  1. Hazlo como lo hace tu cámara digital; Tenga un contador y guárdelo en un archivo o en el registro. Probablemente se encontrará con problemas de usuarios múltiples y aún tendrá que manejar situaciones en las que ya existe una imagen.

  2. No use un número incremental, pero escriba una fecha y hora en el nombre del archivo. FileName: = 'Captura de pantalla _' + FormatDateTime ('aaaammdd-hhnnss-zzz.bmp', ahora ());

  3. Haga algo como el siguiente código para encontrar el último número. Creo que esto hace lo que estás describiendo, pero recuerda que este código será más lento a medida que escribas más imágenes. Con miles de imágenes y una unidad o red lenta, podría "colgar" su programa.

..

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

Otros consejos

Al iniciar el programa, repita todos los archivos de Captura de pantalla * .bmp, analice la parte numérica y encuentre la más alta: asigne este valor a su contador. Al hacer una instantánea, vaya a un bucle que intente crear Screenshot.bmp con " solo crear si no existe ya " (CREATE_NEW) semántica, incrementando el contador hasta que encuentre un nombre no utilizado.

Alternativamente, use la marca de tiempo en lugar del contador :)

Necesita una rutina como esta que imite la duplicación de archivos de Windows donde el primer archivo es 'Mi archivo', el segundo es 'Mi archivo (2)', luego 'Mi archivo (3)', etc.

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top