Показать сообщение отдельно
  #6  
Старый 28.04.2008, 19:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 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-строками фактически таже история. Нам надо знать сколько актуальная длина для операций сохранения/чтения в/из потока.
Ответить с цитированием