UltraID3Lib.dll Datentyp der Eigenschaft .TrackNum unbekannt

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    UltraID3Lib.dll Datentyp der Eigenschaft .TrackNum unbekannt

    Hallo zusammen,

    ich hab ein kleines Problem. Ich möchte die Eigenschaft .TrackNum der UltraID3Lib setzen. Lesen ist kein Problem, einfach ein .ToString anhängen...

    Der Datentyp ist mir nicht ganz klar. Es scheint komischerweise kein String und kein Integer zu sein, das funktioniert nicht. Der Compiler schlägt mir folgendes vor:

    m_UltraID3.TrackNum = CType(DataGridView1.Rows(i).Cells(1).Value, Short?)

    Das funktioniert aber auch nicht. Was mich besonmders verwundert ist das "?" am Ende. Da kommt die Fehlermeldung:

    "System.InvalidCastException: Die angegebene Umwandlung ist ungültig."

    Weiss jemand zufälliug was ein gültiger Datentyp wäre oder gibt es eine Möglichkeit das herauszufinden?
    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!
    @RodFromGermany

    Da versteh ich nur Bahnhof. Zu viele Begriffe die ich nicht kenne. Liegt u.U. auch daran, dass die MS Docs maschinell übersetzt sind??

    Egal, die DLL bietet eine separate Methode für mein Vorhaben an, warum auch immer das so ist und man nicht einfach die Eigenschaft setzen kann... Hab das jetzt so gelöst:

    m_UltraID3.SetTrackNum(CType(DataGridView1.Rows(i).Cells(1).Value, String))

    :)

    kafffee schrieb:

    Da versteh ich nur Bahnhof.
    Wenn Du C oder C++ kennen würdest, wäre Dir dieses Konzept einfacher verständlich.
    Es gibt Wertetypen (Integer) und es gibt Referenztypen (Form1).
    Mit einem Nullable (Of T) kannst Du aus einem Wertetyp so etwas ähnliches machen wie einen Referenztyp.
    Aus der DLL bekommst Du dann zwei Informationen:
    Es war (nicht) möglich, einen Wert zuzuweisen
    Im Falle, dass ein Wert zugewiesen wurde, ist er direkt ohne weitere Variable abrufbar
    Probieren wir es so:

    VB.NET-Quellcode

    1. Dim dlg As Form1 = Nothing
    2. Dim var1 As Integer = Nothing
    3. Dim var2 As Integer? = Nothing
    4. If dlg Is Nothing Then MessageBox.Show("dlg Is Nothing")
    5. 'If var1 Is Nothing Then MessageBox.Show("var1 Is Nothing")
    6. If var2 Is Nothing Then MessageBox.Show("var2 Is Nothing")
    7. dlg = New Form1()
    8. var1 = 1
    9. var2 = 1
    10. If dlg IsNot Nothing Then MessageBox.Show("dlg Is not Nothing")
    11. 'If var1 IsNot Nothing Then MessageBox.Show("var1 Is not Nothing")
    12. If var2 IsNot Nothing Then MessageBox.Show("var2 Is not Nothing")
    Die auskommentierten Zeilen compilieren nicht
    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!
    OK jetzt bin ich etwas verwundert... ?(

    Vorhin gings noch wie in Post4, jetzt kommt eine Fehlermeldung, obwohl ich nichts wissentlich verändert hab.

    HundredMilesSoftware.UltraID3Lib.MultiExceptionException: There are 1 exceptions.

    Leider spuckt er mir keinen Grund für die Exception aus... Hat jemand eine Idee?

    kafffee schrieb:

    Leider spuckt er mir keinen Grund für die Exception aus...
    Poste mal alle verfügbaren Informationen.
    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!
    HIer die komplette Methode:

    VB.NET-Quellcode

    1. Private Sub btnMetadatenSpeichern_Click(sender As Object, e As EventArgs) Handles btnMetadatenSpeichern.Click
    2. For i = 0 To DataGridView1.Rows.Count - 2
    3. m_UltraID3.Read(DataGridView1.Rows(i).Cells(0).Value.ToString)
    4. m_UltraID3.SetTrackNum(CType(DataGridView1.Rows(i).Cells(1).Value, String))
    5. m_UltraID3.Artist = DataGridView1.Rows(i).Cells(2).Value.ToString
    6. m_UltraID3.Album = DataGridView1.Rows(i).Cells(3).Value.ToString
    7. m_UltraID3.Title = DataGridView1.Rows(i).Cells(4).Value.ToString
    8. m_UltraID3.Write()
    9. Next
    10. End Sub


    Die Werte scheinen in Ordnung zu sein, hab ich mit einem Haltepunkt geprüft. Auch wenn ich die entsprechende Zeile auskommentiere werden die anderen Werte zuverlässig gesetzt...

    Das einzige was mir einfällt ist dass sich durch das rumprobieren etwas mit den Metadaten der MP3-Datei geändert hat...

    kafffee schrieb:

    HIer die komplette Methode:
    Da steht nix von einer Exception.
    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!
    @RodFromGermany Wie meinst du das? Die Exception entsteht wenn ich es ausführe in Zeile 4.

    Habs auch mal probiert mit einer Zahl in Anführungszeichen statt der DataGridZelle... Genau der gleiche Fehler.

    Hab auch mal die Metadaten der Mp3 resettet. Bringt aber auch nichts...


    Soll ich die DLL mal zippen und hochladen?
    @kafffee Welche Exception? Welche Meldung?
    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!
    @kafffee Welcher Datentyp wird erwartet?
    @ErfinderDesRades Ich denke mal, dass da so was hin müsste:

    VB.NET-Quellcode

    1. m_UltraID3.SetTrackNum(CType(DataGridView1.Rows(i).Cells(1).Value, Nullable(Of DEIN_TYP)).ToString())
    DEIN_TYP wäre Short oder so was.
    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!

    ErfinderDesRades schrieb:

    ah - hast du die InnerException gecheckt?
    Da ist nix mit InnerException:

    Wenn man nur SetTrackNum verwendet, crasht erst - zu Beginn!
    Wenn man aber das hier nutzt:

    VB.NET-Quellcode

    1. m_UltraID3.ID3v1Tag.SetTrackNum("3")
    2. m_UltraID3.ID3v1Tag.Write()
    geht wahrscheinlich durch die Manipulation der Metadaten (?) auch plötzlich SetTrackNum("1") - nachdem das Programm beendet wurde, nicht im selben Atemzug! Die Verwendung von SetTrackNum ist dann zwar anscheinend ohne Wirkung, aber auch ohne Exception. Wahrscheinlich, weil dann die ID3v1Tags hergenommen werden und die normalen (?) ignoriert werden. Die ID3v1Tags scheinen zumindest das zu sein, was im Windows Explorer angezeigt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany
    .SetTrackNum erwartet einen ganz normalen String, es hat ja auch schon funktioniert so, ich denke das liegt echt an der Mp3... Aber ich probier das mal...

    Edit: Habs mit Short probiert, da kommt, dass sie Umwandlung ungültig ist.

    @VaporiZed
    Du meinst also damit das. SetTrackNum funktioniert müssen die Metadaten zuerst als Id3v1 Tag vorhanden sein, verstehe ich dich @RodFromGermany

    Edit: Ich hab mal ein bisschen rumprobiert und habs zum Laufen gebracht. Es lag tatsächlich daran, dass die MP3-Datei noch kein ID3v1 Tag besessen hat. Also hab ich das jetzt wie folgt gelöst:

    VB.NET-Quellcode

    1. For i = 0 To DataGridView1.Rows.Count - 2
    2. m_UltraID3.Read(DataGridView1.Rows(i).Cells(0).Value.ToString)
    3. m_UltraID3.ID3v1Tag.SetTrackNum(CType(DataGridView1.Rows(i).Cells(1).Value, String))
    4. m_UltraID3.ID3v23Tag.SetTrackNum((CType(DataGridView1.Rows(i).Cells(1).Value, String)))
    5. m_UltraID3.Artist = DataGridView1.Rows(i).Cells(2).Value.ToString
    6. m_UltraID3.Album = DataGridView1.Rows(i).Cells(3).Value.ToString
    7. m_UltraID3.Title = DataGridView1.Rows(i).Cells(4).Value.ToString
    8. m_UltraID3.Write()
    9. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „kafffee“ ()