IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Delphi Discussion :

Problème boucle for


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Par défaut Problème boucle for
    Bonjour,

    J'utilise une boucle for pour jouer en boucle un son.
    Le son est joué s'il y a appui sur le bouton play ou si j'appelle la procedure dans une autre section du code.
    Je veux en fait récupérer par un Edit (Edit1) le nombre de fois que l'utilisateur désire écouter le son.

    Mon code est le suivant :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    procedure TForm1.btJouerClick(Sender: TObject);
    var B : integer;
    begin
        //for B:= StrToInt(Edit1.Text) downto 0 do
            Lecteur;
    end;
     
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key <> chr(8)) and ((Key < '0') or (Key > '9')) then
    begin
    Key := chr(0); // Permet d'annuler la frappe de la touche
    end;
    end;
     
    procedure TForm1.Lecteur;
    var B : integer;
    begin
    //for B:= StrToInt(Edit1.Text) downto 0 do
     
        if RadioBtmont4s.Checked then
        //for B:= StrToInt(Edit1.Text) downto 0 do
        begin
            MediaPlayer1.FileName := 'C:\Sons\MONTE.WAV';
            MediaPlayer1.Open;
            MediaPlayer1.StartPos:=0;       // Joue 4s du morceau WAV
            MediaPlayer1.EndPos:=4000;
            MediaPlayer1.Play;
            Arretautorise := true;  // evite un bug si nous appuyons sur arreter
                                           // alors q'aucun son WAV n'a été lancé
        end;
     
     
        if RadioBtmont8s.Checked then
        //for B:= StrToInt(Edit1.Text) downto 0 do
        begin
           MediaPlayer1.FileName := 'C:\Sons\MONTE.WAV';
           MediaPlayer1.Open;
           MediaPlayer1.StartPos:=0;       // Joue 8s du morceau WAV
           MediaPlayer1.EndPos:=8000;
           MediaPlayer1.Play;
           Arretautorise := true;
        end;
     
    procedure TForm1.btArreterClick(Sender: TObject);
    begin
        if Arretautorise then
        begin
            MediaPlayer1.Stop;
        end;
    end;
    J'ai essayé le programme en placant la boucle à plusieurs endroits mais cela ne marche pas, le son n'est joué qu'une seule fois.

    Merci d'avance pour vos remarques.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 097
    Par défaut
    Conserve le for dans btJouerClick, les autres supprimé les ...

    ensuite, ajoute un showMessage après MediaPlayer1.Play; c'est possible que cela fonction en Asynchrone, le show te montrera la boucle si elle fonctionne ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Par défaut
    J'ai suivi tes conseils :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    procedure TForm1.btJouerClick(Sender: TObject);
    var B : integer;
    begin
        for B:= StrToInt(Edit1.Text) downto 0 do
            Lecteur;
    end;
     
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if (Key <> chr(8)) and ((Key < '0') or (Key > '9')) then
    begin
    Key := chr(0); // Permet d'annuler la frappe de la touche
    end;
    end;
     
    procedure TForm1.Lecteur;
    begin
        if RadioBtmont4s.Checked then
        begin
            MediaPlayer1.FileName := 'C:\Sons\MONTE.WAV';
            MediaPlayer1.Open;
            MediaPlayer1.StartPos:=0;       // Joue 4s du morceau WAV
            MediaPlayer1.EndPos:=4000;
            MediaPlayer1.Play;
            ShowMessage('Entrée dans la boucle');
            Arretautorise := true;  // evite un bug si nous appuyons sur arreter
                                           // alors q'aucun son WAV n'a été lancé
        end;
     
     
        if RadioBtmont8s.Checked then
        //for B:= StrToInt(Edit1.Text) downto 0 do
        begin
           MediaPlayer1.FileName := 'C:\Sons\MONTE.WAV';
           MediaPlayer1.Open;
           MediaPlayer1.StartPos:=0;       // Joue 8s du morceau WAV
           MediaPlayer1.EndPos:=8000;
           MediaPlayer1.Play;
           ShowMessage('Entrée dans la boucle');
           Arretautorise := true;
        end;
     
    procedure TForm1.btArreterClick(Sender: TObject);
    begin
        if Arretautorise then
        begin
            MediaPlayer1.Stop;
        end;
    end;
    Le message s'affiche quand j'appuie sur play mais ensuite le son s'arrête.
    Par contre si j'appuie sur OK du message 'Entrée dans la boucle' alors le son se relance, et cela cinq fois de suite (si j'ai entré le nombre 5 ).
    Donc la boucle fonctionne mais on est obligé de cliquer sur Ok, donc autant cliquer sur play.

    Ca doit être à cause du MediaPlayer que cela ne fonctionne pas. Il ne doit pas renvoyer un "message" comme quoi un cycle de la boucle a été effectué...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Bonjour,

    Je pense qu'il est normale que votre boucle ne fonctionne pas.

    Lorsque vous faite play, vous donner l'ordre au mediaplayer de "jouer" le fichier ouvert. Le mediaplayer enregistre l'ordre puis vous rend la main.
    Si vous faite paly de nouveau, le media player vas enregistrer un nouvelle ordre play A LA PLACE DE CE QU'IL EXECUTAIT (l'ancien order play).

    Si vous executer 10 ordres play les un apres les autres, les 9 premiers play seront annuler par le suivant.

    Ce qu'il vous faut, cest detceter la fin du play puis relancer si neccesaire a ce moment.

    Regarder les propriété Notify et les événememnts onNotify du mediaplayer.

    Pour le cas ou vous aurriez l'aide en anglais voici ce que dis l'aide de onNotify Delphi7 en français.
    Se produit àla fin de l'exécution d'une méthode de contrôle multimédia.

    Syntaxe Delphi :

    propertyOnNotify:TNotifyEvent;

    Syntaxe C++:

    __propertyClasses::TNotifyEventOnNotify ={read=FOnNotify,write=FOnNotify};

    Description

    OnNotify se produit àla fin de l'exécution d'une méthode de contrôle multimédia (Back,Close,Eject,Next,Open,Pause,PauseOnly,Play,Previous,Resume,Rewind,StartRecording,Step ou Stop),quand la propriétéNotify est initialisée àtrue avant l'appel àla méthode de contrôle multimédia.Après un événement OnNotify,la propriétéNotify doit être réinitialisée àtrue pour que l'événement OnNotify suivant se produise.
    Exemple
    Le code suivant déclare un tableau de chaînes nomméModeStr,indexépar le type TMPModes.L'intituléde la fiche affiche la chaîne décrivant le mode en cours du pilote.

    Remarque : Avant d'exécuter cet exemple,il faut affecter la valeur true àla propriétéNotify de TMediaPlayer1.

    const

    ModeStr:array[TMPModes]of string =('Non prêt','Arrêté','Lecture','Enregistrement','Recherche','Pause','Ouvert');

    procedureTForm1.MediaPlayer1Notify(Sender:TObject);

    begin
    withSender asTMediaPlayer do
    begin
    Form1.Caption :=ModeStr[Mode];
    {Remarquez que la valeur True doit être affectée àla propriétéNotify }
    {pour être averti lors de la prochaine }
    {modification du mode }
    Notify :=True;
    end;
    end;
    Désolé, je n'ai pas pris le temps de passer ce que j'ai écrite au correcteur gramatical

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Par défaut
    Merci, en effet cela a l'air de pouvoir résoudre le problème, mais je ne sais pas du tout comment utiliser Notify dans ce cas là.
    Si quelqu'un pouvait me donner un exemple concret...

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 097
    Par défaut
    Après tu peux utilise l'API PlaySound SANS TMediaPlayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PlaySound(PChar(EdBrowse.Text), Handle, SND_FILENAME+SND_SYNC);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème boucle for
    Par El-Diablo- dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/06/2007, 21h52
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo