Pergunta

Eu estou fazendo um programa que leva um instantâneo da tela, e salva-lo para uma pasta como uma imagem Bitmap. Parece que estou correndo em um problema, porém, a imagem apenas substitui-se.

Alguém pode me dizer como posso fazê-lo assim quando ele salva, o número será um maior do que o último? Por exemplo: Salvar 1: Screenshot0001.bmp Salvar 2: Screenshot0002.bmp Guardar 3: Screenshot0003.bmp

E assim por diante.

Foi útil?

Solução

Existem muitas maneiras de conseguir algo parecido com isso.

  1. Faça como sua câmera digital faz; Tem um contador e salvá-lo em um arquivo ou no registro. Você provavelmente vai correr em problemas multi-usuário e você ainda vai ter que situações punho, onde uma imagem já existe.

  2. Não use um número incremental, mas escrever uma data e hora no nome do arquivo. FileName: = 'tela _' + FormatDateTime ( 'AAAAMMDD-hhnnss-zzz.bmp', agora ());

  3. fazer algo como o código abaixo para encontrar o último número. Eu acho que isso faz o que você está descrevendo, mas lembre-se que este código vai ficar mais lento como você escrever mais imagens. Com milhares de fotos e um carro lento ou rede poderia 'pendurar' o seu programa.

..

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

Outras dicas

No início do programa, itere todos os arquivos tela * .bmp, analisar a parte numérica e encontrar o mais alto - atribuir esse valor para seu contador. Ao fazer um instantâneo, entrar em um loop que tenta crreating Screenshot.bmp com "apenas criam, se ainda não existir" semântica (CREATE_NEW), incrementando o contador até encontrar um nome não utilizado.

Como alternativa, o uso timestamp em vez de balcão:)

Você precisa de uma rotina como esta que imita a duplicação de arquivos do Windows, onde o primeiro arquivo é 'My File', o segundo é 'My File (2)', então 'My File (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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top