[EDIT] Ohh, wo kommen denn die ganzen Antworten her ... dschudlsche, dass Non
VCL nochmal erwähnt wird.[/EDIT]
NonVCL bedeutet aber nicht unbedingt NonRTL.
OK, wenn es wirklich nur die Windows-
Unit nutzen soll, dann kann man auch direkt auf
WinAPI aufbauen (auch das LowerCase ist da vorhanden)
aber gerade auf die grundlegensten und im Normalfall extrem häufig verwendeten Units der
RTL zu verzichten .... hmmmm.
Werden die dann doch eigentlich immer irgendwo benutzt, dann ist es den Aufwand eigentlich nicht Wert.
Vor allem auf die SysUtils möchte ich niemals verzichten, oder bastelst du dir eine
Exception-Behandlung selbst?
Warum gibt ReadInteger einen Cardinal zurück?
Wozu der Default '' im CreateFile, wenn FileName unbedingt nötig ist?
Auch bei Section und Ident muß man was angeben, sonst isses ja sinnlos.
[edit] außer beim ReadString ... mit etwas Anpassung bekommt man bei leerem Section/Ident (nil) die Liste der Sections zurück.
Den Sinn von _LowerCase hab ich nicht verstanden, da eh nur für für Boolean genutzt wird.
SameText oder
CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, ...)
_FileExists ist auch unnötig, da GetPrivateProfileString das bereits beachtet ... erspart auch die doppelte Behandlung des Default.
Und da nun nichts mehr übrig ist ... weg mit dem Objekt
Delphi-Quellcode:
type
TkzIni = record // hier gibt es nicht freizugeben ... keine Handles, nur ein gemagagter Typ, also kann man hier die Automatik nutzen
private
FFileName: string;
public
class function Create(const FileName: string): TkzIni; static;
function ReadString (const Section, Ident: string; const Default: string = ''): string;
function WriteString (const Section, Ident: string; const Value: string = ''): Boolean;
function ReadInteger (const Section, Ident: string; const Default: Integer = 0): Cardinal; // wenn man schon überall leer '' als Default nimmt ... dann hier auch, oder nicht?
function WriteInteger(const Section, Ident: string; const Value: Integer = 0): Boolean;
function ReadBoolean (const Section, Ident: string; const Default: Boolean = False): Boolean;
function WriteBoolean(const Section, Ident: string; const Value: Boolean = False): Boolean;
end;
Beim Write kann man sich überlegen das über eine Exeption regeln zu lassen.
Ich kenne fast niemanden, der bei sowas die Rückgabewerte prüft, also dan besser automatisch prüfen lassen.
Ungültige Pfade und fehlende Schreibrechte sind ja keine unwichtige Sache. Randvoller, Datenträger auch nicht, aber das sollte kaum noch vorkommen. (und wenn doch, dann hat man größere Probleme)
Am Ende ist es sowieso inkonsistent, denn wenn man beim Lesen keine Fehler prüft, kann man es beim Schreiben auch weglassen.
(oder andersrum)
Delphi-Quellcode:
function TkzIni.ReadString(const Section, Ident, Default: string): string;
const
MaxLength: Cardinal = 1024;
begin
SetLength(Result, MaxLength);
SetLength(Result, GetPrivateProfileString(PChar(Section), PChar(Ident), PChar(Default), PChar(Result), MaxLength + 1, PChar(FFileName)); // +1 für abschließende #0
end;
function TkzIni.ReadString(const Section, Ident, Default: string): string;
begin
SetLength(Result, 1024);
SetLength(Result, GetPrivateProfileString(PChar(Section), PChar(Ident), PChar(Default), PChar(Result), Length(Result) + 1, PChar(FFileName)); // +1 für abschließende #0
end;
PS: Und sooooooooooo groß ist es nicht (da sind andere Dinge schlimmer)
TIniFile ist auch
WinAPI, aber auf anderen Plattformen wird es transparent durch TMemIniFile ersetzt.