Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Packed Record to MemoryStream


ДенисПФ ©   (2012-11-25 11:13:00) 

type
aData = Packed Record
   aStr:   Array Of String;
   aInt:   Array Of Integer;
 End;


procedure TForm1.Button1Click(Sender: TObject);
var
 rec:  aData;
 Ms1:TMemoryStream32;
begin
SetLength( rec.aStr, 2 );
SetLength( rec.aInt, 2 );
rec.aStr[0]:='stroka1';
rec.aStr[1]:='stroka2';
rec.aInt[0]:=2222222;
rec.aInt[1]:=333333;

Ms1:= TMemoryStream32.Create;
end;


КАК rec  ЗАПИСАТЬ В Ms1 ?


Slym   (2012-11-27 10:49:00) [1]

type
 TData = Packed Record
   aStr:String[255];
   aInt:Integer;
 end;
 PDataArray=^TDataArray;
 TDataArray=array[0..1023] of TData;
procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
rec:  TData;
Ms1:TMemoryStream;
begin
 //запись
 Ms1:= TMemoryStream.Create;
 for i:=0 to 10 do
 begin
   rec.aStr:='stroka' + IntToStr(i);
   rec.aInt:=i;
   Ms1.WriteBuffer(rec,SizeOf(rec));
 end;
 //чтение
 Ms1.Position:=0;
 while Ms1.Read(rec,SizeOf(rec))=SizeOf(rec) do
 begin
   Application.MessageBox(PChar(string(rec.aStr)),PChar(IntToStr(rec.aInt)),0)
 end;
 Ms1.Free;
end;


Медвежонок Пятачок   (2012-11-25 18:49:00) [2]

здесь и рекорд не в тему


QAZ9   (2012-11-25 16:32:00) [3]

Packed тут также вообще невтему


DVM   (2012-11-25 15:09:00) [4]


> type
> aData = Packed Record
>    aStr:   Array Of String;
>    aInt:   Array Of Integer;
>  End;

чтобы эту структуру сохранить в поток, требуется как минимум сохранять сначала количество элементов в каждом массиве, потом длину каждого элемента (для строки), потом символы строки. Иначе обратно не десериализуешь.


MBo   (2012-11-25 12:47:00) [5]

Поправка:
тело строки -начиная с AStr[i][ 1], размер Length * SizeOf(Char)


MBo   (2012-11-25 12:46:00) [6]

Для каждой записи нужно писать в поток:

длину первого массива
для каждой его строчки:
  длину строки
  тело строки -начиная с AStr[i][0], размер Length * SizeOf(Char)
длину второго массива
его тело  - начиная с AInt[0]


ДенисПФ   (2012-11-25 11:52:00) [7]

а с помощью  CopyMemory
как в Ms1 ?


ДенисПФ   (2012-11-25 11:39:00) [8]

MemoryStream.Write(rec, SizeOf(aData));
такое не прокатит в данном случае.


p   (2012-11-25 11:35:00) [9]


> p ©   (25.11.12 11:33) [4]
> MemoryStream.Write(rec, SizeOf(aData));


Плохо вкурил

CopyMemory


p   (2012-11-25 11:33:00) [10]

MemoryStream.Write(rec, SizeOf(aData));


ДенисПФ   (2012-11-25 11:21:00) [11]

Да, размер строки нужно было указать, извиняюсь.
Но как потом rec  ЗАПИСАТЬ В Ms1 ?


ДенисПФ   (2012-11-25 11:21:00) [12]

Да, размер строки нужно было указать, извиняюсь.
Но как потом rec  ЗАПИСАТЬ В Ms1 ?


antonn   (2012-11-25 11:16:00) [13]

если возможно, то указать конкретную (максимальную) длину string

> aData = Packed Record
>    aStr:   Array Of String[8];
>    aInt:   Array Of Integer;
>  End;


но, возможно, ошибаюсь


Наверх

Титульная страница Поиск, карта сайта Написать письмо