Question

Je crée un programme qui prend un instantané de l'écran et l'enregistre dans un dossier sous la forme d'une image bitmap. Il semble que je rencontre un problème, l’image s’écrase elle-même.

Quelqu'un peut-il me dire comment je peux faire en sorte que, une fois la sauvegarde effectuée, le nombre sera supérieur de 1? Par exemple: Enregistrer 1: Screenshot0001.bmp Enregistrer 2: Capture0002.bmp Sauvegarde 3: Screenshot0003.bmp

Et ainsi de suite.

Était-ce utile?

La solution

Il existe de nombreuses façons d'accomplir quelque chose comme ceci.

  1. Faites-le comme votre appareil photo numérique. Ayez un compteur et enregistrez-le dans un fichier ou dans le registre. Vous rencontrerez probablement des problèmes multi-utilisateurs et vous devrez toujours gérer les situations dans lesquelles une image existe déjà.

  2. N'utilisez pas un nombre incrémentant, mais écrivez une date / heure dans le nom du fichier. FileName: = 'Capture _' + FormatDateTime ('yyyymmdd-hhnnss-zzz.bmp', now ());

  3. Faites quelque chose comme le code ci-dessous pour trouver le dernier numéro. Je pense que cela correspond à ce que vous décrivez, mais rappelez-vous que ce code sera plus lent à mesure que vous écrivez plus d'images. Avec des milliers de photos et un lecteur lent ou un réseau, il pourrait "bloquer" votre programme.

..

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

Autres conseils

Au démarrage du programme, parcourez tous les fichiers Screenshot * .bmp, analysez la partie numérique et recherchez le plus élevé - attribuez cette valeur à votre compteur. Lorsque vous effectuez une capture instantanée, lancez une boucle qui tente de créer Screenshot.bmp avec l'option "Créer uniquement si n'existe pas déjà". (CREATE_NEW) sémantique, incrémentant le compteur jusqu'à ce que vous trouviez un nom non utilisé.

Vous pouvez également utiliser l'horodatage au lieu du compteur:

Vous avez besoin d'une routine comme celle-ci qui imite la duplication de fichiers Windows, le premier fichier étant "Mon fichier", le second étant "Mon fichier (2)", puis "Mon fichier (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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top