MyStringList.LoadFromStream(Str)
の代わりに使用しMyStringList.Text := PChar( Str.Memory)
ます。
まず、TStream
データは null で終了しませんがPChar
、この方法を使用するには null ターミネータが必要です (SetString()
文字列変数を使用してそれを回避できます)。
2 つ目は、D2009 以降、String
がから に変わり、がに変わりましUnicodeString
た。データは Unicode ではなく Ansi です (D2009+ でも、ストリーム データのエンコードにデフォルトで Ansi を使用するため)。そのため、データを にキャストすると、.AnsiString
PChar
PWideChar
PAnsiChar
TStream
SaveToStream()
TEncoding.Default
PWideChar
TStringList
すべてのバージョンで を使用する必要がありますがLoadFromStream()
、プロパティの設定に固執する場合は、次のText
ようにする必要があります。これはすべてのバージョンで機能します。
var
...
S: AnsiString;
begin
...
MyBackupStream.ReadBuffer(StrSz, SizeOf(Integer));
Str.SetSize(StrSz);
if StrSz > 0 then MyBackupStream.ReadBuffer(Str.Memory^, StrSz);
SetString(S, PAnsiChar(Str.Memory), StrSz);
MyStringList.Text := String(S);
...
end;
またはこれ:
var
...
S: AnsiString;
begin
...
MyBackupStream.ReadBuffer(StrSz, SizeOf(Integer));
if StrSz > 0 then begin
SetLength(S, StrSz);
MyBackupStream.ReadBuffer(S[1], StrSz);
end;
MyStringList.Text := String(S);
...
end;
またはこれ:
var
...
Str: TStringStream;
begin
...
Str := TStringStream.Create;
try
MyBackupStream.ReadBuffer(StrSz, SizeOf(Integer));
if StrSz > 0 then Str.CopyFrom(MyBackupStream, StrSz);
MyStringList.Text := Str.DataString;
finally
Str.Free;
end;
...
end;
最後に、将来の互換性をさらに高めるために、ストリーム データを Ansi ではなく UTF-8 を使用するように変更することを検討する必要があります。と の両方SaveToStream()
にD2009+LoadFromStream()
のオプションTEncoding
パラメータがあり、UTF-8 は可逆 Unicode エンコーディングですが、Ansi は Ansi/Unicode 変換中にデータを失う可能性があります。既存のデータが ASCII ( AnsiChar
#127 を超える文字がない) の場合、UTF-8 は ASCII と 100% 後方互換性があります。ただし、データが代わりに Ansi である場合 ( AnsiChar
#127 を超える文字が含まれる)、ストリーム形式を何らかの方法で変更 (ヘッダー/バージョンを追加するなど) して、古い形式と新しい形式を区別できるようにすることをお勧めします。 Ansi を使用して古い形式を保存し、Unicode/UTF-8 を使用して新しい形式を保存/読み込みます。