Liste nach Strings durchsuchen und gefundene Indexes in weiterer Liste speichern

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    jo, im wesentlichen hast du alles korrekt verstanden am code. Einzig das Konzept "Parametrierten Konstruktor (Sub New(a,b,c)) scheint dir neu - aber die Funktion davon hast du bereits begriffen. Und .ToString() Tja, da heissts eben (Online-)Buch lesen - das betrifft das Konzept Vererbung.
    1. 'Kann man das und Zeile 4 nicht auch zusammenfassen?
      Ja
    2. 'ich hab so um die 3k Datensätze, die in der Anzahl variieren Da kann ich nicht für jeden Datensatz eine Variable anlegen. Soltte ich da nicht gleich eine Liste nehmen?
      Ja, das ist nur ein Beispiel-Datensatz.
    3. 'Warum der Umweg über eine Methode,
      'hat das was mit Zeile 8 zu tun? Wird die da aufgerufen?
      Ja
      'Ich hatte gedacht Methoden ruft man auf über MeineKlasse.MeineMethode()?? Geht das nicht mit Get und Set wie in meinem Post #8?
      Ja (obwohl ich post#8 jetzt nicht nachgelesen hab)
      Wie du siehst ist der Konstruktor auch nix anneres als eine Methode. Sowas ist nicht zwingend nötig, aber praktisch.
    4. 'das hier ist glaube ich nur eine Hilfsfunktion? Aber die wird doch von nirgends aufgerufen??
      Richtig. Recherchiere das Schlüsselwort Overrides - da bekommst du einen kleinen Einblick in die Vererbungslehre objektorientierter Programmierung
      Wirklich nötig ist das hier auch nicht, ist aber praktisch, zB im Debugger siehst du so am Haltepunkt sofort diese Informationen.
      Haltepunkt, Lokalfenster ist dir bekannt? Ansonsten: Visual Studio - Empfohlene Einstellungen


    Mein Punkt ist allerdings: Du bist doch schon viel weiter.
    Du hast doch bereits eine Liste aller Mp3Objekte (UltraID3) - das hast du dir doch mit dieser Dll bereits zusammengestrickt - oder habich das falsch in Erinnerung?
    Diese Liste, die du bereits hast - für die brauchst du doch nur eine Suchfunktion zu schreiben.
    Imo musst du keine weitere Klasse erfinden und komische Dinge mit tun.
    Tatsächlich solltest du das tunlichst unterlassen - es gibt in der Programmierung ein ganz wichtiges Grundprinzip: "Wenn etwas nicht nötig ist zu tun, dann ist es nötig, es nicht zu tun." (kannste auch googeln, ist von Alfons dem Weisen)

    Ok - vlt. hast du die List(Of UltraID3) noch nicht - dann bastel sie dir, und arbeite damit.
    Da kannst du auch eine wunnebare Suchfunktion für schreiben.

    kafffee schrieb:

    Nun soll, wenn ich etwas in eine Textbox eingebe, die listAlleInterpreten durchsucht werden nach TextBox1.Text Und zwar dass wenn ich also "Michael Jackson" eingebe, in einer Listbox alle seine Alben und in einer weiteren Listbox alle seine Titel angezeigt werden.
    Ist das nachwievor die Aufgabenstellung?
    Wie gesagt: Aus einer List(Of UltraID3) kann eine Suchfunktion diese Informationen extrahieren.
    Eventuell brauchst du für "Album" eine neue Klasse - falls ein Album mehr sein soll als nur ein String mit dem Namen des Albums.
    Eine Klasse Mp3Datei brauchst du nicht - da hast du bereits eine, die kaum zu toppen ist. (Es sei denn, du überführst die Geschichte in ein relationales Datenmodell, aber soweit scheinst du noch nicht zu sein).



    Nochmal zur Aufgabenstellung:

    kafffee schrieb:

    Nun soll, wenn ich etwas in eine Textbox eingebe, die listAlleInterpreten durchsucht werden nach TextBox1.Text Und zwar dass wenn ich also "Michael Jackson" eingebe, in einer Listbox alle seine Alben und in einer weiteren Listbox alle seine Titel angezeigt werden.
    Eine listAlleInterpreten hast du doch garnet - wie willst du etwas durchsuchen, was du nicht hast??
    Ausser es ist eine dumme List(Of String).
    Eine listAlleInterpreten As List(Of String) wird dir aber nix nützen, weil da findest du vlt. Michael Jackson drinne, aber seine Alben stehen da ja nicht drin.
    Du willst da iwas mit Indizees rumfuchteln - so macht man das aber nicht.
    Also entweder du durchsuchst deine List(Of UltraID3) - da sind ja die Informationen drinne - oder du musst dir einen geeigneten Satz an Klassen aufbauen, zB für Interpreten und Alben.
    Erst wenn du diese Klassen hast, kannst du eine sinnvolle listAlleInterpreten As List(Of Interpret) haben die du durchsuchen kannst, und bei der ein Treffer dir alle seine Alben ausgeben kann.
    Wobei auch die Alben nicht eine dumme List(Of String) sein dürfen - du willst ja vom Album vermutlich alle Titel abrufen können oder sowas.
    Also brauchst du auch eine Klasse Album, und sogar auch eine Klasse Titel.
    Obwohl - für Titel könntest du wieder deine UltraID3 nehmen - ein UltraID3 repräsentiert ja genau einen Titel.

    Diese Überlegungen - welche Klassen du brauchst, um eine sinnvolle listAlleInterpreten, listAlleAlben, listAlleAlben_Eines_Interpreten überhaupt bilden zu können - sowas nennt man Datenmodellierung.
    (eine sinnvolle listAlleTitel, listAlleTitelEinesAlbums, listAlleTitelEinesInterpreten - das kann bereits gebildet werden, dank der UltraID3)

    Aber wenn du Datenmodellierung erstmal nicht willst: Bleib bei genau deiner einen List(Of UltraID3), und durchsuche sie. Da sind alle Informationen drin, und können extrahiert werden.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich hab das jetzt mal so gelöst. Ist zwar ein bisschen tipp-ntensiver aber für mich lesbarer:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public MeinMP3 As List(Of ClassMP3Datei)
    3. Public listAlleInterpreten As New List(Of String)
    4. Public listAlleAlben As New List(Of String)
    5. Public listAlleMusiktitel As New List(Of String)
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. Dim mp3 = New ClassMP3Datei
    10. 'mp3.Interpret = "Michael Jackson" 'warum das nicht funktioniert versteh ich auch nicht, aber das nur nebenbei...
    11. 'mp3.Album = "HIStory"
    12. 'mp3.Musiktitel = "Thriller"
    13. MeinMP3.Add(mp3)
    14. ListBox1.Items.Add(mp3.Interpret)
    15. ListBox2.Add(mp3.Album)
    16. Listbox3.Add(mp3.Musiktitel)
    17. End Sub
    18. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    19. listAlleInterpreten.Add("Michael JAckson")
    20. listAlleAlben.Add("HIStory")
    21. listAlleMusiktitel.Add("Thriller")
    22. listAlleInterpreten.Add("Ja Rule")
    23. listAlleAlben.Add("Venni Vetti Vecci")
    24. listAlleMusiktitel.Add("Race Against Time")
    25. MeinMP3 = New List(Of ClassMP3Datei)
    26. End Sub
    27. End Class
    28. Public Class ClassMP3Datei
    29. Public Sub New()
    30. End Sub
    31. Public Property Interpret As String
    32. Get
    33. Return Form1.listAlleInterpreten(0)
    34. End Get
    35. Set(value As String)
    36. End Set
    37. End Property
    38. Public Property Album As String
    39. Get
    40. Return Form1.listAlleAlben(0)
    41. End Get
    42. Set(value As String)
    43. End Set
    44. End Property
    45. Public Property Musiktitel As String
    46. Get
    47. Return Form1.listAlleAlben(0)
    48. End Get
    49. Set(value As String)
    50. End Set
    51. End Property
    52. End Class


    @ErfinderDesRades
    Ja genau, also zum Verständnis. Ich habe eine Funktion geschrieben, die MP3 Dateien findet, diese nach den Metadaten durchsucht (mit Hilfe von UltraID3Lib), dann zeilenweise Interpret, Album und Musiktitel in jeweils eine Textdatei schreibt.
    Dann eine weitere Funktion, die diese Dateien dann in Listen einliest (listAlleinterpreten, [line]listAlle Alben[/line], und listAlleMsuiktitel).

    Nur das ursprüngliche Problem war, dass, wenn ich eine Liste durchsuchen möchte, immer nur der erste Eintrag gefunden wurde. Ich hätte aber gerne, dass wenn ich z.B. die listIUnterpreten nach "Michael Jackson" durchsuche, dass er mir alle Alben und Musiktitel von ihm liefert. Anscheinend ist das mit einer Liste nicht möglich, Also hat mir @RodFromGermany geraten eine Klasse zu erstellen (Post #5). Gut jetzt hätte ich teilweise gelernt, wie man Klassen benutzt. Wie das aber mein Vorhaben vorantreiben soll, ist mir noch unklar.
    @kafffee Was soll das?
    Beratungsresistenz?
    Warum ist die Information doppelt in Deinem Programm vorhanden?
    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

    Ne ich komme bloss an dieser Stelle nicht weiter. Ich versteh das Grosse und Ganze nicht

    (1) Wie lege ich mehrere Datensätze an?
    (2) Wie suche ich in denen, denn mp3 scheint ja wieder nur eine Liste zu sein

    RodFromGermany schrieb:

    Warum ist die Information doppelt in Deinem Programm vorhanden?


    Du meinst in den Listen und den Properties der Klasse? Das war so in meinem Programm, aber in Zukunft kann ich ja auch die Textdateien mit den Infos direkt in die Klasse einlesen..

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

    kafffee schrieb:

    dann zeilenweise Interpret, Album und Musiktitel in jeweils eine Textdatei schreibt.
    Das habich nicht mitbekommen, dass du bereits Daten auf Platte schreibst.

    Ich empfehle dir dringend nochmal, die für Datenverarbeitung vorgesehenen Technologien zu verwenden - Strukturiertes lesen und Schreiben in eine Datei ist darin enthalten, und braucht nicht neu erfunden zu werden.



    kafffee schrieb:

    VB.NET-Quellcode

    1. 'mp3.Interpret = "Michael Jackson" 'warum das nicht funktioniert versteh ich auch nicht, aber das nur nebenbei...
    Hihi - guck die Property an, der du da was zuweist: Deren Setter tut ja absolut garnichts - was also soll "funktionieren"?

    kafffee schrieb:

    Ich versteh das Grosse und Ganze nicht
    Ich habe Dir ein in sich geschlossenes Programm gepostet und danach Deine Fragen dazu beantwortet.
    Wenn Du danach aus zwei Programmen (Deins und meins) zusammenwürfelst, gehe ich davon aus, dass Du das Ganze verstanden hast.
    Ansonsten pflichte ich dem @ErfinderDesRades bei: Dein Daten-Management ist mir unbekannt.
    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!
    So nach einer Stunde überlegen hatte ich einen Geistesblitz. Ich hab jetzt folgenden Code. Leider wenn ich in die Textbox z.B. "Ja Rule" eintippe und den Button klicke, passiert rein gar nichts. Hat jemand ne Idee?

    VB.NET-Quellcode

    1. Public Class ClassMP3Datei
    2. Public Property Interpret As String
    3. Public Property Album As String
    4. Public Property Musiktitel As String
    5. Public Sub New(varInterpret As String, varAlbum As String, varMusiktitel As String)
    6. Interpret = varInterpret
    7. Album = varAlbum
    8. Musiktitel = varMusiktitel
    9. End Sub
    10. End Class
    11. Public Class Form1
    12. Public MeinMP3 As List(Of ClassMP3Datei)
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. Dim mp3 As New ClassMP3Datei("Ja Rule", "Venni Vetti Vecci", "Race Against Time")
    15. For Each mp3 In MeinMP3
    16. If mp3.Interpret = TextBox1.Text Then
    17. ListBox1.Items.Add(mp3.Interpret)
    18. ListBox2.Items.Add(mp3.Album)
    19. ListBox3.Items.Add(mp3.Musiktitel)
    20. End If
    21. Next
    22. For i = 0 To MeinMP3.Count - 1
    23. If mp3.Album = TextBox1.Text Then
    24. ListBox1.Items.Add(mp3.Interpret)
    25. ListBox2.Items.Add(mp3.Album)
    26. ListBox3.Items.Add(mp3.Musiktitel)
    27. End If
    28. Next
    29. For i = 0 To MeinMP3.Count - 1
    30. If mp3.Musiktitel = TextBox1.Text Then
    31. ListBox1.Items.Add(mp3.Interpret)
    32. ListBox2.Items.Add(mp3.Album)
    33. ListBox3.Items.Add(mp3.Musiktitel)
    34. End If
    35. Next
    36. End Sub
    37. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    38. MeinMP3 = New List(Of ClassMP3Datei)
    39. End Sub
    40. End Class


    EDIT: Ich hab mal einen Haltepunkt auf Zeile 18 gesetzt, wenn ich dann mir der Maus über mp3 gehe, wird mir der Wert Nothing angezeigt.

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

    @kafffee MeinMP3 enthält keine Elemente. Hatten wir bereits.
    Du verwendest die Variable mp3 doppelt.
    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

    Danke für den grandiosen Tipp mit der Klasse. Wenn mans einmal durchschaut hat ist es echt Pipifax...
    Hab alles zum Laufen gebracht. Nur einen winzig kleinen Schönheitsfehler hat es noch:
    Wenn ein Interpret z.B. zwei Alben hat, dann wird er in Listbox1 auch doppelt eingefügt. Das will ich natürlich nicht. Was empfehlt ihr mir? Den Umweg über eine Liste, und die dann mit MeineListe = MeineListe.Distinct().ToList() ausmisten?
    Ich unterstelle mal, dass es keine zwei Künstler mit demselben Namen gibt, wohl aber Alben und Musiktitel...
    Hier mein finaler Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public listAlleInterpreten As New List(Of String)
    3. Public listAlleAlben As New List(Of String)
    4. Public listAlleMusiktitel As New List(Of String)
    5. Public Content As List(Of ClassMP3Datei)
    6. Public HilfslisteDateinamen As List(Of String)
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. ListBox1.Items.Clear()
    9. ListBox2.Items.Clear()
    10. ListBox3.Items.Clear()
    11. Content.Clear()
    12. Dim mp3
    13. mp3 = New ClassMP3Datei("Race Against Time.mp3", "Ja Rule", "Venni Vetti Vecci", "Race Against Time")
    14. Content.Add(mp3)
    15. mp3 = New ClassMP3Datei("Stan.mp3", "Eminem", "Marshall Mathers LP", "Stan")
    16. Content.Add(mp3)
    17. For Each mp3 In Content
    18. If mp3.Interpret = TextBox1.Text Then
    19. ListBox1.Items.Add(mp3.Interpret)
    20. ListBox2.Items.Add(mp3.Album)
    21. ListBox3.Items.Add(mp3.Musiktitel)
    22. End If
    23. Next
    24. For Each mp3 In Content
    25. If mp3.Album = TextBox1.Text Then
    26. ListBox2.Items.Add(mp3.Album)
    27. ListBox3.Items.Add(mp3.Musiktitel)
    28. End If
    29. Next
    30. For Each mp3 In Content
    31. If mp3.Musiktitel = TextBox1.Text Then
    32. ListBox3.Items.Add(mp3.Musiktitel)
    33. HilfslisteDateinamen.Add(mp3.Dateiname)
    34. End If
    35. Next
    36. End Sub
    37. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    38. Content = New List(Of ClassMP3Datei)
    39. End Sub
    40. End Class
    41. Public Class ClassMP3Datei
    42. Public Property Dateiname As String
    43. Public Property Interpret As String
    44. Public Property Album As String
    45. Public Property Musiktitel As String
    46. Public Sub New(varDateiname As String, varInterpret As String, varAlbum As String, varMusiktitel As String)
    47. Dateiname = varDateiname
    48. Interpret = varInterpret
    49. Album = varAlbum
    50. Musiktitel = varMusiktitel
    51. End Sub
    52. End Class

    kafffee schrieb:

    Hier mein finaler Code
    Sowas soll man nicht sagen - das bringt Unglück.

    Ansonsten ist jetzt Architektur angesagt - dassis absolut NoGo, dass in einer Button_Click-Methode zunächst eine Liste befüllt wird, dann dieselbe Liste durchsucht wird, und dann auch nock Krimskrams in Listboxen geadded werden.
    Das muss umgebaut werden:
    Die Liste befüllen ist ein eigener Vorgang - iwann willst du sie ja aus einer Datei befüllen, und hofflich nicht im ButtonClick.
    => Schreib eine FillContent-Methode

    Liste durchsuchen ist auch ein eigener Vorgang, auch hier ist eine Methode zu schreiben, der du die zu durchsuchende Liste übergibst, und die eine ErgebnisListe zurückgibt.
    Hmm - das schrieb ich schon - hast du ignoriert.

    Krimskrams in Listboxen füllen geht so:

    VB.NET-Quellcode

    1. Listbox1.DataSource = ErgebnisseDerInterpretSuche
    Aber vlt. sollte ich nicht immer dazwischenquatschen. Sieh mal zu wie du mit RFGs Beratung durchkommst.
    So die Denkblockade über die Feiertage ist wieder gelöst und ich bin gerade dabei den Code so umzuschreiben, dass er für mein Programm passt.
    @ErfinderDesRades:
    Ist alles in Arbeit.

    Nun bin ich beim Umschreiben der Suchfunktion auf einen Fehler gestossen: "Option Strict On lässt spätes Binden nicht zu."

    Ich habe mich dafür entschieden, dass man nicht nur nach Interpreten, Alben und Musiktiteln suchen kann, sondern auch nach Radiostreams und hab dafür noch mal eine eigene Klasse gebastelt, und habe eigentlich alles genauso gemacht wie bei der anderen Klasse auch. Nur kommt halt jetzt dieser Fehler in Zeile 38 und 39 und ich weiss nicht warum. Hier mal mein Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Public listAlleDateinamen As New List(Of String)
    4. Public listAlleInterpreten As New List(Of String)
    5. Public listAlleAlben As New List(Of String)
    6. Public listAlleMusiktitel As New List(Of String)
    7. Public listAlleSendernamen As New List(Of String)
    8. Public listAlleURLs As New List(Of String)
    9. Public Content As List(Of ClassMP3Datei)
    10. Public URLs As List(Of ClassSender)
    11. Public HilfslisteDateinamen As List(Of String)
    12. Public mp3 As ClassMP3Datei
    13. Public sender As ClassSender
    14. Public Anwendungspfad As String = New IO.FileInfo(Application.ExecutablePath).DirectoryName
    15. Private Sub MusikDurchsuchen()
    16. lstInterpreten.Items.Clear()
    17. lstAlben.Items.Clear()
    18. lstMusiktitel.Items.Clear()
    19. Content.Clear()
    20. URLs.Clear()
    21. For Each mp3 In Content
    22. If mp3.Interpret = TextBox1.Text Then
    23. lstInterpreten.Items.Add(mp3.Interpret)
    24. lstAlben.Items.Add(mp3.Album)
    25. lstMusiktitel.Items.Add(mp3.Musiktitel)
    26. End If
    27. Next
    28. [...] 'usw.
    29. For Each sender In URLs
    30. If sender.Sendername = TextBox1.Text Then
    31. lstSender.Items.Add(sender.Sendername)
    32. End If
    33. Next
    34. End Sub
    35. End Class
    36. Public Class ClassMP3Datei
    37. Public Property Dateiname As String
    38. Public Property Interpret As String
    39. Public Property Album As String
    40. Public Property Musiktitel As String
    41. Public Sub New(varDateiname As String, varInterpret As String, varAlbum As String, varMusiktitel As String)
    42. Dateiname = varDateiname
    43. Interpret = varInterpret
    44. Album = varAlbum
    45. Musiktitel = varMusiktitel
    46. End Sub
    47. End Class
    48. Public Class ClassSender
    49. Public Property Sendername As String
    50. Public Property URL As String
    51. Public Sub New(varSendername As String, varURL As String)
    52. Sendername = varSendername
    53. URL = varURL
    54. End Sub
    55. End Class


    Kann mir jemand erklären was dieser Fehler heisst und wie man ihn beheben kann? Eigentlich hab ich doch genau das Gleiche gemacht wie bei meiner ClassMP3Datei oder hab ich was übersehen?

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

    kafffee schrieb:

    "Option Strict On lässt spätes Binden nicht zu."
    Das bedeutet immer, dass zwei Datentypen nicht zueinander passen.
    zeile# 38: If sender.Sendername = TextBox1.Text Then
    TextBox1.Text ist ein String - was ist sender.Sendername?
    siehe auch: Video-Tut: Welchen Datentyp hat das Objekt?
    Na natürlich auch ein String. Hab ich doch in Zeile 64 so festgelegt oder?

    Wenn ich im Editor mit dem Mauszeiger drübergeh wird nur "(Parameter) sender As Object" angezeigt. und sender.Sendername wird rot unterstrichen, in den Zeilen 38 und 39....
    In den Zeilen 28 und 29 wird korrekt angezeigt: "Property ClasssMP3Datei.Interpret As String" wenn ich mit der Maus drübergeh

    Spinn ich denn? Ist auch kein Tippfehler drin meines Erachtens...
    Zeile#35 ist interessant. So wie es klingt, fängt da ggf. ne EventHandler-Sub mit erstem Parameter sender As Object an.
    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.
    Ihr seid echt spitze. Da wär ich in tausend Jahren net drauf gekommen... Hatte den Code tatsächlich in meinem Testprogramm noch in einer Button_Click drin...

    Aber gleich das nächste Problem. Hier die Methode um meine Musikdatenbank (Textdateien) in die Klassen "einzulesen", wenn man das so nennen kann:

    VB.NET-Quellcode

    1. Private Sub MusikdatenbankInKlassenLaden()
    2. If System.IO.File.Exists(Anwendungspfad & "\Dateinamen.txt") Then
    3. Content = New List(Of ClassMP3Datei)
    4. URLs = New List(Of ClassSender)
    5. Using sr As New IO.StreamReader(Anwendungspfad & "\Dateinamen.txt")
    6. Do
    7. listAlleDateinamen.Add(sr.ReadLine())
    8. Loop Until sr.Peek < 0
    9. End Using
    10. Using sr As New IO.StreamReader(Anwendungspfad & "\Interpreten.txt")
    11. Do
    12. listAlleInterpreten.Add(sr.ReadLine())
    13. Loop Until sr.Peek < 0
    14. End Using
    15. Using sr As New IO.StreamReader(Anwendungspfad & "\Alben.txt")
    16. Do
    17. listAlleAlben.Add(sr.ReadLine())
    18. Loop Until sr.Peek < 0
    19. End Using
    20. Using sr As New IO.StreamReader(Anwendungspfad & "\Musiktitel.txt")
    21. Do
    22. listAlleMusiktitel.Add(sr.ReadLine())
    23. Loop Until sr.Peek < 0
    24. End Using
    25. For Each sr In listAlleDateinamen
    26. mp3 = New ClassMP3Datei(listAlleDateinamen(CInt(sr)), listAlleInterpreten(CInt(sr)), listAlleAlben(CInt(sr)), listAlleMusiktitel(CInt(sr)))
    27. Content.Add(CType(mp3, ClassMP3Datei))
    28. Next
    29. Using sr As New IO.StreamReader(Anwendungspfad & "\Sendernamen.txt")
    30. Do
    31. listAlleSendernamen.Add(sr.ReadLine())
    32. Loop Until sr.Peek < 0
    33. End Using
    34. Using sr As New IO.StreamReader(Anwendungspfad & "\URLs.txt")
    35. Do
    36. listAlleURLs.Add(sr.ReadLine())
    37. Loop Until sr.Peek < 0
    38. End Using
    39. For Each sr In listAlleSendernamen
    40. varSender = New ClassSender(listAlleSendernamen(CInt(sr)), listAlleURLs(CInt(sr)))
    41. URLs.Add(CType(varSender, ClassSender))
    42. Next
    43. 'Hier noch die Daten in die Listboxen laden
    44. listAlleDateinamen = listAlleDateinamen.Distinct().ToList()
    45. listAlleInterpreten = listAlleInterpreten.Distinct().ToList()
    46. listAlleAlben = listAlleAlben.Distinct().ToList()
    47. listAlleMusiktitel = listAlleMusiktitel.Distinct().ToList()
    48. listAlleDateinamen = listAlleDateinamen.Distinct().ToList()
    49. listAlleSendernamen = listAlleSendernamen.Distinct().ToList()
    50. listAlleURLs = listAlleURLs.Distinct().ToList()
    51. lstInterpreten.DataSource = listAlleInterpreten
    52. lstAlben.DataSource = listAlleAlben
    53. lstMusiktitel.DataSource = listAlleMusiktitel
    54. lstSender.DataSource = listAlleSendernamen
    55. Else
    56. MessageBox.Show("Du musst zuerst eine Musikdatenbank anlegen. Bitte wähle dazu im folgenden Dialog den Ordner mit deinen MP3-Dateien aus!")
    57. 'MusikbibliothekAktualisieren()
    58. End If
    59. End Sub


    In Zeile 35 kommt es zum Fehler "System.InvalidCastException: Ungültige Konvertierung von der Zeichenfolge C:\Users\Alpha\Desktop\Cypress H in Typ Integer." und die Variable listAlleInterpreten ist dunkelblau hinterlegt.

    Obwohl ich das gemacht hab, was der Debugger mir vorgeschlagen hat...

    kafffee schrieb:

    Zeile 35
    ist eine Leerzeile.
    Wenn Du im Break-Zustand die Variable / den Parameter HOverst, bekommst Du eigentlich die erforderliche Information angezeigt.
    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!

    VB.NET-Quellcode

    1. For Each sr In listAlleDateinamen
    2. mp3 = New ClassMP3Datei(listAlleDateinamen(CInt(sr))
    Was erwartest Du? Wenn listAlleDateinamen eine List(Of String) ist, ist sr (warum der Name sr?) ein String. Und dann wandelst Du einen Dateinamen mittels CInt in einen Integer um. Was die die passende Zahl für C:\Foo\Bar.mp3 :?:
    Dein Konstruktor von ClassMp3Datei (Warum hat es das Präfix Class?) verlangt aber einen Dateinamen (String) als ersten Parameter, keinen Integer.
    Sollte wohl eher so aussehen:

    VB.NET-Quellcode

    1. mp3 = New ClassMP3Datei(sr, …


    Dieses ganze StreamReader-Zeugsl sollte eigentlich überflüssig sein. Probier mal z.B. statt

    VB.NET-Quellcode

    1. Using sr As New IO.StreamReader(Anwendungspfad & "\Dateinamen.txt")
    2. Do
    3. listAlleDateinamen.Add(sr.ReadLine())
    4. Loop Until sr.Peek < 0
    5. End Using

    einfach

    VB.NET-Quellcode

    1. listAlleDateinamen.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Dateinamen.txt"))


    ##########

    Ach, nee, jetze. Du versuchst den passenden Listenindex in den verschiedenen Listen zu finden. Dann recherchier mal bitte, mit welcher Funktion Du aus einer Liste den Index eines vorhandenen/zu suchenden Eintrags finden kannst.
    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
    Sorry das war ein Tippfehler... Zeile 32 mein ich...

    @VaporiZed
    Mit den Typumwandlungen hast du natürlich Recht.
    Ich bin davon ausgegangen, dass sr so eine Art Zähler darstellt (als Integer). Jede meiner Musikdateien hat genau eine Zeile in jeder der Textdateien. Somit wollte ich sie über diesen Zähler einheitlich abrufen.

    VaporiZed schrieb:
    Ach, nee, jetze. Du versuchst den passenden Listenindex in den verschiedenen Listen zu finden. Dann recherchier mal bitte, mit welcher Funktion Du aus einer Liste den Index eines vorhandenen/zu suchenden Eintrags finden kannst.

    Du meinst wie hier?:
    List (Of String).FindIndex einfache Textsuche - sowie Teilsuche

    Genau sowas in der Art hab ich am Anfang des Themas schon gesucht, wusste nur nicht, wonach ich da suchen soll. Wie auch immer ich hab das Problem mit Hilfe von RodFromGermany anders gelöst bekommen. Also die Sache mit den Klassen.

    Im letzten Post geht es mir jetzt darum, alle Textzeilen der Dateien durchzugehen und die in die Klassen als Properties zu laden... (also für jedes Lied eine neue Instanz der Klasse ClassMP3Datei anzulegen (wenn ich mich da richtig ausdrücke...))

    EDIT:
    So sollte es gehen, ich probier das gleich mal aus:

    VB.NET-Quellcode

    1. For i = 0 To listAlleDateinamen.Count - 1
    2. mp3 = New ClassMP3Datei(listAlleDateinamen(i), listAlleInterpreten(i), listAlleAlben(i), listAlleMusiktitel(i))
    3. Content.Add(mp3)
    4. Next

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