Ein Set von Komponenten zum Verwalten von INI - Dateien.
Diese Komponente ist von mir ursprünglich als Hilfsklasse für ein anderes Projekt entwickelt worden.
Es entstand die Idee eine Windows-Forms-Komponente aus dieser Hilfsklasse zu machen und diese anderen zur Verfügung zu stellen.
Inzwischen habe ich weitere Komponenten hinzugefügt welche die Benutzung der Komponente IniFile weiter vereinfachen.
Es sind nur noch wenige Zeilen Code erforderlich um die volle Funktionalität zu erreichen.
-
Abschnitte werden durch eckige Klammern [ ] gekennzeichnet.
-
Sie dienen dazu, verwandte Einstellungen zu gruppieren.
Beispiel:
[Datenbank]-
Innerhalb eines Abschnitts werden Einstellungen als Schlüssel-Wert-Paare definiert.
-
Der Schlüssel und der Wert werden durch ein Gleichheitszeichen = getrennt.
Beispiel:
Benutzername=admin
Passwort=geheim-
Kommentare beginnen mit einem Semikolon ; oder einem Hashtag #.
-
Sie werden ignoriert und dienen nur zur Dokumentation.
Beispiel:
; Dies ist ein Kommentar
# Dies ist auch ein Kommentar; Dies ist eine Beispiel-INI-Datei
[Allgemein]
; Allgemeine Einstellungen
AppName=MeineApp
Version=1.0.0
[Datenbank]
; Einstellungen zur Datenbank
Server=localhost
Port=3306
Benutzername=admin
Passwort=geheim
[Logging]
LogLevel=DEBUG
LogDatei=logs/app.logErklärung des Beispiels
📝 Kommentare:
→ Die erste Zeile ist ein Kommentar, der ignoriert wird.
📝 Abschnitt "Allgemein":
→ Die erste Zeile des Abschnitts ist ein Kommentar der ignoriert wird
→ AppName=MeineApp: Definiert den Namen der Anwendung.
→ Version=1.0.0: Gibt die Version der Anwendung an.
📝 Abschnitt "Datenbank":
→ Die erste Zeile des Abschnitts ist ein Kommentar der ignoriert wird
→ Server=localhost: Gibt den Datenbankserver an.
→ Port=3306: Gibt den Port an, auf dem die Datenbank läuft.
→ Benutzername=admin: Der Benutzername für die Datenbank.
→ Passwort=geheim: Das Passwort für die Datenbank.
📝 Abschnitt "Logging":
→ LogLevel=DEBUG: Definiert das Log-Level.
→ LogDatei=logs/app.log: Gibt den Pfad zur Log-Datei an.
📝 Wichtige Hinweise:
→ Leerzeichen: Leerzeichen um das Gleichheitszeichen werden ignoriert.
→ Groß-/Kleinschreibung: In der Regel sind Schlüssel und Abschnittsnamen nicht case-sensitive, aber das kann je nach Implementierung variieren.
→ Mehrere Abschnitte: Eine INI-Datei kann mehrere Abschnitte enthalten, und jeder Abschnitt kann mehrere Schlüssel-Wert-Paare haben.
💡 INI-Dateien sind aufgrund ihrer Einfachheit und Lesbarkeit weit verbreitet, insbesondere für kleinere Anwendungen und Konfigurationsdateien, die von Menschen bearbeitet werden sollen.
Das Modul kapselt:
- Ein datenorientiertes Kernobjekt
IniFile(nicht-visuell, verwaltet Struktur & Persistenz). - Mehrere WinForms-UserControls zur Anzeige und Bearbeitung:
- Listendarstellung von Sektionen oder Einträgen
- Bearbeitung einzelner Werte
- Bearbeitung von Kommentarblöcken
- Anzeige des gesamten Dateiinhalts
- Dialoge für hinzufügen, löschen, umbenennen.
- Stark ereignisgetriebenes Modell: UI löst semantische Events aus, Host-Anwendung führt Änderungen aus (Trennung von Anzeige & Datenquelle).
| Kategorie | Name | Zweck |
|---|---|---|
| Daten / Logik | IniFile |
Laden, Parsen, Manipulieren und Speichern der INI-Struktur |
| UI – Listen | ListEdit |
Anzeigen & Auslösen von Add/Rename/Delete für Sektionen oder Eintragslisten |
| UI – Wert | EntryValueEdit |
Anzeigen & Ändern des Wertes eines konkreten Eintrags |
| UI – Kommentar | CommentEdit |
Bearbeiten von Datei- oder Abschnittskommentaren |
| UI – Ansicht | ContentView |
Nur Anzeige des generierten Roh-Dateiinhalts |
| Dialoge | AddItemDialog |
Neuen Namen erfassen |
| Dialoge | RenameItemDialog |
Vorhandenen Namen ändern |
| Dialoge | DeleteItemDialog |
Löschbestätigung |
| EventArgs | ListEditEventArgs |
Kontext bei Listenoperationen |
| EventArgs | EntryValueEditEventArgs |
Kontext beim Ändern eines Eintragswertes |
| EventArgs | CommentEditEventArgs |
Kontext beim Übernehmen eines Kommentarblocks |
Architekturprinzipien:
- Keine direkte Kopplung UI ↔ Persistenz: Steuerlogik liegt im Host (z. B. Form).
- Alle UI-Steuerelemente sind zustandsarm (halten nur Kontext + Anzeigezustand).
IniFilearbeitet strikt strukturorientiert (Kommentare getrennt, Abschnitte als Dictionaries).
Verwaltet:
- Kommentar am Datei-Anfang
- Abschnittskommentare
- Schlüssel-Wert-Paare je Abschnitt
- Rohinhalt als Zeilenarray
Zentrale Methoden:
- Erzeugen:
CreateNewFile([commentPrefix]) - Laden / Speichern:
LoadFile(),SaveFile() - Abfragen:
GetSectionNames(),GetEntryNames(section),GetEntryValue(section, key) - Mutationen:
AddSection(),RenameSection(),DeleteSection(),AddEntry(),RenameEntry(),DeleteEntry(),SetEntryValue(),SetSectionComment(),SetFileComment()
Parsing:
ParseFileContent()rekonstruiert interne Strukturen.- Kommentare werden prefixfrei intern gespeichert (Wiederzusammenbau via
CreateFileContent()).
Ereignisse:
FileContentChangedSectionNameExistEntryNameExist
Darstellung einer Liste (Sektionen oder Einträge):
- Buttons: Hinzufügen, Umbenennen, Löschen
- Events mit
ListEditEventArgs:ItemAdd(NewItemName)ItemRename(SelectedItem + NewItemName)ItemRemove(SelectedItem)SelectedItemChanged
- Host setzt:
ListItems(String-Array)SelectedSection
- Intern: keine direkte Manipulation der INI-Datei.
Bearbeitet einen Eintragswert.
- Properties:
SelectedSection,SelectedEntry,Value,TitelText - Event:
ValueChanged(EntryValueEditEventArgs) - Button aktiv nur, falls Text geändert wurde.
Bearbeitet Datei- oder Abschnittskommentare.
- Properties:
Comment(String[]),SectionName,TitelText - Event:
CommentChanged(CommentEditEventArgs) - Änderung erst nach explizitem Buttonklick.
Schreibgeschützte Anzeige eines Zeilenarrays:
- Property:
Lines - Dient typischerweise zur Anzeige des durch
IniFile.CreateFileContent()generierten Zustands.
| Dialog | Zweck | Besonderheiten |
|---|---|---|
AddItemDialog |
Neuen Namen erfassen | OK erst bei nicht-leerer Eingabe |
RenameItemDialog |
Alten → neuen Namen | Platzhalter {0} im Label für alten Namen |
DeleteItemDialog |
Löschbestätigung | Platzhalter {0} für anzuzeigendes Element |
- Benutzer wählt Item in
ListEdit - Klick "Umbenennen" → Dialog → bestätigt
ListEditfeuertItemRename- Host ruft
IniFile.RenameEntry() IniFileerzeugt neuen Rohinhalt →FileContentChanged- Host lädt neue
EntryNames→ setztListEdit.ListItems
- Host setzt
CommentEdit.Comment = ini.GetSectionComment("Logging") - Benutzer editiert → klickt Übernehmen
CommentChanged-Event- Host ruft
SetSectionComment() FileContentChanged→ Host aktualisiertContentView.Lines
Allgemeine Prinzipien:
- Fehler dürfen nicht stillschweigend passieren.
- Kein partielles Speichern von Änderungen.
Eingangsvalidierung:
- Alle Eingaben (z. B. von Dialogen) sind vor Verarbeitung zu überprüfen.
Spezifische Validierungen:
IniFile:
- Verbieten leerer oder nur aus Leerzeichen bestehenden Namen für Sektionen und Einträge.
- Verhindern von Duplikaten: Keine zwei Sektionen oder Einträge mit demselben Namen.
Steuerelemente:
EntryValueEdit: Nur gültige, nicht-leere Werte erlauben.CommentEdit: Umgang mit mehrzeiligen Kommentaren prüfen (z. B. durchJoin()beim Setzen).
Fehlerberichte:
- Verwendung eigener Ausnahmen (z. B.
IniException) zur präzisen Fehlerkommunikation. - Zwingend: Fehlerursache und behobene/falsche Werte im Fehlerbericht.
Thread-Sicherheit:
- Prinzipiell nicht thread-sicher. Entwickler muss für Sicherheit sorgen.
- Vorschlag: Synchronisierungsmechanismen wie
lockbei Zugriff aufIniFile-Instanzen.
Performance-Überlegungen:
-
Vermeiden unnötiger
Load/Save-Operationen. -
Beispiel:
lock (iniFile) iniFile iniFile.LoadFile("konfiguration.ini") ' Änderungen vornehmen iniFile.SaveFile
-
Aufwand für Synchronisierung meist vernachlässigbar gegen I/O-Operationen.
Erweiterbarkeit:
- Gestaltung auf Einfachheit der Erweiterung bedacht.
- Z.B. Hinzufügen neuer Steuerelemente oder Anpassungen in
IniFile- Logik.
Best Practices:
- Bei Subklassenbildung: Basisimplementierungen stets berücksichtigen.
- Bei Erweiterung von Dialogen: Immer auch an Validierung denken.
Allgemein:
- Einheitlichere Ereignisnamen (z. B.
ItemAddedstattItemAdd). - Konsistentere Methode zur Fehlerberichterstattung (z. B. überall Ausnahmen verwenden).
IniFile-Klasse:
- Verbessertes Fehlerhandling beim Laden/Speichern (z. B. Detailierte Ausnahmen).
- Möglichkeit, Dateiüberschreibungen zu erzwingen oder abzulehnen.
UI-Komponenten:
- Verbesserung der Benutzerführung, z. B. durch Tooltips oder Eingabehilfen.
- Erweiterte Dialogoptionen, z. B. Mehrfachlöschung oder -umbenennung.
Dokumentation:
- Vollständige Beispiele für typische Anwendungsfälle.
- Detailliertere Fehlerbeschreibungen und Lösungsvorschläge.
| Thema | Empfehlung |
|---|---|
| Fehlerkommunikation | Events ergänzen durch aussagekräftige Argumente (z. B. Konfliktname) |
| Logging | Optionales Interface (ILogger) integrieren |
| Unit Tests | Fokus: Parser, Rename-Operationen, Kommentar-Roundtrip |
| API Konsistenz | Einheitliche Benamung (Entry vs. Item) prüfen |
Das Modul stellt eine klare Trennung von Datenmodell (IniFile) und Benutzerinteraktion (UserControls + Dialoge) bereit. Durch konsequente Eventorientierung bleibt die Host-Anwendung flexibel und kann eigene Logik (Validierung, Persistenzstrategien, Undo/Redo) ergänzen.
Für größere Evolutionsschritte bieten sich an:
- Zentralisiertes Änderungs- und Konfliktmanagement
- Verbesserte Nutzungs- und Fehlermeldungen
- Erweiterte Formatierungsregeln (z. B. Quoting)