Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Objektorientiertes TIniFile-Replacement mit Unicode-Fähigkeit

  Alt 19. Okt 2012, 15:13
Hallöche...

Ich verwende als Konfiguration in meinen Projekten am liebsten Ini-Dateien statt der Registry. Dabei hat mich eigentlich immer gestört, dass TIniFile
  1. keinen direkten Zuriff auf Einträge in der Ini bietet sondern mehr oder weniger nur eine in eine Klasse verpackte prozedurale Programmierung hat
  2. Nicht wirklich eine Streaming-Fähigkeit hat, man kann nicht direkt aus Streams lesen oder in Streams speichern.
  3. (zumindest in D7) nicht Unicode-fähig ist
  4. Keine umkonfigurierbaren Kommentar-Einleit-Zeichen hat
  5. Keine Zeilenumbrüche innerhalb von Variablenwerten unterstützt
  6. Keine Funktion zum regelmäßigen automatischen Speichern hat
Darum hab ich mal ein bissi was gebastelt. Herausgekommen ist eine Klasse, die einen Großteil der Properties und Methoden von TIniFile bietet (also zu 99% kompatibel sein sollte), per Compilerschalter zwischen einer Unicode- und einer ANSI-Version umschaltbar ist und auf die einzelnen Sections und Idents direkt zugreifen kann. Ein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TUniObjectIni;
begin
  Ini:= TUniObjectIni.Create('C:\Test.txt');
  try
    Ini['Section1']['Ident1'].Str:= 'Test 1';
    Ini['Section2']['Ident1'].Str:= 'Zeile 1' + #13#10 + 'Zeile 2';
    Ini['Section2']['Number'].Int:= 1234;
    Ini['Section2']['Float'].Float:= 12.34;
    Ini['Section2']['Timestamp'].DateTime:= Now;
  finally
    Ini.UpdateFile;
    Ini.Free;
  end;
end;
Am Rande bemerkt verwendet TUniObjectIni nicht das Windows-API für die Dateigeschichten (Stichwort WritePrivateProfileString) sondern arbeitet komplett mit einer StringList. Dadurch sollte der Code auch relativ leicht zu Lazarus portierbar sein. Es wird aber nur beim Laden und Speichern von Dateien auf der StringList rumfuhrwerkt, alles andere passiert komplett im Speicher.

Als Unicode-Backend verwende ich in dem Fall SynUnicode (siehe SynEdit-Komponenten bei Sourceforge), man könnte aber genausogut jede andere Implementierung einer Unicode-fähigen StringList verbauen. Die jetzige ist jedenfalls schlau genug, um sowohl ANSI- als auch Unicode-codierte Dateien zu laden. Einmal als ANSI geladene Dateien bleiben auch beim Speichern ANSI, es sei denn man fügt Unicode ein.

Schauts euch mal an und gebt mal ein bisschen Feedback dazu.

Greets
Cody
Angehängte Dateien
Dateityp: pas UniObjectIni.pas (25,3 KB, 24x aufgerufen)
  Mit Zitat antworten Zitat