par , 22/03/2018 à 08h56 (821 Affichages)
L'application de test est opérationnelle, mais nous manquons de maîtrise des paramètres d'affichage. Dans ce court billet, nous nous attacherons à la régulation de la vitesse d'affichage des transitions.
Introduction de la vitesse
En matière de vitesse, deux cas sont à examiner suivant la rapidité de traitement et d'affichage des outils graphiques utilisés : utilisation de la LCL standard ou mise en œuvre de la bibliothèque BGRABitmap.
Avec la LCL, il est fort à parier que l'accélération sera nécessaire : on pourra par exemple supprimer l'instruction d'attente (sleep) et diminuer le nombre d'étapes d'affichage en incrémentant le pas fStep d'un nombre supérieur à 1. Toutefois, il faudra prendre garde à la limite fixée à 100. En effet, seuls les diviseurs de 100 conviendront comme pas : 1, 2, 4, 5, 10, 20, 25, 50. D'autres valeurs sont possibles, mais au prix d'une vérification de la limite et de l'achèvement de la transition. Il va sans dire que les pas supérieurs à 20 ne seront pas pertinents pour l'affichage, car plus le pas sera élevé plus l'affichage sera saccadé.
Avec BGRABitmap, le problème est au contraire une trop grande rapidité d'exécution ! Pour s'en convaincre, il suffit de reprendre l'exemple précédent avec notre première transition et de retirer la procédure sleep. Heureusement, la maîtrise de la vitesse en est grandement simplifiée puisque nous n'aurons qu'à jouer sur le paramètre fourni à sleep pour ralentir ou accélérer l'affichage.
Dans notre fiche principale, nous allons introduire une nouvelle propriété nommée Speed qui renverra vers un champ privé fSpeed :
1 2 3 4 5 6 7 8
| private
fBGRAFrom, fBGRATo: TBGRABitmap;
fStep: Byte;
fSpeed: Byte; // vitesse
procedure SetSpeed(AValue: Byte);
public
property Speed: Byte read fSpeed write SetSpeed default C_DefaultSpeed;
end; |
La constante C_DefaultSpeed vaudra 80 : elle fixe la valeur par défaut de la vitesse. Elle sera déclarée au début de l'unité, avant la fiche :
1 2 3 4 5 6 7 8
| const
C_DefaultSpeed = 80; // vitesse par défaut
type
{ TMainForm }
TMainForm = class(TForm) |
En général, il est préférable d'éviter les constantes numériques codées en dur dans le code. En effet, le changement d'une valeur grâce à une constante nommée sera immédiatement propagé dans tout le code qui sera par ailleurs bien plus lisible.
La méthode SetSpeed pourra ressembler à ceci :
1 2 3 4 5 6 7
| procedure TMainForm.SetSpeed(AValue: Byte);
// *** détermination de la vitesse ***
begin
if fSpeed = AValue then
Exit;
fSpeed := AValue;
end; |
Notons que cette méthode est inutile dans l'état puisqu'elle n'effectue pas de traitements spécifiques sur le champ interne fSpeed. Cependant, l'éventuelle introduction de tests comme le déclenchement d'un gestionnaire (OnSpeedChange, par exemple) se fera par ce biais sans effort particulier.
À présent que la vitesse est accessible en tant que propriété, il reste à l'utiliser à la place de la constante fournie à la procédure sleep :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| procedure TMainForm.btnGoClick(Sender: TObject);
// *** dessin ***
var
LBGRATemp: TBGRABitmap;
LY, LX: Integer;
begin
btnGo.Enabled := False;
LBGRATemp := TBGRABitmap.Create(imgResult.ClientWidth, imgResult.ClientHeight, BGRABlack);
try
LX := 0;
LY := 0;
fStep := 0;
repeat
Inc(fStep);
LBGRATemp.FillRect(ClientRect, BGRABlack);
LBGRATemp.PutImage(0, 0, fBGRAFrom, dmSet);
// traitement ici...
LBGRATemp.PutImage(LX, LY, fBGRATo, dmDrawWithTransparency);
LBGRATemp.Draw(imgResult.Canvas, 0, 0);
imgResult.Repaint;
sleep(100 - fSpeed); // changement ici
until fStep = 100;
finally
LBGRATemp.Free;
btnGo.Enabled := True;
end;
end; |
Plus la vitesse augmente moins le paramètre fourni à sleep doit être élevé, d'où la soustraction.
Il ne faut pas oublier de mentionner la valeur par défaut de cette vitesse dans le gestionnaire de création de la fiche et d'adapter la propriété Position par défaut du composant tbarSpeed :
1 2 3 4 5 6 7 8 9 10 11
| procedure TMainForm.FormCreate(Sender: TObject);
// *** construction des objets de travail ***
begin
Caption := rsTestName;
fBGRAFrom := TBGRABitmap.Create(imgFrom.Picture.Bitmap);
fBGRAFrom := fBGRAFrom.Resample(imgResult.ClientWidth, imgResult.ClientHeight) as TBGRABitmap;
fBGRATo := TBGRABitmap.Create(imgTo.Picture.Bitmap);
fBGRATo := fBGRATo.Resample(imgResult.ClientWidth, imgResult.ClientHeight) as TBGRABitmap;
fSpeed := C_DefaultSpeed; // vitesse
tbarSpeed.Position:= Speed;
end; |
Dans notre exemple, il nous faut aussi gérer le changement de vitesse via le composant tbarSpeed, ce qui est très facile si nous considérons le gestionnaire OnChange qui lui est associé. Nous double-cliquons dans l'inspecteur d'objets sur l'événement correspondant du composant et nous fournissons le code suivant pour le traitement :
1 2 3 4 5
| procedure TMainForm.tbarSpeedChange(Sender: TObject);
// *** changement de vitesse ***
begin
Speed := tbarSpeed.Position;
end; |
Il ne reste qu'à réintroduire notre transition de test dans le gestionnaire OnClick de notre unique bouton*:
1 2
| // traitement ici...
LY := - imgResult.ClientHeight + imgResult.ClientHeight * fStep div 100; // OVERDOWN |
Nous pouvons désormais régler la vitesse de transition en jouant avec le curseur du composant tbarSpeed.
La prochaine étape consistera à la prise en charge de la transparence !