Uit listbox mp3 afspelen

Status
Niet open voor verdere reacties.

dannydaboy

Gebruiker
Lid geworden
13 sep 2005
Berichten
195
Mensen ik kom er echt niet meer uit. Ik ben bezig met het volgende

Ik heb een listbox gemaakt die leest een directory uit op de pc met mp3 files. dit heb ik met de volgende code gedaan

Code:
    Private Sub album1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim directory = (Application.StartupPath + "\albums\1")
        Dim files() As System.IO.FileInfo
        Dim dirinfo As New System.IO.DirectoryInfo(directory)
        files = dirinfo.GetFiles("*.mp3", IO.SearchOption.AllDirectories)
        For Each file In files
            ListBox1.Items.Add(file)

dit werkt uitstekend hij vult de listbox met alle mp3 files. Nu wil ik als ik op 1 item klik in de listbox dat de mp3 word afgespeeld. Ik moet dus het volledige pad achterhalen en deze laten afspelen. Hier loop ik dus vast.

Wie kan mij vertellen hoe ik het item in de listbox laat afspelen als ik er op klik?

Van mij mag er ook een tweede lijstbox (onzichtbaar) in komen met de volledige adressen naar de file
 
In jouw geval kun je beter een ListView gebruiken. Items zijn van het type ListViewItem die naast de zichtbare tekst van een item ook onzichtbare informatie kan bevatten, bijvoorbeeld dus het volledige pad naar een mp3 bestand.
Een ListView is wel wat geavanceerder in gebruik dan een ListBox. Hier zie je hoe je een ListView vult met items:

Code:
    Private Sub album1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        For Each file As IO.FileInfo In New IO.DirectoryInfo("C:\Users\Michiel\Music").GetFiles("*.mp3")
            Dim lvi As New ListViewItem
            lvi.Text = file.Name 'Alleen bestandsnaam als item tekst
            lvi.Tag = file.FullName 'Volledige pad opslaan in de Tag property. Elk item heeft zn eigen Tag
            ListView1.Items.Add(lvi)
        Next

    End Sub

Items verschijnen alleen als je de View property op Details zet en een Column hebt toegevoegd.

Om de waarde van de Tag property te krijgen voor het geselecteerde item doe je:

Code:
    Private Sub ListView1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ListView1.Click

        Me.Text = ListView1.SelectedItems(0).Tag

    End Sub

Let op! Ik gebruik hier het Click event, niet het SelectedIndexChanged event.

Eventueel kun kun je de ListView uitbreiden met extra subitems die bijvoorbeeld bestands grootte en afspeelduur van elk mp3 bestand laten zien.
 
Laatst bewerkt:
Ik heb het werkend. Nu heb ik alleen het probleem dat ik op een button moet klikken nadat ik een item heb geselecteerd. Is het mogelijk het item te starten als ik het selecteer?

Verder krijg ik de listview nog niet netjes onder elkaar maar in rijen naast elkaar.
 
Ja dan moet je datgene dat d mp3's laat afspelen onder het click event van ListView1 zetten.
En zorg ervoor dat de property View op Details staat, zoals ik al heb gezegd.
 
alles werkt nu perfect, nu heb ik nog 2 kleine vraagjes

-Hoe kan ik realiseren om alle nummers af te spelen (of als ik een nummer aanklikt dat dan begint te spelen, automatisch als het nummer afgelopen is het volgende item in de lijst pakt).

-Hoe kan ik de totale speelduur tonen van alle nummers in de listview

-Is het mogelijk om de listview te gebruiken om artiestnaam, album naam, uitgever en speelduur van het geselecteerde nummer te tonen

Sorry voor de vragen op dit moment zit ik in de leerfase..iedereen moet het kunnen leren...

bedankt
 
ik ben zelf aan het stoeien met het exporteren van nummers maar het lukt niet helemaal.

Ik werk met de listview van hierboven en als ik de volgende code onder de export knop zet

Code:
        My.Computer.FileSystem.CopyFile _
("F:\1.jpg", "F:\1.jpg")

