Oppure

Loading
26/07/07 6:30
ppanico2
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:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TrackBar1.TickFrequency = 1
        TrackBar1.Minimum = 0
        TrackBar1.Maximum = 10
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        Label1.Text = TrackBar1.Value
        Class1.A.Volume = TrackBar1.Value 'qui mi da l'errore di runtime
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Class1.A.Play()
    End Sub

End Class


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

Public Class Class1
    Public Shared A As New Microsoft.DirectX.AudioVideoPlayback.Audio("C:\" & "pupo.mp3")
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.
aaa
29/07/07 9:05
ppanico2
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):

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2
    End Sub

    Private Sub ApriToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApriToolStripMenuItem.Click
        OpenFileDialog1.ShowDialog()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Class1.A.Play()
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        TrackBar1.TickFrequency = 1
        TrackBar1.SmallChange = 10
        TrackBar1.LargeChange = 10
        TrackBar1.Minimum = -3000
        TrackBar1.Maximum = 0
        If TrackBar1.Value <> TrackBar1.Minimum Then
            Try
                Class1.A.Volume = TrackBar1.Value
            Catch ex As Exception
                Class1.A.Volume = TrackBar1.Minimum
            End Try
        End If
        Label1.Text = TrackBar1.Value
    End Sub

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:


Public Class Class1
    Public Shared A As New Microsoft.DirectX.AudioVideoPlayback.Audio(Form1.OpenFileDialog1.FileName)
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?

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

    Private Sub MyAppPrivate(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles MyBase.Load, ApriToolStripMenuItem.Click, EsciToolStripMenuItem.Click, _
            Button1.Click, TrackBar1.Scroll

        TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2

        If sender.Equals(ApriToolStripMenuItem) Then
            OpenFileDialog1.ShowDialog()
        ElseIf sender.Equals(EsciToolStripMenuItem) Then
            Application.Exit()
        ElseIf sender.Equals(Button1) Then
            Class1.A.Play()
        ElseIf sender.Equals(TrackBar1) Then
            TrackBar1.TickFrequency = 1
            TrackBar1.SmallChange = 10
            TrackBar1.LargeChange = 10
            TrackBar1.Minimum = -3000
            TrackBar1.Maximum = 0
            If TrackBar1.Value <> TrackBar1.Minimum Then
                Try
                    Class1.A.Volume = TrackBar1.Value
                Catch ex As Exception
                    Class1.A.Volume = TrackBar1.Minimum
                End Try
            End If
            Label1.Text = TrackBar1.Value
        End If

    End Sub

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 29/07/07 9:32
aaa
29/07/07 16:45
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?
aaa
30/07/07 1:09
ppanico2
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 30/07/07 1:11
aaa
30/07/07 9:12
Il Totem
Imports Microsoft.DirectX.AudioVideoPlayback
Public Shared A As Audio

Private Sub ApriToolStripMenuItem_Click(...) Handles ApriToolStripMenuItem.Click
If OpenFileDialog1.ShowDialog = MessageBoxResult.OK Then
  A = New Audio(OpenFileDialog1.FileName)
End If
End Sub

Private Sub Button1_Click(...) Handles Button1.Click
  If Not A Is Nothing Then
    A.Play()
  End If
End Sub
aaa
30/07/07 13:00
ppanico2
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:
Public Class Form1 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
TrackBar1.Value = (TrackBar1.Maximum + TrackBar1.Minimum) / 2 
End Sub 

Private Sub ComandiMenu(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles EsciToolStripMenuItem.Click, _ 
ApriToolStripMenuItem.Click 
If sender.Equals(EsciToolStripMenuItem) Then 
Application.Exit() 
ElseIf sender.Equals(ApriToolStripMenuItem) Then 
OpenFileDialog1.ShowDialog() 
End If 
Label2.Text = OpenFileDialog1.FileName 
End Sub 

Private Sub Pulsanti(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles Button1.Click, _ 
Button2.Click, _ 
Button3.Click 
If sender.Equals(Button1) Then 
Class1.A.Open(OpenFileDialog1.FileName) 
Class1.A.Play() 
ElseIf sender.Equals(Button2) Then 
Class1.A.Pause() 
ElseIf sender.Equals(Button3) Then 
Class1.A.Stop() 
End If 
End Sub 

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll 
TrackBar1.TickFrequency = 1 
TrackBar1.SmallChange = 10 
TrackBar1.LargeChange = 10 
TrackBar1.Minimum = -3000 
TrackBar1.Maximum = 0 
If TrackBar1.Value <> TrackBar1.Minimum Then 
Try 
Class1.A.Volume = TrackBar1.Value 
Catch ex As Exception 
Class1.A.Volume = TrackBar1.Minimum 
End Try 
End If 
Label1.Text = TrackBar1.Value 
End Sub 

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 30/07/07 13:49
aaa
31/07/07 7:55
Il Totem
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.
aaa
31/07/07 15:24
ppanico2
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 :-?
aaa