VisualBasic Anhand von Dateien dynamisch Content erzeugen

KingLM97

Lieutenant
Registriert
Mai 2012
Beiträge
908
Hallo,

aktuell arbeite ich an einem kleinen Planer. Bei dem ist es aktuell möglich, anhand vorhandener Dateien ein Item in einer Combobox hinzuzufügen.

Diese Dateien sind ".ini"-Dateien mit folgender, beispielhafter Struktur.
Der Name der Datei ist gleich des Wertes "Name" in der Datei. In diesem Falle hieße die Datei also "Test.ini".
Code:
[Speiseplan]
Name=Test
istBild=True
istURL=False
Pfad=C:\Users\Lukas\Desktop\Test\Test.jpg

In dieser Sub gehe ich jede Datei durch, öffne sie, und schreibe den Wert von "Name" in eine Liste. Mit dieser Liste wird dann die Combobox gefüllt.
Code:
Private Sub ladeSpeisepläne(ByVal pfad As String)
        ComboEigenerPlan.Items.Clear()
        Dim ini As New INI
        Dim lst As List(Of String) = Directory.GetFiles(pfad, "*.ini").ToList
        For i As Integer = 0 To lst.Count - 1
            ini.Pfad = lst.Item(i)
            ComboEigenerPlan.Items.Add(ini.WertLesen("Speiseplan", "Name"))
        Next
    End Sub

Sobald ich auf ein Item in der Combobox geklickt habe, wird folgende Sub aufgerufen (der Text des angeklickten Items wird übergeben als "Name"). Dabei gehe ich jede Datei durch, öffne diese und lese den Wert "Name" aus. Ist dieser gleich mit dem String "Name", wird geprüft, ob es ein eine Website oder ein lokales Bild ist. Je nachdem, wird ein Webbrowser oder eine PictureBox erstellt, wobei der Pfad zur Website/Bild aus der .ini-Datei gelesen wird. Dann wird der Webbrowser/PictureBox dem Panel hinzugefügt.
Code:
Private Sub ladeDaten(ByVal Name As String)
        Try
            Dim ini As New INI
            Dim di As New DirectoryInfo("C:\AFS-Software\Essensplaner\Speisepläne")
            For Each file In di.GetFiles("*.ini")
                ini.Pfad = file.FullName
                If ini.WertLesen("Speiseplan", "Name") = Name Then
                    If ini.WertLesen("Speiseplan", "istUrl") = "True" Then
                        Dim browser As New WebBrowser
                        browser.Dock = DockStyle.Fill
                        browser.Url = New Uri(ini.WertLesen("Speiseplan", "Pfad"))
                        PanelControls.Controls.Clear()
                        PanelControls.Controls.Add(browser)
                    ElseIf ini.WertLesen("Speiseplan", "istBild") = "True" Then
                        Dim bild As New PictureBox
                        bild.Dock = DockStyle.Fill
                        bild.ImageLocation = ini.WertLesen("Speiseplan", "Pfad")
                        bild.SizeMode = PictureBoxSizeMode.Zoom
                        PanelControls.Controls.Clear()
                        PanelControls.Controls.Add(bild)
                    End If
                    Exit For
                End If
            Next
        Catch ex As Exception
            MessageBoxAdv.Show(ex.Message)
        End Try
    End Sub

Es funktioniert ganz gut, es stürzt nicht ab ober hängt sich irgendwie auf. Allerdings finde ich meinen Weg ein wenig Umständlich, kompliziert. Und das ist noch das "einfache", was später dynamisch anpassbar sein soll wird ein wenig aufwendiger.
Aus genau diesem Grund frage ich mich, ob das nicht irgendwie viel einfacher funktioniert?

P.S.:
Ich bin noch kein Profi was VB.net angeht, ich habe fast 4 Stunden für die paar Zeilen benötigt. Deswegen könnte das später noch länger dauern ^^
 
Ich sehe an dem Code etwas falsches (naja, es werden jetzt nicht eventuelle Konfigurationsfehler entdeckt und entsprechend behandelt), aber der Code ist recht kurz und übersichtlich. Hast du denn spezifische Bedenken oder Fragen?
 
Zuletzt bearbeitet:
Prinzipiell ist das so ok. Ich würde für jede Datei beim ersten Einlesen ein eigenes Objekt erzeugen und das direkt in die Combobox füllen. Dann sparst du dir später das raussuchen und erneute einlesen. Dazu die ToString-Methode der INI-Klasse überschreiben, die gibt den Text zurück der in der Combobox angezeigt wird.

So in etwa würde ich das machen (Code nicht getestet):
Code:
Public Class INI
    Private mPfad As String

    Public Sub New(ByVal pfad As String)
        mPfad = pfad
    End Sub

    Public Overrides Function ToString() As String
        Return Me.WertLesen("Speiseplan", "Name")
    End Function
    
    ....
End Class

Code:
    Private Sub ladeSpeisepläne(ByVal pfad As String)
            ComboEigenerPlan.Items.Clear()
            Dim lst As List(Of String) = Directory.GetFiles(pfad, "*.ini").ToList
            For i As Integer = 0 To lst.Count - 1
                Dim ini As New INI(Lst.Item(i))
                ComboEigenerPlan.Items.Add(ini)
            Next
        End Sub

Das in der Combobox ausgewählte INI-Objekt dann an die Lese-Methode übergeben

Code:
    Private Sub ladeDaten(ByVal ini As INI)
            Try
                        If ini.WertLesen("Speiseplan", "istUrl") = "True" Then
                            Dim browser As New WebBrowser
                            browser.Dock = DockStyle.Fill
                            browser.Url = New Uri(ini.WertLesen("Speiseplan", "Pfad"))
                            PanelControls.Controls.Clear()
                            PanelControls.Controls.Add(browser)
                        ElseIf ini.WertLesen("Speiseplan", "istBild") = "True" Then
                            Dim bild As New PictureBox
                            bild.Dock = DockStyle.Fill
                            bild.ImageLocation = ini.WertLesen("Speiseplan", "Pfad")
                            bild.SizeMode = PictureBoxSizeMode.Zoom
                            PanelControls.Controls.Clear()
                            PanelControls.Controls.Add(bild)
                        End If
            Catch ex As Exception
                MessageBoxAdv.Show(ex.Message)
            End Try
        End Sub

Edit: ähm.. ist das evtl. eine Hausaufgabe?
 
Zuletzt bearbeitet:
naja, es werden jetzt nicht eventuelle Konfigurationsfehler entdeckt und entsprechend behandelt
Das ist mir bewusst. Aktuell soll es erstmal funktionieren, also das dort nichts händisch angelegt/geändert wird.

Hast du denn spezifische Bedenken oder Fragen?
Ja. Mir kommt das verdammt umständlich vor. Aktuell ist das nur der Code, um eine Website oder ein Bild anzeigen zu lassen. Später soll da noch viel mehr konfigurierbar sein. Das wird, denke ich, noch viel komplizierter im Code.

Edit: ähm.. ist das evtl. eine Hausaufgabe?
Das ist einfach nur ein Tool, welches später bei uns in der Firma eingesetzt werden soll. Davon gibt es bereits eine funktionierende Version, allerdings ist dort sehr viel statisch und die Performance ist richtig schlecht. Ich mache das privat, da ich in der Firma aktuell mehr mit HTML und JavaScript arbeiten muss.

Dann sparst du dir später das raussuchen und erneute einlesen.
Ich muss doch eigtl. die Datei raussuchen, denn die INI-Klasse muss benötigt immer einen Pfad, aus der dann die Werte gelesen werden.
 
Zurück
Oben