dan kopieert hij dit netjes (behalve als ik als doel c:/bestandnaam neem) maar ik wil nu als bron bestand het geselecteerde nummer in de listview hebben en als destination een door de gebruiker gedefinieerd pad. Hoe realiseer ik dit.

ik begrijp dat de lvi.Tag = file.FullName in de listview code de padnaam bevat maar zet ik deze als doelbestand dan krijg ik een error.

Naast 1 geselecteerd nummer exporteren wil ik ook alle nummers in de listview exporteren met een tweede button.
 
alles werkt nu perfect, nu heb ik nog 2 kleine vraagjes

-Hoe kan ik realiseren om alle nummers af te spelen (of als ik een nummer aanklikt dat dan begint te spelen, automatisch als het nummer afgelopen is het volgende item in de lijst pakt).

Je weet hoe je een nummer afspeelt? Of hoe je een afspeellijst maakt? (Gebruik je het WindowsMediaComponent?)

Je kan met een for-each loop alle items in een ListView ophalen:

[CPP]For Each item As ListViewItem In ListView1.Items
Console.WriteLine(item.Text)
''// evt. item.subitems
Next[/CPP]

-Hoe kan ik de totale speelduur tonen van alle nummers in de listview

Hoe is dat weergegeven? 00:00:00 ? En als het onder een uur is 00:00 ?

-Is het mogelijk om de listview te gebruiken om artiestnaam, album naam, uitgever en speelduur van het geselecteerde nummer te tonen

Daar kun je de SubItems van een ListViewItem voor gebruiken. Zet de ListView wel eerst op Detail! Je kunt SubItems vinden als property van een ListViewItem.

Zo roep je ze aan (eerste SubItem van eerste Item):

[cpp]ListViewNaam.Items(0).SubItems(1).Text[/cpp]


Voor je 2e bericht:

ik begrijp dat de lvi.Tag = file.FullName in de listview code de padnaam bevat maar zet ik deze als doelbestand dan krijg ik een error.

Je moet een pad dat nog niet bestaat opgeven. Dat kan de gebruiker toch doen?

Naast 1 geselecteerd nummer exporteren wil ik ook alle nummers in de listview exporteren met een tweede button.
Even naar die For-Each loop kijken die ik boven in dit bericht als voorbeeld aandraag.


Verder: Zou je even een screenshot van je ListView kunnen maken, dan weet ik in welke kolom welke informatie staat.
 
Laatst bewerkt:
even een screenshot gemaakt en erin gezet wat de bedoeling is

hier mijn code

Code:
Public Class album1

    Private Sub album1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ControlBox = False
        PictureBox2.Image = New Bitmap(Application.StartupPath + "\hoesjes\1.jpg")
        For Each file As IO.FileInfo In New IO.DirectoryInfo(Application.StartupPath + "\albums\1").GetFiles("*.mp3")
            Dim lvi As New ListViewItem
            lvi.Text = file.Name 'Alleen bestandsnaam als item tekst
            lvi.Tag = file.FullName 'Volledige pad opslaan in de Tag property. Elk item heeft zn eigen Tag
            ListView1.Items.Add(lvi)
        Next
    End Sub

    Private Sub PictureBox1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        Albums.Show()
        Me.Close()
    End Sub

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

    End Sub

    Private Sub Label7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label7.Click
        Pc_info.Show()
    End Sub

    Private Sub ListView1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.Click
        AxWindowsMediaPlayer1.URL = ListView1.SelectedItems(0).Tag
        Label2.Text = ListView1.SelectedItems(0).Text
    End Sub
    Private Sub PictureBox7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox7.Click
        Dim afsluiten As Integer
        afsluiten = MsgBox("wil je echt afsluiten?", vbDefaultButton2 + vbYesNo, "Waarschuwing")
        If afsluiten = vbYes Then
            End
        Else

        End If
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        AxWindowsMediaPlayer1.settings.volume = TrackBar1.Value
        Label10.Text = TrackBar1.Value
    End Sub
End Class
screen.jpg
 
