none
A partir de la fenêtre "2", lancer une procédure de lecture de son présente sur la fenêtre "1" RRS feed

  • Question

  • Bonjour,

    J'ai, dans ma fenêtre principale, une procédure de lecture de sons "interface".

    Imports WMPLib
    
    Public WithEvents Player As New WMPLib.WindowsMediaPlayer
    
    PlayFile("c:\son1.wav")
    
    Private Sub PlayFile(ByVal url As String)
      Player = New WMPLib.WindowsMediaPlayer
      Player.URL = url
      Player.controls.play()
    End Sub

    Il y a 8 sons au total, et ils doivent être aussi utilisé par d'autres fenêtre de mon apllication.
    Le problème, c'est que je ne peux pas faire

    MainWindow.PlayFile("c:\son1.wav")

    Erreur: Reference to a non-shared member requires an object reference.

    Ma question:
    Comment puis je lancer des sons, dont toutes les procédures d'initialisation et de lecture sont présentes sur "MainWindow", depuis une autre fenêtre (pour éviter de devoir le refaire pour CHAQUE fenêtre)

    Merci pour votre aide!!

    samedi 17 novembre 2012 17:28

Réponses

  • Un petit "prototype", à adapter :

    Module de classe :

    Public Class Class1
        Public Shared WithEvents Player As New WMPLib.WindowsMediaPlayer
    
        Public Shared Sub PlayFile(ByVal url As String)
            Player = New WMPLib.WindowsMediaPlayer
            Player.URL = url
            Player.controls.play()
        End Sub
    
        Shared Event MusicEnd()
    
        Public Shared Sub musicPlayer_MediaEnded(ByVal NewState As Integer) Handles Player.PlayStateChange
            If NewState = WMPLib.WMPPlayState.wmppsStopped Then
                Player.close()
                RaiseEvent MusicEnd()
            End If
        End Sub
    End Class

    et dans ta fenêtre principale :

    Public Class Form1
        Dim WithEvents cls As New Class1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Class1.PlayFile("c:\son1.wav")
        End Sub
    
        Private Sub cls_MusicEnd() Handles cls.MusicEnd
            MessageBox.Show("Morceau terminé")
        End Sub
    End Class

    Si la classe est correctement déclarée, l'instance 'cls' de Class1 doit apparaitre dans le Combo de gauche de la fenêtre et l'évènement 'MusicEnd' dans celui de droite :


    Cordialement, Jacques

    • Marqué comme réponse jmdeb mardi 20 novembre 2012 08:52
    lundi 19 novembre 2012 12:52

