
28.04.2008, 19:51
|
Модератор
|
|
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
|
|
Цитата:
Сообщение от KOOL
1 способ не подходит...а вот второй как раз да. Тока как потоки юзать?
|
Код:
procedure SaveToFile(AData : MyFile);
var
Stream : TFileStream;
StrLen : Integer;
SLStr : String;
begin
Stream := TFileStream.Create('MyFile.dat',fmCreate);
Try
Stream.WriteBuffer(AData.val1,SizeOf(Integer));
StrLen := Length(AData.va2);
Stream.WriteBuffer(StrLen,SizeOf(Integer));
Stream.WriteBuffer(AData.val2[1],StrLen);
SLStr := AData.StrList.Text;
StrLen := Length(SLStr);
Stream.WriteBuffer(StrLen,SizeOf(Integer));
Stream.WriteBuffer(SLStr[1],StrLen);
Finally
Stream.Free;
End;
end;
procedure LoadFromFile(var AData : MyData); // запись должна быть создана, в т.ч. и StringList в ней.
var
Stream : TFileStream;
StrLen : Integer;
SLStr : String;
begin
Stream := TFileStream.Create('MyFile.dat',fmRead);
Try
Stream.ReadBuffer(AData.val1,SizeOf(Integer));
Stream.ReadBuffer(StrLen,SizeOf(Integer));
Stream.ReadBuffer(AData.val2[1],StrLen);
Stream.ReadBuffer(StrLen,SizeOf(Integer));
SetLength(SLStr,StrLen);
Stream.ReadBuffer(SLStr[1],StrLen);
AData.Text := SLStr;
Finally
Stream.Free;
End;
end;
Фокус тут только в одном - перед записью строки мы пишем в поток ее реальную длинну. При обратном чтении сначала читаем длинну и для SNSI строк выделяем память под данные (SetLength). Это связанно с тем, что мы не можем ограничить, например, StringList при вызове его метода LoadFromStream каким-либо кол-вом вычитываемой информации. Вот и приходится таким маневром обходить это ограничение. Впрочем, с PASCAL-строками фактически таже история. Нам надо знать сколько актуальная длина для операций сохранения/чтения в/из потока.
|