Meilleur auteur de réponses
A partir de la fenêtre "2", lancer une procédure de lecture de son présente sur la fenêtre "1"

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 faireMainWindow.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!!
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
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,
-
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
-
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
-
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
-
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
-
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
-