AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Zitat:
Es steht ja auch an genügend Stellen das Sektionen Eindeutig sein müssen. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Zitat:
Delphi-Quellcode:
(ein reiner Wrapper der Windows-API-Aufrufe) exakt so funktioniert, wie der TE das wünscht. Diese "fehlerhafte" Implementierung wird also vom OS vorgegeben. Richtiger ist die Rio Implementierung von
TIniFile
Delphi-Quellcode:
, allerdings funktioniert diese eben anders als
TMemIniFile
Delphi-Quellcode:
.
TMemIniFile
|
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Zitat:
Hier steht aber: Note: On Windows, a related object, TMemIniFile, works the same way as TIniFile, but buffers writes in memory to minimize disk access. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Zitat:
http://docwiki.embarcadero.com/Libra...es.TMemIniFile |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Dann ist es also doch eine Verhaltensänderung und die ist sogar dokumentiert
Ich finde ein Update sollte kompatibel sein. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Zitat:
Wie würdest du mit WinAPI-Mitteln eine Ini-Datei mit mehreren gleichen Sektionen auslesen können? AFAIK gibt es da keine APIs welche das können würden. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Hm, guter Aspekt. Allerdings habe ich das folgende so verstanden, also ob das ginge.
Zitat:
Zitat:
Ich bin eh der Meinung es gibt keine offizielle Ini-Spezifikation, also eine Norm. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Also damit wir alle über die gleiche Problematik sprechen:
Delphi-Quellcode:
Unter Tokyo
program MemIniTest;
{$APPTYPE CONSOLE} {$R *.res} uses System.Classes, System.SysUtils, System.IniFiles, System.IOUtils; procedure CheckIniClass(AIniFactory: TFunc<string, TCustomIniFile>); const C_CONTENT = '' + // '[S1]' + sLineBreak + // 'k1=v1' + sLineBreak + // '[S2]' + sLineBreak + // 'k2=v2' + sLineBreak + // '[S1]' + sLineBreak + // 'k3=v3' + sLineBreak + // ''; var lIni: TCustomIniFile; lSectionStrings, lValueStrings: TStrings; lKeyIdx: Integer; lSection, lKey, lValue: string; begin TFile.WriteAllText('.\test.ini', C_CONTENT); lIni := AIniFactory('.\test.ini'); try lValueStrings := TStringList.Create(); try lSectionStrings := TStringList.Create(); try lIni.ReadSections(lSectionStrings); for lSection in lSectionStrings do begin Writeln(lSection, ':'); lValueStrings.Clear(); lIni.ReadSectionValues(lSection, lValueStrings); for lKeyIdx := 0 to lValueStrings.Count - 1 do begin lKey := lValueStrings.Names[lKeyIdx]; lValue := lValueStrings.ValueFromIndex[lKeyIdx]; Writeln('- ', lKey, ' = ', lValue); end; end; finally lSectionStrings.Free(); end; finally lValueStrings.Free(); end; Writeln('<EOF>'); finally lIni.Free(); end; end; procedure Main(); begin Writeln('TMemIniFile:'); Writeln; CheckIniClass( function(AFilename: string): TCustomIniFile begin Result := TMemIniFile.Create(AFilename); end); Writeln; Writeln('TIniFile:'); Writeln; CheckIniClass( function(AFilename: string): TCustomIniFile begin Result := TIniFile.Create(AFilename); end); end; begin try Main(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end.
Code:
Unter Rio
TMemIniFile:
S1: - k1 = v1 S2: - k2 = v2 S1: - k1 = v1 <EOF> TIniFile: S1: - k1 = v1 S2: - k2 = v2 S1: - k1 = v1 <EOF>
Code:
TMemIniFile:
S1: - k1 = v1 - k3 = v3 S2: - k2 = v2 <EOF> TIniFile: S1: - k1 = v1 S2: - k2 = v2 S1: - k1 = v1 <EOF> |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Das steht in der Doku zu TIniFile und in ähnlicher Form auch noch für Rio, insofern erstmal dort keine Änderung. Da steht aber nirgendwo, daß TMemInifile die fehlerhafte Implementierung der WinApi nachbildet und Microsoft schweigt sich in diesem Punkt eh aus und verweist lieber auf die Registry, wo das schon gar nicht mehr gehen würde.
Insbesondere steht in der Delphi Doku nirgendwo, daß mehrere Sections mit gleichen Namen existieren dürfen. Wäre es so, müsste das Verhalten in diesem Fall irgendwo erläutert werden (z.B. was passiert bei ReadSectionValues? In welche Section wird geschrieben, wenn das Item in keiner existiert?), andernfalls wäre es undefiniert. Undefiniertes Verhalten kann sich allerdings schon mal in einer neuen Version ändern. Wie Freimatz schon sagte, gibt es keine Norm für diesen Fall, und somit kann sich Delphi auch an keine halten bzw. gehalten haben. Die Änderung des Verhaltens in Rio ist also durchaus plausibel und meiner Meinung nach auch akzeptabel, da sie eine Inkonsistenz beseitigt. Jetzt muss das nur noch irgendwer mal in die Doku aufnehmen. |
AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio
Die größte Überraschung bietet sich wenn man Cross-Plattform entwickelt, denn unter Windows ist
Delphi-Quellcode:
ein Wrapper der WinAPI und bei allen anderen Plattformen ein Alias für
TIniFile
Delphi-Quellcode:
.
TMemIniFile
Und da gibt es eben ab Rio jetzt Unterschiede. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz