AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

Ein Thema von AJ_Oldendorf · begonnen am 2. Jan 2019 · letzter Beitrag vom 4. Jan 2019
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 14:55
Hallo,
Zitat:
Dann hast du dich bisher auf eine fehlerhafte Implementierung verlassen.
Naja, diese Aussage lasse ich mal unkommentiert.

Ich erinnere an die Einführung von TStringList.StrictDelimiter,
um die alte, "fehlerhafte" (?) Implementierung und vor allem die Anwendungen nicht zu brechen.

Wenn TMemIniFile früher falsch implementiert war, gut (oder auch nicht).
Aber das Verhalten einer Komponente, was sie seit Äonen (*übertreib*) hat, einfach zu ändern, tztz.
Wenn man nicht davon ausgeht das sich irgendjemand auf diese fehlerhafte Implementierung verlässt, dann kann man diese m.E. Problemlos einfach so korrigieren.
Es steht ja auch an genügend Stellen das Sektionen Eindeutig sein müssen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#12

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:09
Hallo,
Zitat:
Dann hast du dich bisher auf eine fehlerhafte Implementierung verlassen.
Naja, diese Aussage lasse ich mal unkommentiert.

Ich erinnere an die Einführung von TStringList.StrictDelimiter,
um die alte, "fehlerhafte" (?) Implementierung und vor allem die Anwendungen nicht zu brechen.

Wenn TMemIniFile früher falsch implementiert war, gut (oder auch nicht).
Aber das Verhalten einer Komponente, was sie seit Äonen (*übertreib*) hat, einfach zu ändern, tztz.
Wenn man nicht davon ausgeht das sich irgendjemand auf diese fehlerhafte Implementierung verlässt, dann kann man diese m.E. Problemlos einfach so korrigieren.
Es steht ja auch an genügend Stellen das Sektionen Eindeutig sein müssen.
Man muss aber noch dazu anmerken, dass TIniFile (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 TMemIniFile , allerdings funktioniert diese eben anders als TMemIniFile .
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:19
Es steht ja auch an genügend Stellen das Sektionen Eindeutig sein müssen.
Wo denn?

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.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#14

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:26
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.
Für Delphi Rio solltest du in der Dokumentation zu Delphi Rio nachschlagen und da steht das nicht mehr drin.
http://docwiki.embarcadero.com/Libra...es.TMemIniFile
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:31
Dann ist es also doch eine Verhaltensänderung und die ist sogar dokumentiert
Ich finde ein Update sollte kompatibel sein.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:32
Es steht ja auch an genügend Stellen das Sektionen Eindeutig sein müssen.
Wo denn?
https://github.com/SemaiCZE/inicpp/w...-specification

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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:38
Hm, guter Aspekt. Allerdings habe ich das folgende so verstanden, also ob das ginge.
Man muss aber noch dazu anmerken, dass TIniFile (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 TMemIniFile , allerdings funktioniert diese eben anders als TMemIniFile .
Sorry. 1. Würdest Du als Delphi-Entwickler eine Spezifikation raussuchen wenn es schon seit Jahrzehnten funktionierete? 2. Warum sollte gerade die Spezifikation die richtige sein. Die ist ja um Jahrzehnte jünger.
Ich bin eh der Meinung es gibt keine offizielle Ini-Spezifikation, also eine Norm.

Geändert von freimatz ( 3. Jan 2019 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#18

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:51
Also damit wir alle über die gleiche Problematik sprechen:
Delphi-Quellcode:
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.
Unter Tokyo
Code:
TMemIniFile:

S1:
- k1 = v1
S2:
- k2 = v2
S1:
- k1 = v1
<EOF>

TIniFile:

S1:
- k1 = v1
S2:
- k2 = v2
S1:
- k1 = v1
<EOF>
Unter Rio
Code:
TMemIniFile:

S1:
- k1 = v1
- k3 = v3
S2:
- k2 = v2
<EOF>

TIniFile:

S1:
- k1 = v1
S2:
- k2 = v2
S1:
- k1 = v1
<EOF>
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#19

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 15:54
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#20

AW: Unterschied TMemIniFile 10.2 Tokyo / 10.3 Rio

  Alt 3. Jan 2019, 16:08
Die größte Überraschung bietet sich wenn man Cross-Plattform entwickelt, denn unter Windows ist TIniFile ein Wrapper der WinAPI und bei allen anderen Plattformen ein Alias für TMemIniFile .

Und da gibt es eben ab Rio jetzt Unterschiede.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 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