Listbox import von Tracknamen durch UltraID3.dll oder ID3.dll

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Linux13524.

    Listbox import von Tracknamen durch UltraID3.dll oder ID3.dll

    Ich hab mir einen etwas erweiterten "Musikplayer" gebastelt, der bis jetzt 1 Listboxen hat. Listbox 1 hat den Pfad zu der Datei. Listbox 2 Zeigt den Namen so zu sagen an. Bisher hab ich es so gemacht, dass wenn man einen Titel importiert, dass dieser von dem WindowsMediaplayer den Namen bekommt, aber das ist unschön ungenau und hat noch die nervige .mp3 Endung. Die Mp3 Endung könnte ich theoretisch entfernen, aber da diese Methode einfach "Trackname" zu benutzten unschön finde, würde ich es gerne mit der UltraID3.dll oder ID3.dll lösen. Mit der UltraID3.dll kann ich den Trackname selbst so auslesen:

    VB.NET-Quellcode

    1. Label7.Text = "Titel: " + Tag_Info.ID3v2Tag.Title


    Da dies ohne Probleme klappt dachte ich mir, dass müsse dann doch auch so gehen, weil diese Methode wirklich sehr viel besser meiner Meinung nach ist. Nun ja mein Problem liegt hier:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    2. Dim open As New OpenFileDialog Try open.Title = "Wähle deine Musik aus:" open.FileName = "" open.Multiselect = True open.Filter = "Mp3 Files (*.mp3)|*.mp3|MPEG-4 (*.m4a)|*.m4a|All Files (*.*)|*.*" If open.ShowDialog = Windows.Forms.DialogResult.OK Then For Each track As String In open.FileNames ListBox1.Items.Add(track) Next Dim Tag_Info As New UltraID3 Tag_Info.Read(ListBox1.SelectedItem.ToString) 'Tag_Info.ID3v2Tag.Title For Each trackname As String In open.SafeFileNames ListBox2.Items.Add(trackname) Next End If Catch ex As Exception
    3. End Try End Sub


    Wenn ich dort bei

    VB.NET-Quellcode

    1. ListBox2.Items.Add(trackname)
    anstatt des Tracknames: "Tag_Info.ID3v2Tag.Title" einsetzte (was ich da halt importiert hab...) dann ist in meiner Liste anstatt dem Titel, diese Zeile ein der Liste einfach leer gewesen. Kann mir jemand weiter helfen? Danke schon mal im Voraus :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bournout3000“ ()

    @Bournout3000: Trenne zunächst GUI und Daten.
    Button 5 - Dateien einlesen und anzeigen, xix UltraID3, mach es mit Using, ohne Try-Catch:

    VB.NET-Quellcode

    1. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    2. Using open As New OpenFileDialog
    3. open.Title = "Wähle deine Musik aus:"
    4. open.FileName = ""
    5. open.Multiselect = True
    6. open.Filter = "Mp3 Files|*.mp3|MPEG-4|*.m4a|All Files|*.*"
    7. If open.ShowDialog = Windows.Forms.DialogResult.OK Then
    8. ListBox1.Items.AddRange(open.FileNames)
    9. ListBox2.Items.AddRange(open.SafeFileNames)
    10. End If
    11. End Using
    12. End Sub
    Wenn Du eine ListBox befüllst, hat sie i.A. kein SelectedItem, das solltest Du separat organisieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für den Tipp :) Das Using und .Addrange kannte ich bis jetzt noch nicht daher weiß ich nicht genau was AddRange macht. Das Using ist ja offensichtlich :)
    Nur wie setzte ich dort dann den eigentlichen Namen selbst ein also von dem "Tag_Info.ID3v2Tag.Title" , da ich genau dieses dort hineinsetzen will anstatt das .SafeFileNames ?
    AddRange() ersetzt je eine For Each-Schleife.
    Wozu brauchst Du an dieser Stelle

    Bournout3000 schrieb:

    "Tag_Info.ID3v2Tag.Title"
    :?:
    Liest das den Track-Namen aus?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Genau das sagt mir nicht den eigendlichen Namen der Datei, sondern den in der Datei eingespeicherten Titel der Datei.
    Als Beispiel heißt der Name der Datei Partymusik43.mp3 und der Titel ist z.B. Hungry Eyes oder so.
    Das ist eben der Unterschied und ich wüsste halt gerne, wie ich das denn damit direkt in die Listbox2 lade anstatt des Filenames :)

    Bournout3000 schrieb:

    Genau
    Dann kläre zunächst auf, wie die entsprechende DLL-Funktion aufgerufen wird und wie Du Dein "Ergebnis" in einen String geladen bekommst.
    Den kannst Du zunächst in einem Label oder so anzeigen.
    Wenn das funktioniert, befüllen wir die ListBox.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich benutze das um das unten in eine kleine Extrainfobox so zu sagen zu packen.
    Dort hab ich ein Label, dass mir dann "Titel:" mit dem dazugehörigen Titelnamen sagt.
    Der Code um den Titel in das Label zu schreiben lautet:

    VB.NET-Quellcode

    1. Dim Tag_Info As New UltraID3 Tag_Info.Read(ListBox1.SelectedItem.ToString) Label7.Text = "Titel: " + Tag_Info.ID3v2Tag.Title


    Da in einem Label ja ein String als .text stehen muss ist das ja in diesem Fall ein String. Die Frage ist nur, wie ich das halt anstatt des "

    VB.NET-Quellcode

    1. istBox2.Items.AddRange(open.SafeFileNames)
    " dieses "

    VB.NET-Quellcode

    1. Tag_Info.ID3v2Tag.Title
    " da hinein bekomme und das dann noch richtig mit

    VB.NET-Quellcode

    1. Dim Tag_Info As New UltraID3 Tag_Info.Read(ListBox1.SelectedItem.ToString)
    importiere. Das hab ich leider noch nicht hinbekommen, nur in diesem Label klappt das halt :S

    Bournout3000 schrieb:

    VB.NET-Quellcode

    1. istBox2.Items.AddRange(open.SafeFileNames)
    hängt eine IEnumerable an die Listbox.
    istBox2.Items.Add("bla") hängt einen einzelnen String dran.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Heißt das, dass wenn ich das darüber erstmal importiere mit: Dim Tag_Info As New UltraID3 Tag_Info.Read(ListBox1.SelectedItem.ToString) und dann darunter listBox2.Items.AddRange(""+Tag_Info.ID3v2Tag.Title) mache, dass das dann geht, weil das dann als String erkannt wird und nicht als dieses IEnumerable?
    Wenn Du mit den Parametern Schwierigkeiten hast, lege Zwischenvariablen an, denen Du genau das zuweist, was der nächste Schritt benötigt.
    Dann machst Du da einen Haltepunkt hin und überzeugst Dich, dass die Information, die der nächste Schritt benötigt, dort auch ankommt!
    Ich denke mal, Du übergibst nur den Dateinamen ohne Pfad oder so.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    wenn ich das das so mache wie oben beschrieben bekomme ich diesen Fehler:

    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "AddRange" mit diesen Argumenten aufgerufen werden kann:
    "Public Sub AddRange(items() As Object)": Der Wert vom Typ "String" kann nicht in "1-dimensionales Array von Object" konvertiert werden.
    "Public Sub AddRange(value As System.Windows.Forms.ListBox.ObjectCollection)": Der Wert vom Typ "String" kann nicht in "System.Windows.Forms.ListBox.ObjectCollection" konvertiert werden. C:\Users\Username\Desktop\GDS\Bournify\Youtube - Advanced Music Player\Form1.vb 53 17 Bournify

    wie kann ich das dann von diesem String in das ObjectCollection Format bekommen?
    So sagt er mir keinen Fehler, nur wenn ich einen Titel damit importiere dann sagt er mir:
    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in Bournify.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    @Bournout3000: Wenn eine Exception kommt, schließe den Dialog, klick auf die betreffende Variable und drück Shift+F9, dann wird Dir deren Inhalt angezeigt.
    Oder setz einen Haltepunkt drauf usw.
    Überzeuge Dich, dass die DLL Dir den erwarteten Wert zurück liefert!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also wenn ich das richtig verstehe willst du beim Importieren nicht die Namen der Dateien sondern die Title in Listbox2 haben, oder?

    Dann probier mal so:

    VB.NET-Quellcode

    1. If open.ShowDialog() = DialogResult.Ok then
    2. Listbox1.Items.Addrange(open.Filenames)
    3. For Each file As String In open.Filenames
    4. Dim Tag_Info as New UltraID3
    5. Tag_Info.Read(file)
    6. Listbox2.Add(Tag_Info.Title)
    7. Next
    8. End If


    Ich hoffe so klappt es, denn ich hab es jetzt nicht ausprobiert.
    Mit freundlichen Grüßen

    Linux
    Bei mir wird 3x ausgeworfen:

    Fehler 1 "open" ist nicht deklariert. Dateieingaben und -ausgaben sind im Microsoft.VisualBasic-Namespace verfügbar. C:\Users\Username\Desktop\GDS\Bournify\Youtube - Advanced Music Player\Form1.vb 56 12 Bournify


    Der erkennt dieses Open nicht aber bei dem unteren Teil

    VB.NET-Quellcode

    1. Dim Tag_Info As New UltraID3 Tag_Info.Read(file) ListBox2.Add(Tag_Info.Title)
    sagt er mir noch keine Fehler :)