Er is vordering in de zaak ik krijg het inmiddels voor elkaar om een directory te kopieren (dus alle files) met de code

Code:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        My.Computer.FileSystem.CopyDirectory(
    Application.StartupPath + "\hoesjes",
    "C:\Musicmania",
    Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
    Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing)
    End Sub

Nu wil ik alleen dat de pc een dialog opent zodat de gebruiker een plaats kan selecteren waar hij de files wilt opslaan, want dit is niet altijd de c partitie.
 
Er worden op Helpmij heel veel lastige vragen gesteld, kortom "lastige vraag" zegt niets over je probleem. Titel aangepast.
 
Nu wil ik alleen dat de pc een dialog opent zodat de gebruiker een plaats kan selecteren waar hij de files wilt opslaan, want dit is niet altijd de c partitie.

Heel simpel:

[CPP]Dim open As New FolderBrowserDialog
If open.ShowDialog = DialogResult.OK Then
''// Geselecteerde pad is: open.SelectedPath
End If[/CPP]

:)
 
misschien een stomme vraag maar waar moet ik die code plakken in mijn click event?
 
Deze code geeft een scherm weer waar je een map kunt selecteren. Dus ja, dat moet je in je Click-event zetten omdat je eerst een map moet hebben om ernaar toe te kunnen kopiëren, toch ;)

En btw: stomme vragen bestaan niet :cool:
 
dan zou ik hem hier ergens tussen moeten plakken

Code:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        My.Computer.FileSystem.CopyDirectory(
    Application.StartupPath + "\albums\1",
    "C:\Musicmania\albums\1",
    Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
    Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing)
    End Sub

"C:\Musicmania\albums\1" zou er dan uit moeten
 
Had je de code al geprobeerd?

Zou zoiets moeten worden:

[cpp]Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim open As New FolderBrowserDialog
If open.ShowDialog = DialogResult.OK Then
My.Computer.FileSystem.CopyDirectory( _
Application.StartupPath & "\albums\1", _
open.SelectedPath, _
Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, _
Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing)
End If
End Sub[/cpp]
 
inderdaad dit werkt perfect. nu nog hetzelfde proberen met 1 geselecteerde file van de listview
 
Lukt dat zonder hulp?

En zo nee, over welke informatie beschik je? Het pad naar het bestand dat gekopieerd moet worden?
 
simpel uitgelegd laad ik de nummers in via een listview d.m.v de code
Code:
    Private Sub album1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ControlBox = False
        PictureBox2.Image = New Bitmap(Application.StartupPath + "\hoesjes\1.jpg")
        For Each file As IO.FileInfo In New IO.DirectoryInfo(Application.StartupPath + "\albums\1").GetFiles("*.mp3")
            Dim lvi As New ListViewItem
            lvi.Text = file.Name 'Alleen bestandsnaam als item tekst
            lvi.Tag = file.FullName 'Volledige pad opslaan in de Tag property. Elk item heeft zn eigen Tag
            ListView1.Items.Add(lvi)
        Next
    End Sub

de filenaam word hier ook uitgelezen omdat als ik op het nummer in de lijst klik het word afgespeeld.

Nu heb ik een button gemaakt voor alle nummers te kopieren naar een gekozen map. Naast deze functie wil ik nu ook een geselecteerd nummer naar een door de gebruiker gekozen plaats laten kopiëren.

Ikzelf denk dat ik meer info kan halen uit me listview want ik wil graag nog buiten de bovenstaande functies ook de tijd van een nummer wat afgespeeld word tonen en de totale playlist tijd. (weergave 00:00:00 of 00:00)
 
Als ik jou was, zou ik een extra kolom in de ListView plaatsen waar je het pad inzet. Daar kun je dan vanuit lezen.
Dan kun je eventueel ook nog een kolom maken met de duur.

Snap je?
 
Ik denk wel dat je een externe functie of bibliotheek nodig hebt om dingen als afspeelduur en mp3-tags uit te lezen. Ik geloof niet dat er functie of iets dergelijks aanwezig is één van de Frameworks.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan