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èmes boucle NotifyProc


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èmes boucle NotifyProc
    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 :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    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.Checked then
        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 <> 1 then
            begin
                MediaPlayer1.Notify := true;
                MediaPlayer1.OnNotify := NotifyProc1;      
            end;
        end;
     
        if RadioBtdesc.Checked then
        begin
            Arretautorise := true;
            MediaPlayer1.FileName := 'C:\Sons expérience\DESC.WAV';
            MediaPlayer1.Open;
            C:= StrToInt(Edit2.Text);
            MediaPlayer1.Play;
     
            if C <> 1 then
            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 > 0 then
                    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 > 0 then
                    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...

  2. #2
    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
    Bon j'ai résolu le 2ème problème en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    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...

  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
    Personne ne voit d'où peut venir le problème ?

  4. #4
    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
    Bon pour le problème n°2, une solution plus propre que d'arrêter le son marche aussi, en mettant A et B à 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.btArreterClick(Sender: TObject);
    begin
        if Arretautorise then
        begin
            B := 0;
            C := 0;
            MediaPlayer1.Stop;        
        end;
    end;
    Mais j'ai encore et toujours le problème n°1...

  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
    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...

  6. #6
    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
    Après mon monologue sur cette discussion , la solution est la suivante pour le 1er problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.NotifyProc1(Sender: TObject);
    begin
         Dec(B);
         if B > 0 then (Sender as TMediaPlayer).Play;             
    end;
    Le code est, en plus, beaucoup plus léger.

    Enfin, merci quand même

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

Discussions similaires

  1. Problème Boucle Do-While?!
    Par Julien_C++ dans le forum C++
    Réponses: 6
    Dernier message: 29/07/2006, 12h23
  2. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  3. [XSL] problème boucle
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 16h55
  4. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  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