Ajout composant visuel dans un tstatusbar

Description

L'exemple présenté ici permet d'insérer un composant TProgressBar dans la première partie d'un TStatusBar à l'éxécution, de faire évoluer l'affichage (ici au cours d'une simple boucle repeat..until) et de libérer les ressources allouées au début du traitement.

Source / Exemple :


procedure TForm1.Button1Click(Sender: TObject);
var
  //Pour abréger l'écriture :
  SB : TStatusBar;
  //Déclaration d'un TProgressBar
  PB : TProgressBar;
  //variable de compteur
  i : integer;
  //structure de type rectangle
  Rect : TRect;
begin
  //Sb reprends les valeurs de StatusBar1
  Sb := StatusBar1;

  //Récupération des coordonnées
  Rect := SB.ClientRect;

  //Création à l'éxécution
  PB := TProgressBar.Create(Self);
  with PB do
  begin
    //Le composant qui va accueillir le ProgressBar
    Parent := StatusBar1;

    //Définition des coordonnées dynamiquement
   SetBounds(Rect.Left + 2,  Rect.Top + 2, SB.Panels[0].Width - 2, Rect.Bottom - 2);

    //Paramètrage des valeurs de départ
    // ici de 0 à 2000 par pas de 5
    Min := 0;
    Max := 20000;
    Position := Min;
    Step := 5;

    //Entrée dans une boucle d'affichage
    {ATTENTION : en utilisant une boucle FOR car l'incrémentation de i est
    toujours de 1, alors que celle créée par la méthode StepIt est variable.
    Celà peut engendrer des effets inattendus !}
    i:=Min;
    repeat
      inc(i, Step);
      //Déplacement du curseur visuel
      StepIt; //voir également : Position:= i;
      {Comme certains traitements peuvent être longs,
      ne pas oublier de rendre la main au système entre deux}
      Application.ProcessMessages;
    until i=max;
    //Destruction du composant
    Free;
   {Libération des ressources allouées à la copie
    de StatusBar1}
    SB := NIL;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  //Le premier Panel de StatusBar1 occupe les 3/4 de la largeur
  //et sera dessiné en cas de redimensionnement pendant le traitement
  //dans la boucle
  StatusBar1.Panels[0].Width:=round(StatusBar1.Width * 3 / 4)
end;

Conclusion :


C'est un vieux truc classique mais certains en redemandait ces derniers temps

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.