Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net]Controllare il volume con una TrackBar
Forum - C# / VB.NET - [vb.net]Controllare il volume con una TrackBar

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
ppanico2 (Normal User)
Newbie


Messaggi: 9
Iscritto: 26/07/2007

Segnala al moderatore
Postato alle 8:30
Giovedì, 26/07/2007
Buongiorno a tutti,

questo è il mio primo post perciò colgo l' occasione per salutare tutti :)

Ho un progetto costituito da un Form e una Classe, nel Form ho aggiunto i seguenti controlli: una TrackBar, una Label e un Button.

Il Form contiene questo codice:

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.  
  3.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.         TrackBar1.TickFrequency = 1
  5.         TrackBar1.Minimum = 0
  6.         TrackBar1.Maximum = 10
  7.     End Sub
  8.  
  9.     Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
  10.         Label1.Text = TrackBar1.Value
  11.         Class1.A.Volume = TrackBar1.Value 'qui mi da l'errore di runtime
  12.     End Sub
  13.  
  14.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  15.         Class1.A.Play()
  16.     End Sub
  17.  
  18. End Class



mentre la Classe, per rendere la variabile A globale, contiene questo codice:

Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.     Public Shared A As New Microsoft.DirectX.AudioVideoPlayback.Audio("C:\" & "pupo.mp3")
  3. End Class



Naturalmente ho aggiunto i riferimenti a Microsoft.DirectX e a Microsoft.DirectX.AudioVideoPlayback da Progetto >> Aggiungi riferimento...

Non riesco a regolare il volume del file.mp3 che ho messo in C, qualcuno mi può aiutare perfavore?

Ci sto smanettando da tutta la notte ma non ci riesco proprio. Ho postato una versione semplificata del prog che sto scrivendo per non rendervi noiosa la lattura del programma e per far in modo che la soluzione sia di facile comprensione anche a chi possa avere il mio stesso problema.

Confido nel vostro aiuto e vi prego di spendere un pò del vostro tempo per darmi una mano.

GRAZIE INFINITE a chiunque possa e voglia aiutarmi.

PM Quote
Avatar
ppanico2 (Normal User)
Newbie


Messaggi: 9
Iscritto: 26/07/2007

Segnala al moderatore
Postato alle 11:05
Domenica, 29/07/2007
Buona Domenica a tutti,

ho risolto il problema del post precedente gestendo l' eccezione come nel codice che potete vedere sotto, lo riscrivo interamente così chi avesse la pazienza di costruirsi il form come ho descritto nel primo post di questo topic possa provare il programma semplicemente copiando e incollando questo secondo codice, per il resto la descrizione è identica a quella del primo post (unica aggiunta un MenuStrip con le voci File >> Apri e File >> Esci per aprire un file a scelta da un OpenFileDialog aggiunto al form e per poter uscire con Esci):

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2
  3.     End Sub
  4.  
  5.     Private Sub ApriToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApriToolStripMenuItem.Click
  6.         OpenFileDialog1.ShowDialog()
  7.     End Sub
  8.  
  9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  10.         Class1.A.Play()
  11.     End Sub
  12.  
  13.     Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
  14.         TrackBar1.TickFrequency = 1
  15.         TrackBar1.SmallChange = 10
  16.         TrackBar1.LargeChange = 10
  17.         TrackBar1.Minimum = -3000
  18.         TrackBar1.Maximum = 0
  19.         If TrackBar1.Value <> TrackBar1.Minimum Then
  20.             Try
  21.                 Class1.A.Volume = TrackBar1.Value
  22.             Catch ex As Exception
  23.                 Class1.A.Volume = TrackBar1.Minimum
  24.             End Try
  25.         End If
  26.         Label1.Text = TrackBar1.Value
  27.     End Sub
  28.  
  29. End Class



La classe, per definire la variabile globale A, è stata sempre aggiunta come descritto nel primo post del topic, cioè:

Progetto >> Aggiungi classe...

e contiene lo stesso codice:


Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.     Public Shared A As New Microsoft.DirectX.AudioVideoPlayback.Audio(Form1.OpenFileDialog1.FileName)
  3. End Class



Così il programma funge, cioè si puo scegliere un file audio dalla voce di menu File >> Apri, eseguirlo e modificarne il volume.

Adesso però sto cercando di scrivere il codice più elegantemente, perfavore, qualcuno mi puo correggere questo?

Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.         Public Shared A As New Microsoft.DirectX.AudioVideoPlayback.Audio(Form1.OpenFileDialog1.FileName)
  3.     End Class
  4.  
  5.     Private Sub MyAppPrivate(ByVal sender As System.Object, ByVal e As System.EventArgs) _
  6.             Handles MyBase.Load, ApriToolStripMenuItem.Click, EsciToolStripMenuItem.Click, _
  7.             Button1.Click, TrackBar1.Scroll
  8.  
  9.         TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2
  10.  
  11.         If sender.Equals(ApriToolStripMenuItem) Then
  12.             OpenFileDialog1.ShowDialog()
  13.         ElseIf sender.Equals(EsciToolStripMenuItem) Then
  14.             Application.Exit()
  15.         ElseIf sender.Equals(Button1) Then
  16.             Class1.A.Play()
  17.         ElseIf sender.Equals(TrackBar1) Then
  18.             TrackBar1.TickFrequency = 1
  19.             TrackBar1.SmallChange = 10
  20.             TrackBar1.LargeChange = 10
  21.             TrackBar1.Minimum = -3000
  22.             TrackBar1.Maximum = 0
  23.             If TrackBar1.Value <> TrackBar1.Minimum Then
  24.                 Try
  25.                     Class1.A.Volume = TrackBar1.Value
  26.                 Catch ex As Exception
  27.                     Class1.A.Volume = TrackBar1.Minimum
  28.                 End Try
  29.             End If
  30.             Label1.Text = TrackBar1.Value
  31.         End If
  32.  
  33.     End Sub
  34.  
  35. End Class



Adesso il form è sempre quello di prima, ma ho eliminato il file di nome Classe1.vb in quanto la classe l' ho definita nel Form1.

Perfavore datemi una mano, l' errore sarà banale, ma ai miei occhi è invisibile....

GRAZIE a tutti dell' attenzione.

p.s. L' errore è di runtime su questo rigo:

Class1.A.Play()

e si verifica dopo che apro il file dalla menu bar e clicco il pulsante che contiene il codice per ascoltarlo.

Ultima modifica effettuata da ppanico2 il 29/07/2007 alle 11:32
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:45
Domenica, 29/07/2007
Non vedo il motivo di dichiarare una classe per aggiungerci una sola variabile. E' inutile. Inoltre non puoi definire nessuna classe prima di Form1, ma solo dopo. Dichiara A come variabile globale e importa il namespace AudioVideoPlayback invece di scrivere tutto il percorso del tipo. Poi non dichiarare A con un costruttore che potrebbe non esistere, assicurati che la stringa passata come parametro non sia vuota. Altra cosa: io ti consiglierei di togliere quell'handler multiplo e sostituirlo con più delegati, è più ordinato. In ultimo, per rendere il codice più leggibile, sostituire i nomi con nomi più significativi.
Puoi postare il testo dell'errore?

PM Quote
Avatar
ppanico2 (Normal User)
Newbie


Messaggi: 9
Iscritto: 26/07/2007

Segnala al moderatore
Postato alle 3:09
Lunedì, 30/07/2007
Testo quotato

Postato originariamente da Il Totem:

Non vedo il motivo di dichiarare una classe per aggiungerci una sola variabile. E' inutile. Inoltre non puoi definire nessuna classe prima di Form1, ma solo dopo. Dichiara A come variabile globale e importa il namespace AudioVideoPlayback invece di scrivere tutto il percorso del tipo. Poi non dichiarare A con un costruttore che potrebbe non esistere, assicurati che la stringa passata come parametro non sia vuota. Altra cosa: io ti consiglierei di togliere quell'handler multiplo e sostituirlo con più delegati, è più ordinato. In ultimo, per rendere il codice più leggibile, sostituire i nomi con nomi più significativi.
Puoi postare il testo dell'errore?



Errore sul rigo Class1.A.Play() nell' event Button1:

TypeInitializationException

p.s. Sono daccordo con te, ma mi serve per imparare.

Usando più delegati ho gia risolto e il codice è su.

I nomi li cambio dopo in più significativi, ho usato quelli di default per rendervi comprensibile il problema se no avrei dovuto scrivere un post kilometrico.

Potresti provare il codice perfavore e magari postarmelo corretto? L' errore è banale, ne son convinto, ma per me che del vb.net son nuovo è difficile risolverlo... e servirebbe come esempio anche ad altri che incontrassero lo stesso problema o problemi analoghi in futuro.

p.p.s. Il codice corretto perfavore... è più esplicativo di un milione di parole. GRAZIE!

Ultima modifica effettuata da ppanico2 il 30/07/2007 alle 3:11
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:12
Lunedì, 30/07/2007
Codice sorgente - presumibilmente VB.NET

  1. Imports Microsoft.DirectX.AudioVideoPlayback
  2. Public Shared A As Audio
  3.  
  4. Private Sub ApriToolStripMenuItem_Click(...) Handles ApriToolStripMenuItem.Click
  5. If OpenFileDialog1.ShowDialog = MessageBoxResult.OK Then
  6.   A = New Audio(OpenFileDialog1.FileName)
  7. End If
  8. End Sub
  9.  
  10. Private Sub Button1_Click(...) Handles Button1.Click
  11.   If Not A Is Nothing Then
  12.     A.Play()
  13.   End If
  14. End Sub


PM Quote
Avatar
ppanico2 (Normal User)
Newbie


Messaggi: 9
Iscritto: 26/07/2007

Segnala al moderatore
Postato alle 15:00
Lunedì, 30/07/2007
Comumque il problema di fondo, oltre alla questione di codice, che come visto in un modo o nell' altro si risolve infatti almeno una delle 2 versioni dello stesso programma funge, è questo:

nella stesura di un listato in vb.net è più professionale utilizzzare gestori di eventi condivisi per i controlli che gestiscono eventi simili oppure no? o è indifferente? ( anche se indifferente non credo che sia) e... se si, cioè se è più professionale utilizzare i gestori di eventi condivisi, è necessario utilizzare un unico gestore per tutti gli eventi che presentano gli stessi parametri?... come cercavo di fare con la seconda versione del programma?.. oppure si puo fare per categorie?... come per esempio nel codice sotto:
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.  
  3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4. TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2
  5. End Sub
  6.  
  7. Private Sub ComandiMenu(ByVal sender As System.Object, _
  8. ByVal e As System.EventArgs) Handles EsciToolStripMenuItem.Click, _
  9. ApriToolStripMenuItem.Click
  10. If sender.Equals(EsciToolStripMenuItem) Then
  11. Application.Exit()
  12. ElseIf sender.Equals(ApriToolStripMenuItem) Then
  13. OpenFileDialog1.ShowDialog()
  14. End If
  15. Label2.Text = OpenFileDialog1.FileName
  16. End Sub
  17.  
  18. Private Sub Pulsanti(ByVal sender As System.Object, _
  19. ByVal e As System.EventArgs) Handles Button1.Click, _
  20. Button2.Click, _
  21. Button3.Click
  22. If sender.Equals(Button1) Then
  23. Class1.A.Open(OpenFileDialog1.FileName)
  24. Class1.A.Play()
  25. ElseIf sender.Equals(Button2) Then
  26. Class1.A.Pause()
  27. ElseIf sender.Equals(Button3) Then
  28. Class1.A.Stop()
  29. End If
  30. End Sub
  31.  
  32. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
  33. TrackBar1.TickFrequency = 1
  34. TrackBar1.SmallChange = 10
  35. TrackBar1.LargeChange = 10
  36. TrackBar1.Minimum = -3000
  37. TrackBar1.Maximum = 0
  38. If TrackBar1.Value <> TrackBar1.Minimum Then
  39. Try
  40. Class1.A.Volume = TrackBar1.Value
  41. Catch ex As Exception
  42. Class1.A.Volume = TrackBar1.Minimum
  43. End Try
  44. End If
  45. Label1.Text = TrackBar1.Value
  46. End Sub
  47.  
  48. End Class


?????????????????????????????????????????????????????????????????????

p.s. ahh nella seconda versione del programma, quello che funziona, se dopo si sceglie un altro file riproduce sempre quello di prima; per poter cambiare file da ascoltare aggiungere questo rigo

Class1.A.Open(OpenFileDialog1.FileName)

nell' evento ApriToolStripMenuItem

praticamente subito prima del rigo

Class1.A.Play()

Quest' ultima versione del programma funziona correttamente, almeno riguardo a quell' aspetto.

Devo ancora risolvere qualche piccolo problemino come pre esempio una eccezione che avviene se cerco di muovere la TrackBar prima di aver selezionato un file. Succerimenti a riguardo??

GRAZIE DELL' ATTENZIONE :)

p.s. se volete provare quest' ultimo codice aggiungete una Labe2 nel form per visualizzare il percorso del file selezionato.

Ultima modifica effettuata da ppanico2 il 30/07/2007 alle 15:49
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:55
Martedì, 31/07/2007
Secondo me conviene utilizzare gestori di eventi per più controlli solo se eseguono operazioni identiche. Infatti per scrivere gestori a più handles si impiega più tempo, in quanto bisogna scrivere la sequenza degli If, mentre con gli eventi singoli, il codice necessario e sufficiente viene auto-generato dal compilatore e bisogna solo scrivere le routine.
Il file dovrebbe essere caricato anche con New Audio(file). Stai attento ad usare OpenFileDialog1.FileName: potrebbe anche essere Nothing.

L'eccezione della trackbar viene generata perchè dopo il Catch fai riferimento ad A, che non è inizializzato (non si sono selezionate canzoni). Puoi mettere un altro Try all'interno o all'esterno per catturare anche quest'eccezione, oppure verificare che A non sia Nothing con un If.

PM Quote
Avatar
ppanico2 (Normal User)
Newbie


Messaggi: 9
Iscritto: 26/07/2007

Segnala al moderatore
Postato alle 17:24
Martedì, 31/07/2007
Testo quotato

Postato originariamente da Il Totem:

L'eccezione della trackbar viene generata perchè dopo il Catch fai riferimento ad A, che non è inizializzato (non si sono selezionate canzoni). Puoi mettere un altro Try all'interno o all'esterno per catturare anche quest'eccezione, oppure verificare che A non sia Nothing con un If.



Ci sto smanettando da tutto oggi ma non riesco a risolvere :d ti dispiacerebbe postarmi il codice corretto :-?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:01
Mercoledì, 01/08/2007
Codice sorgente - presumibilmente VB.NET

  1. Try
  2. A.Volume = TrackBar1.Value
  3. Catch ex As Exception
  4. If Not A Is Nothing
  5.  A.Volume = TrackBar1.Minimum
  6. End If
  7. End Try


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo