Übungsprojekt Verbesserungen/Änderungen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Übungsprojekt Verbesserungen/Änderungen

    Moin moin

    Ich habe ein weiteres Projekt zur Übung von verschiedenen Sachen begonnen.
    Ein kleines Programm um Dateien um zu benennen. Ich habe das aus mehreren Gründen gemacht.
    1.) Was ich im www fand war alles nicht so richtig zu gebrauchen
    2.) Weil mein Opa auch eins brauchte ;)
    3.) Um noch weiter zu Üben auch was das Kommentieren von Code betrifft.

    Bisher funktioniert alles so wie ich es mir vorstellte. Hier mal ein Teil des Programmes:

    Erweiterungen in der XML Hinzufügen und das MainForm aktualisieren.

    Es gibt bestimmt noch viel was zu ändern wäre, ich habe mich auch bemüht alles OOP-Konform zu machen. :)

    Spoiler anzeigen

    Das Form

    VB.NET-Quellcode

    1. Public Class frm_Extensions
    2. Private Property XML_Path As String = Path.Combine(Application.StartupPath, "Extensions.xml")
    3. Private WithEvents CreateXMLFile As New CreateXMLFile
    4. Private WithEvents SaveXMLFile As New SaveXMLFile
    5. ''' <summary>
    6. ''' Konstruktor der Klasse frm_Extensions.
    7. ''' </summary>
    8. Public Sub New()
    9. InitializeComponent()
    10. If Not File.Exists(XML_Path) Then
    11. CreateXMLFile.CheckAndCreateXMLFile(XML_Path)
    12. MessageBox.Show("Keine XML-Datei gefunden, es wurde eine neue erstellt.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
    13. End If
    14. LoadFromXMLFile(XML_Path)
    15. LoadGroupNamesFromXML(XML_Path)
    16. LoadFromXMLFile(XML_Path)
    17. LoadGroupNamesFromXML(XML_Path)
    18. End Sub
    19. ''' <summary>
    20. ''' Meldungs und Fehlerbahandlung der SpeichernKlasse,
    21. ''' sowie EvendHandels für die Speicherung der XML-Datei.
    22. ''' </summary>
    23. Private Sub CreateXML_Error(ByVal errorMessage As String) Handles CreateXMLFile.ErrorOccurred
    24. ' Ausgaben wenn Fehler
    25. MessageBox.Show(errorMessage, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    26. End Sub
    27. ' Ausgaben wenn ok
    28. Public Sub CreateXML_XMLFileCreated() Handles CreateXMLFile.XMLFileCreated
    29. MessageBox.Show("Keine XML-Datei gefunden, es wurde eine neue erstellt.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
    30. End Sub
    31. ''' <summary>
    32. ''' Übergabe der Variablen an die SpeichernKlasse,
    33. ''' sowie EvendHandels für die Speicherung der XML-Datei.
    34. ''' </summary>
    35. Private Sub btn_Save_Click(sender As Object, e As EventArgs) Handles btn_Save.Click
    36. Dim groupName As String = txt_Group.Text.Trim()
    37. Dim extensions As String = txt_Extension.Text.Trim()
    38. SaveXMLFile.SaveDataToFile(XML_Path, groupName, extensions)
    39. End Sub
    40. ' Aktionen ausführen, wenn die Daten erfolgreich gespeichert wurden
    41. Private Sub DataSavedSuccessfullyHandler(sender As Object, e As EventArgs) Handles SaveXMLFile.DataSavedSuccessfully
    42. ' Listboxen aktualisieren
    43. LoadFromXMLFile(XML_Path)
    44. LoadGroupNamesFromXML(XML_Path)
    45. ' Textboxen leeren
    46. txt_Group.Text = String.Empty
    47. txt_Extension.Text = String.Empty
    48. MessageBox.Show("Die Daten wurden erfolgreich gespeichert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
    49. End Sub
    50. Private Sub SaveDataErrorHandler(sender As Object, e As SaveDataErrorEventArgs) Handles SaveXMLFile.SaveDataErrorOccurred
    51. ' Aktionen ausführen, wenn ein Fehler beim Speichern der Daten aufgetreten ist
    52. MessageBox.Show(e.ErrorMessage, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    53. ' Optional: Weitere Informationen zur Fehlerbehandlung anzeigen
    54. If e.Exception IsNot Nothing Then
    55. MessageBox.Show("Fehlerdetails: " & e.Exception.Message, "Fehlerdetails", MessageBoxButtons.OK, MessageBoxIcon.Error)
    56. End If
    57. End Sub
    58. ''' <summary>
    59. ''' Lädt die Gruppen und Erweiterungen aus der XML-Datei
    60. ''' und fügt sie der ListView hinzu.
    61. ''' </summary>
    62. Private Sub LoadFromXMLFile(filePath As String)
    63. Try
    64. Dim xdoc As XDocument = XDocument.Load(filePath)
    65. ListView1.Items.Clear()
    66. For Each groupElement As XElement In xdoc.Descendants("Group")
    67. Dim groupName As String = groupElement.Attribute("Name").Value
    68. Dim groupHeader As New ListViewGroup(groupName)
    69. ListView1.Groups.Add(groupHeader)
    70. For Each extensionElement As XElement In groupElement.Descendants("Extension")
    71. Dim extension As String = extensionElement.Value
    72. Dim item As New ListViewItem(extension)
    73. item.Group = groupHeader
    74. ListView1.Items.Add(item)
    75. Next
    76. Next
    77. Catch ex As Exception
    78. MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    79. End Try
    80. End Sub
    81. ''' <summary>
    82. ''' Event-Handler für das SelectedIndexChanged-Ereignis der CheckedListBox.
    83. ''' Füllt das Gruppenname-Textfeld mit dem ausgewählten Gruppennamen.
    84. ''' </summary>
    85. Private Sub ListBox_Group_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox_Group.SelectedIndexChanged
    86. ' Überprüfen, ob ein Gruppenname ausgewählt wurde
    87. If ListBox_Group.SelectedIndex >= 0 Then
    88. ' Den ausgewählten Gruppennamen in die Textbox der Gruppe eintragen
    89. txt_Group.Text = ListBox_Group.SelectedItem.ToString()
    90. End If
    91. End Sub
    92. ''' <summary>
    93. ''' Lädt die Gruppennamen aus der XML-Datei in die CheckedListBox.
    94. ''' </summary>
    95. Private Sub LoadGroupNamesFromXML(filePath As String)
    96. ListBox_Group.Items.Clear()
    97. Try
    98. Dim settings As New XmlReaderSettings()
    99. ' Leerzeichen ignorieren
    100. settings.IgnoreWhitespace = True
    101. Using reader As XmlReader = XmlReader.Create(filePath, settings)
    102. Dim xdoc As XDocument = XDocument.Load(reader)
    103. ' Durchsuchen der XML und Extrahieren der Gruppennamen
    104. For Each groupElement As XElement In xdoc.Descendants("Group")
    105. Dim groupName As String = groupElement.Attribute("Name").Value
    106. ListBox_Group.Items.Add(groupName)
    107. Next
    108. End Using
    109. Catch ex As Exception
    110. MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    111. End Try
    112. End Sub
    113. End Class


    Klasse zum speichern / ergänzen des XML-Files

    VB.NET-Quellcode

    1. Public Class SaveXMLFile
    2. ''' <summary>
    3. ''' Event, das ausgelöst wird, wenn die Daten erfolgreich gespeichert wurden.
    4. ''' </summary>
    5. Public Shared Event DataSavedSuccessfully As EventHandler
    6. ''' <summary>
    7. ''' Event, das ausgelöst wird, wenn ein Fehler beim Speichern der Daten auftritt.
    8. ''' </summary>
    9. Public Shared Event SaveDataErrorOccurred As EventHandler(Of SaveDataErrorEventArgs)
    10. ''' <summary>
    11. ''' Speichert die eingegebenen Erweiterungen in der XML-Datei.
    12. ''' </summary>
    13. Public Shared Sub SaveDataToFile(filePath As String, groupName As String, extensions As String)
    14. ' Überprüfen, ob sowohl Gruppenname als auch Erweiterungen eingegeben wurden
    15. If String.IsNullOrEmpty(groupName) OrElse String.IsNullOrEmpty(extensions) Then
    16. RaiseEvent SaveDataErrorOccurred(Nothing, New SaveDataErrorEventArgs("Bitte geben Sie einen Gruppennamen und Erweiterungen ein."))
    17. Return
    18. End If
    19. ' Aufteilen der eingegebenen Erweiterungen anhand des Kommas
    20. Dim extensionList As List(Of String) = extensions.Split(","c).Select(Function(ext) ext.Trim()).ToList()
    21. ' Überprüfen, ob mehr als 5 Erweiterungen eingegeben wurden
    22. If extensionList.Count > 5 Then
    23. RaiseEvent SaveDataErrorOccurred(Nothing, New SaveDataErrorEventArgs("Es können maximal 5 Erweiterungen pro Speichervorgang eingegeben werden."))
    24. Return
    25. End If
    26. Try
    27. ' Laden der vorhandenen XML-Datei
    28. Dim xdoc As XDocument = XDocument.Load(filePath)
    29. ' Überprüfen, ob die Gruppe bereits existiert
    30. Dim existingGroup As XElement = xdoc.Descendants("Group").FirstOrDefault(Function(g) g.Attribute("Name").Value = groupName)
    31. If existingGroup IsNot Nothing Then
    32. ' Gruppe existiert bereits, Erweiterungen hinzufügen
    33. Dim extensionsElement As XElement = existingGroup.Element("Extensions")
    34. ' Hinzufügen der neuen Erweiterungen zur Gruppe
    35. extensionList.ForEach(Sub(extension) extensionsElement.Add(New XElement("Extension", extension)))
    36. Else
    37. ' Gruppe existiert noch nicht, neue Gruppe mit Erweiterungen hinzufügen
    38. Dim fileExtensionGroupsElement As XElement = xdoc.Descendants("FileExtensionGroups").FirstOrDefault()
    39. Dim newGroupElement As New XElement("Group", New XAttribute("Name", groupName))
    40. Dim extensionsElement As New XElement("Extensions")
    41. extensionList.ForEach(Sub(extension) extensionsElement.Add(New XElement("Extension", extension)))
    42. newGroupElement.Add(extensionsElement)
    43. fileExtensionGroupsElement.Add(newGroupElement)
    44. End If
    45. ' Speichern der aktualisierten XML-Datei
    46. xdoc.Save(filePath)
    47. ' Daten erfolgreich gespeichert
    48. RaiseEvent DataSavedSuccessfully(Nothing, EventArgs.Empty)
    49. Catch ex As Exception
    50. RaiseEvent SaveDataErrorOccurred(Nothing, New SaveDataErrorEventArgs("Beim Speichern der Daten ist ein Fehler aufgetreten.", ex))
    51. End Try
    52. End Sub
    53. End Class
    54. ''' <summary>
    55. ''' Stellt ein Ereignisargument dar, das Informationen über einen Fehler beim Speichern von Daten enthält.
    56. ''' </summary>
    57. Public Class SaveDataErrorEventArgs
    58. Inherits EventArgs
    59. ''' <summary>
    60. ''' Initialisiert eine neue Instanz der SaveDataErrorEventArgs-Klasse mit der angegebenen Fehlermeldung.
    61. ''' </summary>
    62. ''' <param name="errorMessage">Die Fehlermeldung.</param>
    63. Public Sub New(errorMessage As String)
    64. Me.New(errorMessage, Nothing)
    65. End Sub
    66. ''' <summary>
    67. ''' Initialisiert eine neue Instanz der SaveDataErrorEventArgs-Klasse mit der angegebenen Fehlermeldung und Ausnahme.
    68. ''' </summary>
    69. ''' <param name="errorMessage">Die Fehlermeldung.</param>
    70. ''' <param name="exception">Die Ausnahme, die den Fehler verursacht hat.</param>
    71. Public Sub New(errorMessage As String, exception As Exception)
    72. Me._ErrorMessage = errorMessage
    73. Me._Exception = exception
    74. End Sub
    75. Private _ErrorMessage As String
    76. ''' <summary>
    77. ''' Ruft die Fehlermeldung ab.
    78. ''' </summary>
    79. Public ReadOnly Property ErrorMessage As String
    80. Get
    81. Return _ErrorMessage
    82. End Get
    83. End Property
    84. Private _Exception As Exception
    85. ''' <summary>
    86. ''' Ruft die Ausnahme ab, die den Fehler verursacht hat.
    87. ''' </summary>
    88. Public ReadOnly Property Exception As Exception
    89. Get
    90. Return _Exception
    91. End Get
    92. End Property
    93. End Class


    Klasse zum erstellen des XML-Files

    VB.NET-Quellcode

    1. Public Class CreateXMLFile
    2. ' Ereignis, das auftritt, wenn ein Fehler auftritt
    3. Public Shared Event ErrorOccurred(ByVal errorMessage As String)
    4. Public Shared Event XMLFileCreated()
    5. ''' <summary>
    6. ''' Überprüft, ob die XML-Datei vorhanden ist, und erstellt sie falls nicht.
    7. ''' </summary>
    8. Public Shared Sub CheckAndCreateXMLFile(filePath As String)
    9. ' Überprüfen, ob die XML-Datei vorhanden ist
    10. If File.Exists(filePath) Then Return
    11. Try
    12. ' XML-Struktur erstellen
    13. Dim xdoc As XDocument = CreateInitialXMLStructure()
    14. xdoc.Save(filePath)
    15. ' Event auslösen, um anzuzeigen, dass die XML-Datei erstellt wurde
    16. RaiseEvent XMLFileCreated()
    17. Catch ex As Exception
    18. ' Event auslösen, um den Fehler beim Erstellen der XML-Datei zu melden
    19. RaiseEvent ErrorOccurred(ex.Message)
    20. End Try
    21. End Sub
    22. ''' <summary>
    23. ''' Erstellt die initiale XML-Struktur mit den vordefinierten Gruppen und Erweiterungen.
    24. ''' </summary>
    25. Private Shared Function CreateInitialXMLStructure() As XDocument
    26. ' Liste der Gruppen und zugehörigen Erweiterungen erstellen
    27. Dim groups As New List(Of GroupElement) From {
    28. New GroupElement("Bildertypen", New List(Of String) From {".jpg", ".jpeg", ".png"}),
    29. New GroupElement("Texttypen", New List(Of String) From {".txt", ".doc", ".pdf"})
    30. }
    31. Dim fileExtensionGroupsElement As New XElement("FileExtensionGroups")
    32. For Each group In groups
    33. fileExtensionGroupsElement.Add(group.ToXElement())
    34. Next
    35. ' XML-Dokument erstellen und zurückgeben
    36. Return New XDocument(
    37. New XElement("FileExtensionDictionary",
    38. fileExtensionGroupsElement
    39. )
    40. )
    41. End Function
    42. ''' <summary>
    43. ''' Stellt eine Gruppe mit dem Gruppennamen und den zugehörigen Erweiterungen dar.
    44. ''' </summary>
    45. Private Class GroupElement
    46. Public Sub New(name As String, extensions As List(Of String))
    47. Me.Name = name
    48. Me.Extensions = extensions
    49. End Sub
    50. Public Property Name As String
    51. Public Property Extensions As List(Of String)
    52. ''' <summary>
    53. ''' Konvertiert das GroupElement-Objekt in ein XElement-Objekt für die XML-Darstellung.
    54. ''' </summary>
    55. ''' <returns>Das XElement-Objekt, das die Gruppe repräsentiert.</returns>
    56. Public Function ToXElement() As XElement
    57. Dim groupElement As New XElement("Group", New XAttribute("Name", Name))
    58. Dim extensionsElement As New XElement("Extensions")
    59. For Each extension In Extensions
    60. extensionsElement.Add(New XElement("Extension", extension))
    61. Next
    62. groupElement.Add(extensionsElement)
    63. Return groupElement
    64. End Function
    65. End Class
    66. End Class

    Bilder
    • frmExtension.jpg

      110,83 kB, 507×336, 63 mal angesehen
    • frmMain.jpg

      173,19 kB, 535×670, 66 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Beim schnellen Durchlesen, fallen mir ad hoc 2 Dinge in der Klasse frm_Extensions auf :

    VB.NET-Quellcode

    1. Private Property XML_Path As String = Path.Combine(Application.StartupPath, "Extensions.xml")


    Je nachdem, wo das Programm installiert wurde, wird man Schwiergkeit haben dort etwas zu schreiben. Verschiebe die Datei in den AppData Ordner (Special Folders: LocalApplicationData oder ApplicationData).

    In den Zeilen 15-18 hast Du eine Code-Doppelung.

    VB.NET-Quellcode

    1. ​ LoadFromXMLFile(XML_Path)
    2. LoadGroupNamesFromXML(XML_Path)
    3. LoadFromXMLFile(XML_Path)
    4. LoadGroupNamesFromXML(XML_Path)


    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

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

    @INOPIAE

    LoadGroupNamesFromXML(XML_Path)

    Habe mein Code überprüft, finde den doppelten Eintrag nicht. Entweder hatte ich das schon verbessert oder .... ;)

    Was den Ordner betrifft, wo die XML-Datei abgelegt wird, war meine Idee, das dieses Programm auch von einem USB-Stick laufen sollte.
    Aber ich werde deinen Vorschlag mal mit aufnehmen.

    EDIT: 08:10 Uhr
    Kleine Änderung vorgenommen.

    VB.NET-Quellcode

    1. Private Property XML_Path As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RenameWizard\Extensions.xml")
    2. Public Sub New()
    3. InitializeComponent()
    4. Dim directoryPath As String = Path.GetDirectoryName(XML_Path)
    5. If Not Directory.Exists(directoryPath) Then
    6. Directory.CreateDirectory(directoryPath)
    7. End If
    8. CheckAndCreateXMLFile(XML_Path)
    9. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    das dieses Programm auch von einem USB-Stick laufen sollte.


    Dann prüfe doch, wo das Programm installiert wurde. Wenn es der SpecialFolder ProgramFiles bzw. ProgramFilesX86 ist dann lege die Daten in AppData sonst in den StartupPath.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Mal als Pseudo Code:
    Beim Start des Programmes
    If StartupPath contains SpecialFolder.ProgramFiles then
    Speicherpfad = SpecialFolders.Appdata
    Else
    Speicherpfad = StartupPath
    End if

    Öffne Datei Spiecherpfad &"\wasimmer.xml"
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Du könntest auch das Arbeitsverzeichnis auf %LocalAppData% festlegen falls die Anwendung nicht von einem USB gestartet wird.
    Spoiler anzeigen

    C#-Quellcode

    1. // Ermittelt den Laufwerksbuchstaben C:\, D:\ ect...
    2. string applicationRootDir = new System.IO.FileInfo(Application.StartupPath).Directory.Root.Name;
    3. // Prüfen ob es sich um z.B. einen USB stick handelt
    4. System.IO.DriveInfo drive = System.IO.DriveInfo.GetDrives().FirstOrDefault(x => x.RootDirectory.Name == applicationRootDir);
    5. if (drive.DriveType != System.IO.DriveType.Removable)
    6. {
    7. // Es ist kein USB, Arbeitsverzeichnis auf %LocalAppData% festlegen.
    8. System.IO.Directory.SetCurrentDirectory(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name));
    9. }
    10. // Datei ggf. erstellen, es wird kein absoluter Pfad benötigt.
    11. string extensionXmlFileName = "Extensions.xml";
    12. if (System.IO.File.Exists(extensionXmlFileName))
    13. {
    14. // Erstelle Datei
    15. }
    16. // Datei lesen, es wird kein absoluter Pfad benötigt.
    17. string xmlContent = System.IO.File.ReadAllText(extensionXmlFileName);



    Edit:
    Zeile 9 läst sich auch kürzer formulieren

    C#-Quellcode

    1. System.IO.Directory.SetCurrentDirectory(Application.LocalUserAppDataPath);

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()