@Pierre,
ich habe den Eindruck, dass das Problem in Windows enthalten ist oder durch PChar/SetString verursacht wird:
Zitat von
DGL-luke:
TIniFile:
Delphi-Quellcode:
function TIniFile.ReadString(const Section, Ident, Default: string): string;
var
Buffer: array[0..2047] of Char;
begin
SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
PChar(Ident), PChar(Default), Buffer, SizeOf(Buffer), PChar(FFileName)));
end;
Durch
GetPrivateProfileString erhält man die MS-Hilfe; daraus und durch die o.g. Implementierung in Delphi ergibt sich, dass (a) entweder MS den Fehler verursacht (in der Hilfe steht z.B. auch, dass führende Leerzeichen entfernt werden, vielleicht gilt das auch für Hochkommata) oder (b) die Umwandlung zwischen Delphi-Strings und nullterminierten Strings nicht vollständig funktioniert.
Ich habe einmal Folgendes versucht:
Delphi-Quellcode:
with Tinifile.Create('VS.Ini')
do begin
try
s1 := ReadString( 'ZZZ', 'x1', '''' );
s2 := ReadString( 'ZZZ', 'x2', '""' );
Edit1.Text := s1;
Edit2.Text := s2;
RxSpinEdit1.Value := Length(s1);
RxSpinEdit2.Value := Length(s2);
finally
Free;
end;
end;
Auch dabei habe ich einen leeren String (auch Length(s1) = 0) erhalten.
Die anderen Vorschläge - z.B. TMemIniFile - dürften aus den gleichen Gründen nicht helfen. Ich schlage statt dessen folgende Änderungen vor:
1. Definiere eine globale Konstante:
const scIniHochkommata = 'aB1rA2kA3dA4bR5a'; // oder ähnlichen Schrott
2. Ersetze in den Ini-Dateien alle Einträge durch diesen Wert; das geht mit Suchen + Ersetzen.
3. Ersetze überall dort, wo Du die Prüfung auf Hochkommata benötigst, dies durch diese Konstante. Auch dabei hilft Delphi mit "Suchen in Dateien".
Das ist zwar immer noch umständlich (abhängig von der Anzahl der Units/Prüfungen), dürfte aber Deinen Vorstellungen am ehesten entsprechen.
Jürgen