Top.Mail.Ru
Ответы

Подскажите по делфи, TMemoryStream не могу считать массив...

Массив имеет такой тип:
type MyCategory= record
Category:string;
Blob:TMemoryStream; //Тут картинка
TypeBlob:string;
end;

Не буду показывать код заполнения массива, ибо он заполняется правильно, и картинка в поле blob выводится корректно на image из массива...
Делаю так:
var otpr:TMemoryStream;
begin
otpr:= TMemoryStream.Create;
otpr.Position := 0;
otpr.Write(MassCategory, Length(MassCategory));

SetLength(MassCategory,0);
SetLength(MassCategory, otpr.Size);
otpr.Position := 0;
otpr.Read(MassCategory,otpr.Size) ;
end;
Не может считать массив... Помогите.. Не знаю что делать. Спасибо!!!!

Дополнен

Ошибку выдаёт при чтении из массив...
Пробовал в конце кода написать так:
label1.caption:=MassCategory[0].Category, нет выдаёт ошибку, не может корректно считать...
:

По дате
По рейтингу
Аватар пользователя
Мудрец
9лет

Вы пишете откровенную ересь. Для Delphi имеется шаблонный механизм сериализации (запись/чтение в наследников TStream). Он подробно описан в Королевстве Delphi.

Но если вам нужно сериализовать именно массив записей, то опишите 2 процедуры - запись и чтение из потока (SaveToStream(массив, поток) и LoadFromStream(var массив, поток)).

Что они будут делать:
SaveToStream - очень простая процедура, только надо предварительно записывать размер элементов
1. запись количества элементов массива WriteBuffer(Length(arr))
2. для каждого элемента:
-- 2.1 запись длины Category + запись содержимого Category WriteBuffer(Length(Category)); WriteBuffer(PChar(Category)^,Length(Category))
-- 2.2 запись длины Блоба + содержимого Блоба WriteBuffer(Blob.Size); CopyFrom(Blob, Blob.Size);
-- 2.3 см. 2.1 только для TypeBlob

С LoadFromStream всё сложнее, так как надо зачистить имеющийся массив. Набросаю (без try - блока):
procedure LFS(var arr: array of MyCategory, str: TStream);
var i, s: Integer;
begin
for i := 0 to Length(arr)-1 do arr[i].blob.Free;
SetLength(arr, 0); // зачистка завершена
str.ReadBuffer(s, SizeOf(s)); // длина массива
SetLength(arr, s);
for i := 0 to s-1 do begin // каждая запись в своём цикле
str.ReadBuffer(s, SizeOf(s));
SetLength(arr[i].Category, s); // размер строки считан и установлен
str.ReadBuffer(PChar(arr[i].Category)^, s); // собственно загрузка строки
str.ReadBuffer(s, SizeOf(s));
arr[i].Blob := TMemoryStream.Create;
arr[i].Blob.SetSize(s); // размер потока считан и установлен
str.ReadBuffer(arr[i].Blob.Memory^, s); // заполнение arr[i].Blob данными, или тупо CopyFrom
// строка TypeBlob заполняется так же как и Category
end;
end;