Suite de l’article « Album de famille ».

8 mois se sont écoulés depuis la sortie de la première version de « Family Album ». Et j’avais une raison de continuer cette histoire de manière positive. Le fait est que lors du développement de ce programme, j’ai rencontré un problème très sérieux : les faibles performances des composants responsables de l’affichage des images : le simple chargement d’une image à partir d’un fichier et son affichage sur le formulaire peut prendre une seconde voire plus, selon la taille du fichier. À de telles vitesses, vous pouvez oublier le mode présentation et le projet lui-même peut être transféré dans la catégorie des projets éducatifs. Cependant, après une série d’expériences avec la transparence des formes, j’ai réussi à obtenir une animation acceptable lors du changement d’images avec pour effet une transition douce d’une image à l’autre.

Une autre raison de revenir sur ce projet était mon désir d’inclure des modules pour travailler avec des graphiques dans le programme ClearApp, j’ai donc porté le projet « Family Album » vers la dernière version de ClearApp afin de synchroniser ensuite les versions des modules individuels. En conséquence, l’apparence du programme a légèrement changé : il a acquis un menu principal et d’autres fonctions auxiliaires : paramètres de thème, aide interactive et possibilité d’enregistrer le programme.

Le mode présentation passe en plein écran. Sur mon moniteur 2K, cela a plutôt bien fonctionné, même si pour une raison quelconque, l’animation dans l’enregistrement n’est pas aussi fluide – apparemment, le programme de capture vidéo a échoué.

Un tour de passe-passe

Pour obtenir cet effet, j’ai dû créer trois formes :

  • frmPlayer – un formulaire avec des boutons de contrôle de présentation ;
  • frmFrame1 – formulaire d’affichage d’image ;
  • frmFrame2 – est une autre forme d’affichage d’image.

frmFrame1 et frmFrame2 sont étirés pour remplir tout l’écran et, après avoir chargé l’image dans le composant TdbImage, ils se déplacent alternativement au premier plan. L’animation est obtenue en modifiant la propriété AlphaBlendValue de 0 (transparence totale) à 255 (opacité totale) de la forme qui se trouve au-dessus.

Le programme utilise deux minuteries : pour changer séquentiellement les images et pour masquer automatiquement les boutons du lecteur 5 secondes après que le curseur de la souris les quitte.

Scripts

La bibliothèque ClearApp doit être reconstituée avec un dossier ImageEdit entier, qui contient quatre modules :

  • IEConstVar.pas – constantes et variables de l’éditeur d’images
  • ImageEdit.pas – éditeur d’images
  • TargetImage.pas – classe virtuelle de vignettes de l’éditeur d’images
  • TargetImagePanel.pas – classe virtuelle pour le panneau de vignettes

Ajout de deux procédures de formulaire utiles :

  • Form_SavePosSize – enregistrement de la position de la fenêtre dans les paramètres
  • Form_RestorePosSize – restaure la position et la taille de la fenêtre en fonction des données des paramètres.

const
  FORM_PARAM_POS_SIZE = 'FormPosSize_';
  FORM_SECTION = 'Forms';
  FORM_WIDTH_DEF = 800;
  FORM_HEIGHT_DEF = 600;

procedure Form_SavePosSize(Sender: TObject;);
// enregistrement de la position de la fenêtre dans les paramètres
var
  tmpForm: TAForm;
  tmpName: string;
  tmpValue: string;
  tmpSection: string;
begin
  tmpForm := TAForm(Sender);
  // Parfois, le formulaire n'est pas visible pour des raisons inconnues
  // nous vérifions donc l'affichage complet sur l'écran.
  if (tmpForm.Top > 0) and (tmpForm.Left > 0) and ((tmpForm.Top + tmpForm.Height) < Screen.Height) and
    ((tmpForm.Left + tmpForm.Width) < Screen.Width) then
  begin
    tmpName := FORM_PARAM_POS_SIZE + TComponent(Sender).Name;
    if tmpForm.WindowState = wsMaximized then
      tmpValue := 'Maximized'
    else
      tmpValue := IntToStr(tmpForm.Left) + ',' + IntToStr(tmpForm.Top) + ',' + IntToStr(tmpForm.Width) + ',' +
        IntToStr(tmpForm.Height);
     tmpSection := FORM_SECTION;
    IniFile_Write(tmpSection,tmpName,tmpValue);
  end;
