Problèmes boucle NotifyProc

Résolu
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007 - 4 juin 2007 à 11:03
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007 - 7 juin 2007 à 14:51
Bonjour,

J'ai deux Edit qui permettent de choisir le nombre de fois où un son doit être joué pour deux sons différents.

1er problème :
La première fois que je rentre un nombre, le son est joué (x+1) fois, sauf si 1 est le premier nombre rentré, et si je rappuie sur Play le son est joué x fois comme voulu.
Si 1 est le premier chiffre rentré, le son est joué une fois, je rentre 3, le son est joué 4 fois mais si je rePlay alors il est joué 3 fois et x fois quelque soit le nombre entré.
Si 3 est le premier chiffre rentré, le son est joué 4 fois, mais aprés quelque soit le nombre entré il joue correctement.

2ème problème :
Si je rentre x, il faut que j'appuie sur stop x fois pour que le son s'arrête.

Voici le code :

var
    B : integer;
    Arretautorise : boolean;
 
procedure TForm1.btJouerClick(Sender: TObject);
begin
    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); // Ne prend que les nombres et la touche retour
    end;
end;
 
procedure TForm1.Lecteur;
begin
 
    if RadioBtmont.Checkedthen
    begin
        Arretautorise := true;   // Evite un bug si aucun son n'est
                                    // lancé alors que nous appuyons sur Stop
        MediaPlayer1.FileName := 'C:\Sons expérience\MONTE.wav';
        MediaPlayer1.Open;
        B:= StrToInt(Edit1.Text);
        MediaPlayer1.Play;
       
        if B <> 1then
        begin
            MediaPlayer1.Notify := true;
            MediaPlayer1.OnNotify := NotifyProc1;     
        end;
    end;
 
    if RadioBtdesc.Checkedthen
    begin
        Arretautorise := true;
        MediaPlayer1.FileName := 'C:\Sons expérience\DESC.WAV';
        MediaPlayer1.Open;
        C:= StrToInt(Edit2.Text);
        MediaPlayer1.Play;
 
        if C <> 1then
        begin
            MediaPlayer1.Notify := true;
            MediaPlayer1.OnNotify := NotifyProc2;
        end;
    end;
 
end;
 
procedure TForm1.NotifyProc1(Sender: TObject);
begin
    with Sender as TMediaPlayer do
        begin
            if NotifyValue = nvSuccessful then
            begin
                if B > 0then
                begin
                    Play;   
                    Dec(B);
                end;
            end;
Notify := True;
        end;
end;
 
procedure TForm1.NotifyProc2(Sender: TObject);
begin
    with Sender as TMediaPlayer do
        begin
            if NotifyValue = nvSuccessful then
            begin
                if C > 0then
                begin
                    Play;
                    Dec(C);
                end;
            end;
Notify := True;
        end;
end;
 
procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        MediaPlayer1.Stop;
    end;
end;

Merci pour vos conseils, ça fait longtemps que j'ai des problèmes avec cette partie de mon programme...<!-- / message -->

7 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 juin 2007 à 10:46
Bon double post (désolé...)

Ca risque de mieux marcher comme ça :

procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        B:= 0;

        C:= 0;
        MediaPlayer1.Stop;
    end;
end;

En effet, si la notifyproc est appelée par le Stop, le compteur sera pas encore à zéro avec ma première solution.

Je rajoute une remarque :

Met un ShowMessage(IntToStr(B)); audébut de NotifyProc1, pour en apprendre un peu plus sur ton problème 1.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
7 juin 2007 à 10:55
mmmh

Et comme ça :

procedure TForm1.NotifyProc1(Sender: TObject);
begin
    ShowMessage(IntToStr(B));
    Dec(B);
     if B > 0 then (Sender as TMediaPlayer).Play;            
end;
3
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007
4 juin 2007 à 11:57
Bon j'ai résolu le 2ème problème en mettant :

procedure TForm1.Lecteur;
begin
        WaveOutSetVolume(WAVE_MAPPER, MakeLong(65535, 65535));
....................
.................... 
 
procedure TForm1.btArreterClick(Sender: TObject);
begin
    if Arretautorise then
    begin
        WaveOutSetVolume(WAVE_MAPPER, MakeLong(0, 0));
    end;
end;

Mais il me reste encore le 1er problème...<!-- / message -->
0
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007
6 juin 2007 à 18:52
Ok merci pour ta réponse j'essaierai dès demain.
Pour les NotifyProc, j'en utilise deux un pour B et l'autre pour C, mais je testerai en en utilisant qu'un.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007
7 juin 2007 à 09:20
Ah, merci ta méthode pour arrêter le MediaPlayer fonctionne.
C'est vrai que c'est beaucoup plus propre.
0
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007
7 juin 2007 à 09:45
En mettant un ShowMessage(IntToStr(B)); au début de NotifyProc1, cela me donne :
Si je mets 1 => rien (enfin ça joue 1 fois)
Si je mets un nombre différent de 1, par exemple 3, la première fois ça m'affiche : rien, 3, 2, 1, 0 (le son est joué 4 fois).
Si je mets un nombre différent de 1, par exemple 3, la deuxième fois ça m'affiche : 3, 2, 1, 0 (le son est joué 3 fois).
Je vois donc ce que j'entendais, mais je ne vois pas du tout à quoi peut être dû le problème, à part que la première fois il exécute le MediaPlayer1.Play; du RadioButton mais pas la deuxième fois...
0
revsys Messages postés 15 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 7 juin 2007
7 juin 2007 à 14:51
En effet, ça marche comme ça !
Eh ben, on peut dire que tu sais trouver des solutions !!
Merci beaucoup pour tes deux réponses qui m'ont beaucoup aidé, et du temps que tu as consacré pour me répondre.
0
Rejoignez-nous