Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre éprouvé
    Avec un TProgressBar détecter l'avancement du fichier ouvert par un TWindowsMediaPlayer
    Windows10 et D6

    Bonjour à toutes et à tous,

    Avec mon application qui utilise un TWindowsMediaPlayer (WMPLib_TLB), j'aimerai vérifier l'avancement de la lecture le plus juste possible par un TProgressBar.

    En mettant l'interval du TTimer à 200ms, le TProgressBar avance plus vite que la durée du fichier.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Duration: double;
      Position: double;
    begin
      Form1.Caption := WindowsMediaPlayer1.controls.currentPositionString
                       + ' of '
                       + WindowsMediaPlayer1.currentMedia.durationString;
     
      Duration := WindowsMediaPlayer1.currentMedia.duration;
      Position := WindowsMediaPlayer1.controls.currentPosition;
     
      ProgressBar1.Position := Trunc( Position*(Duration/ProgressBar1.Max) );
    end;


    J'ai testé d'autres valeurs sans succès.

    Le "Caption" de la forme m'indique bien la position et la durée.

    Merci d'avance

    @+,

    cincap

  2. #2
    Membre éprouvé

    Le "Caption" de la forme m'indique bien la position et la durée.
    Oups, en inversant la durée du fichier et le maximum du TProgressBar qui est à 100 cela fonctionne mieux :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
     ProgressBar1.Position := Trunc( Position*(ProgressBar1.Max /Duration) );


    J'attendrai avant de fermer ce topic au cas ou.

    @+,

    cincap

  3. #3
    Modérateur

    Bonjour,
    Tu peux aussi déléguer la phase calcul au ProgessBar :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // à l'initialisation du Timer
      ProgressBar1.Max := WindowsMediaPlayer1.currentMedia.duration; 
      ProgressBar1.Position := 0;
     
    // dans le OnTimer
      ProgressBar1.Position := WindowsMediaPlayer1.controls.currentPosition;
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre éprouvé
    @ tourlourou, merci de ta suggestion, j'ai testé et à la compilation j'ai l'erreur suivante.


    Types incompatibles : 'Integer' et 'Double'

    Après plusieurs tests, ma solution fonctionne correctement.

    Je ferme le topic.

    @+,

    cincap

  5. #5
    Membre éprouvé
    Bonjour à toutes et à tous,

    J'ai encore une question concernant l'avancement et la durée.

    En effet, je constate que la durée pour un .mp3 indique par exemple 02:54 mais s'arrête à 02:53, le ProgressBar n'est pas à fond puisqu'il dépend de la durée.

    Tandis que pour le même fichier mais en .mp4, la durée indique 02:53 et s'arrête à 02:53, le ProgressBar est à fond.

    Je me demandais si avec le code qui permet de s'afficher on ne pourrait pas tricher en enlevant 1 au résultat pour afficher quand c'est un .mp3

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Duration: double;
      Position: double;
    begin
     
      //Composant TVrMatrix de TMS
    Tvr.text := WindowsMediaPlayer1.controls.currentPositionString
                       + ' de '
                       + WindowsMediaPlayer1.currentMedia.durationString;
     
      Duration := WindowsMediaPlayer1.currentMedia.duration;
      Position := WindowsMediaPlayer1.controls.currentPosition;
     
      ProgressBar1.Position := Trunc( Position*(Duration/ProgressBar1.Max) );
    end;


    Copie de l'afficheur.

    @+,

    cincap

###raw>template_hook.ano_emploi###