Toutes les réponses

  • Bonjour,

    L’idée générale c’est de récupérer une instance du StartUp Form (qui est instante au démarrage de l’application) et puis l’utiliser pour gérer le son.

    Comment faire ça, ça dépend de votre application (MDI – Form contenu dans autre form – comme documents  Word/SDI – des forms indépendantes   ).  Vous pouvez utiliser Application.OpenForms pour les applications SDI et Me.ParentForm.Name pour les applications MDI.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 19 novembre 2012 08:37
  • Bonjour jmdeb,

    Pour ma part, je déplacerai tout ce qui lié au son dans un module de classe indépendant de toutes fenêtres (via Projet -> Ajouter une classe...), par exemple ici une classe "Class1" :

    Imports WMPLib
    
    Public Class Class1
        Public Shared WithEvents Player As New WMPLib.WindowsMediaPlayer
    
        Public Shared Sub PlayFile(ByVal url As String)
            Player = New WMPLib.WindowsMediaPlayer
            Player.URL = url
            Player.controls.play()
        End Sub
    End Class
    

    Avec "Public Shared" la procédure sera accessible à partir de n'importe quelle feuille du projet en faisant :

     Class1.PlayFile("c:\son1.wav")
    et le module de classe "Class1" pourra être réutilisé dans d'autres projets. 



    Cordialement, Jacques

    lundi 19 novembre 2012 10:02
  • Merci pour vos réponses!

    Jacques j'ai suivi ton conseil et je peux grâce à cela lire un son depuis n'importe quelle fenêtre...merci!

    J'ai donc une classe

    Public Class UISound
        Public Shared WithEvents musicPlayer As New WMPLib.WindowsMediaPlayer
        Public Shared Sub PlayMusic(ByVal url As String)
            musicPlayer = New WMPLib.WindowsMediaPlayer
            musicPlayer.URL = url
            volumeMusic()
            musicPlayer.controls.play()
        End Sub
        Public Shared Sub volumeMusic()
            musicPlayer.settings.volume = My.Settings.music_volume / 10
        End Sub    
        Public Shared Sub musicPlayer_MediaEnded(ByVal NewState As Integer) Handles musicPlayer.PlayStateChange
            If NewState = WMPLib.WMPPlayState.wmppsStopped Then
                musicPlayer.close()
            End If
        End Sub
    End Class

    Et dans la fenêtre principale j'ai ceci, qui va chercher un morceau de musique de façon aléatoire dans une liste:

    Public Sub Music()
                Dim random As New Random()
                Dim rndnbr As Integer
                Dim musicLink As String
                rndnbr = random.Next(0, musicList.Count)
                musicLink = musicList(rndnbr)
                UISound.PlayMusic(musicLink)
    End Sub

    J'ai dans la classe une méthode prévue pour lorsque la musique se termine.
    Mais comment puis-je alors rappeler le Sub Music() de la fenêtre principale (pour qu'il pioche un nouveau morceaux et relance une lecture)
    ?
    A moins que cette détection de fin de musique doive se faire directement depuis la fenêtre principale?

    Merci!

    • Modifié jmdeb lundi 19 novembre 2012 11:37
    lundi 19 novembre 2012 11:36
  • Je pense que pour cela il faut que la classe, ici UISound, génère un événement dans la feuille via "RaiseEvent". Tu pourras peut être trouver ton bonheur ici : Event et RaiseEvent

    Il s'y trouve des exemples de code qui semblent correspondre à ce qu tu désires faire.


    Cordialement, Jacques

    lundi 19 novembre 2012 12:22
  • Un petit "prototype", à adapter :

    Module de classe :

    Public Class Class1
        Public Shared WithEvents Player As New WMPLib.WindowsMediaPlayer
    
        Public Shared Sub PlayFile(ByVal url As String)
            Player = New WMPLib.WindowsMediaPlayer
            Player.URL = url
            Player.controls.play()
        End Sub
    
        Shared Event MusicEnd()
    
        Public Shared Sub musicPlayer_MediaEnded(ByVal NewState As Integer) Handles Player.PlayStateChange
            If NewState = WMPLib.WMPPlayState.wmppsStopped Then
                Player.close()
                RaiseEvent MusicEnd()
            End If
        End Sub
    End Class

    et dans ta fenêtre principale :

    Public Class Form1
        Dim WithEvents cls As New Class1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Class1.PlayFile("c:\son1.wav")
        End Sub
    
        Private Sub cls_MusicEnd() Handles cls.MusicEnd
            MessageBox.Show("Morceau terminé")
        End Sub
    End Class

    Si la classe est correctement déclarée, l'instance 'cls' de Class1 doit apparaitre dans le Combo de gauche de la fenêtre et l'évènement 'MusicEnd' dans celui de droite :


    Cordialement, Jacques

    • Marqué comme réponse jmdeb mardi 20 novembre 2012 08:52
    lundi 19 novembre 2012 12:52
  • Jacques,

    C'est parfait ainsi!!

    Un tout grand merci pour ta gentillesse et ta disponibilité!

    Le temps que tu as bien voulu mettre dans ta réponse m'a beaucoup aidé...et m'a ouvert de nouveaux horizons!

    Je voulais vraiment te remercier!!!


    • Modifié jmdeb mardi 20 novembre 2012 08:56
    mardi 20 novembre 2012 08:55
  • Merci du retour, et content de t'avoir mis sur une piste :-)

    Cordialement, Jacques

    mardi 20 novembre 2012 09:39