end;

procedure Form_RestorePosSize(Sender: TObject;);
// Restauration de la position et de la taille de la fenêtre en fonction des données des paramètres
// ATTENTION! la propriété Position du formulaire doit être définie sur poDesignedvar
var
  tmpName: string;
  tmpForm: TAForm;
  s: array of string;
  tmpValue: string;
  tmpImage: TdbImage;
  tmpSection: string;
begin
  try
    tmpForm := TAForm(Sender);
    tmpName := FORM_PARAM_POS_SIZE + TComponent(Sender).Name;
    tmpSection := FORM_SECTION;

    tmpValue := IniFile_Read(tmpSection,tmpName,'');
    if tmpValue <> '' then // Si le paramètre existe, alors
    begin // Restaurer la position et la taille
      s := SplitString(tmpValue, ',');
      if s[0] = 'Maximized' then // Si le formulaire a été agrandi en plein écran 
      begin
        tmpForm.Width := FORM_WIDTH_DEF;
        tmpForm.Height := FORM_HEIGHT_DEF;
        Form_Centered(tmpForm);
        tmpForm.WindowState := wsMaximized;
      end
      else
      begin
        tmpForm.Left := StrToInt(s[0]);
        tmpForm.Top := StrToInt(s[1]);
        tmpForm.Width := StrToInt(s[2]);
        tmpForm.Height := StrToInt(s[3]);
      end;
    end
    else
    begin
      Form_Centered(tmpForm);
    end;
  except
    RaiseException('Form_RestorePosSize() - '+ExceptionMessage);
  end;
end;Langage du code : Delphi (delphi)

Le lecteur

La forme du lecteur dans le concepteur n’a pas l’air très présentable, mais grâce au chargement automatique des images pour les boutons, elle devrait être tout à fait fonctionnelle. Certes, je n’ai toujours pas dessiné de bouton pour quitter le mode présentation, mais je promets de corriger ce malentendu prochainement.

Sur le formulaire se trouve un tableau invisible avec une liste d’images à afficher. La méthode clé du formulaire est la procédure frmPlayer_LoadData – chargement animé de l’image suivante de la liste :

procedure frmPlayer_LoadData;
// Chargement des données
var
  tmpRow: integer;
  i: integer;
begin
  tmpRow := frmPlayer.tgrImageList.SelectedRow;
  if tmpRow <> -1 then
  begin
    if not frmFrame1.Visible then
    begin
      ImageEdit_LoadImageFromBase( frmFrame1.imgMain, StrToInt(frmPlayer.tgrImageList.cells[0,tmpRow]), IE_FT_ORIGINAL, IE_IT_IMAGE);
      frmFrame1.AlphaBlendValue := 0;
      frmFrame1.Show;
      frmPlayer.Show;
      for i := 0 to 127 do
      begin
        frmFrame1.AlphaBlendValue := i*2;
        Application.ProcessMessages;
        sleep(5);
      end;
      frmFrame2.Visible := False;
    end
    else
    begin
      ImageEdit_LoadImageFromBase( frmFrame2.imgMain, StrToInt(frmPlayer.tgrImageList.cells[0,tmpRow]), IE_FT_ORIGINAL, IE_IT_IMAGE);
      frmFrame2.AlphaBlendValue := 0;
      frmFrame2.Show;
      frmPlayer.Show;
      for i := 0 to 127 do
      begin
        frmFrame2.AlphaBlendValue := i*2;
        Application.ProcessMessages;
        sleep(5);
      end;
      frmFrame1.Visible := False;
    end;
  end;
end;Langage du code : PHP (php)

Évidemment, cette procédure nécessite des améliorations – nous devons nous débarrasser d’un code similaire en créant une procédure distincte avec deux paramètres, mais pour l’instant, qu’il en soit ainsi.

À suivre…

Traduction : Yann Yvnec

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *