![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
но, возможно, ошибаюсь