Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.175 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Ini ohne IniFiles Project (WinApi)

  Alt 27. Aug 2020, 09:02
[EDIT] Ohh, wo kommen denn die ganzen Antworten her ... dschudlsche, dass NonVCL 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.
Delphi-Referenz durchsuchenSameText oder Delphi-Referenz durchsuchenCompareString(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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Aug 2020 um 09:19 Uhr)
  Mit Zitat antworten Zitat