Форум: "Прочее";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизСохранить/загрузить динамический массив Найти похожие ветки
← →
alex-drob © (2006-05-14 00:22) [0]Как сохранить, а потом загрузить массив в файл?
Пробую сохранить так:setlength(ar,5);
ar[0]:="str 1";
ar[1]:="str 2";
ar[2]:="str 3";
ar[3]:="str 4";
ar[4]:="str 5";
size:=length(ar)*sizeof(string);
ms:= TMemoryStream.Create;
ms.WriteBuffer(ar[0],size);
ms.SaveToFile("c:\1.txt");
ms.Free;
Вроде всё сохраняеться.
Загружаю так:setlength(ar,5);
ms:= TMemoryStream.Create;
ms.LoadFromFile("c:\1.txt");
ms.Read(ar[0],ms.Size);
memo1.Lines.Add(ar[0]);
memo1.Lines.Add(ar[1]);
memo1.Lines.Add(ar[2]);
memo1.Lines.Add(ar[3]);
memo1.Lines.Add(ar[4]);
ms.Free;
Выскакивает ошибка.
← →
Rial © (2006-05-14 00:55) [1]И что же это там сохраняется ?!
Дело в том, что String - это только указатель на распределенную в памяти строку, поэтому ты читаешь и записываешь на самом деле совсем не то,
что хотел.
Если не хочется многое менять, то вместо String используй ShortString или String[Len].
Но это глупо по многим причинам...
Лучше используй TStringList и его LoadFromFile,SaveToFile.
Вообще, динамические массивы - это зло :))
GetMem, FreeMem, AllocMem - форева !
← →
alex-drob © (2006-05-14 01:09) [2]Дело в том что String я написал к примеру. Мне нужно сохранять и загружать массив компонентов.
← →
DevilDevil © (2006-05-14 01:27) [3]ммм...
у TMemoryStream, так же как и у TFileStream есть метод типа WriteComponent. Попробуй, может получится...
← →
alex-drob © (2006-05-14 01:42) [4]Компильятор ругаеться что это массив а не компонент.
← →
Marser © (2006-05-14 02:10) [5]> [2] alex-drob © (14.05.06 01:09)
> Дело в том что String я написал к примеру. Мне нужно сохранять
> и загружать массив компонентов.
То же самое компонент. Размер того же TButton - 4 байта, что соответствует Pointer.
Можно использовать Tobject.InstanceSize, а можно [3]
> [4] alex-drob © (14.05.06 01:42)
> Компильятор ругаеться что это массив а не компонент.
Естественно. Так записать сразу весь масив не получится, только по компонентам.
← →
begin...end © (2006-05-14 08:40) [6]> Marser © (14.05.06 02:10) [5]
> Можно использовать Tobject.InstanceSize
А каким образом здесь можно его использовать, если не секрет?
← →
vidiv © (2006-05-14 10:01) [7]Вот пример
var Arr:array of string;
AStream:TMemoryStream;
ss,s,i:integer;
begin
SetLength(Arr, 5);
Arr[0] := "Line zero";
Arr[1] := "Line one";
Arr[2] := "Line two";
Arr[3] := "Line three";
Arr[4] := "Line four";
AStream := TMemoryStream.Create; // òóò ìîæåò áûòü ëþáîé Stream
s := Length(Arr);
AStream.WriteBuffer(s, SizeOf(s));
for i:=0 to pred(s) do begin
ss := length(Arr[i]);
AStream.WriteBuffer(ss, SizeOf(ss));
AStream.WriteBuffer(PChar(Arr[i])^, ss);
end;
//
AStream.Position := 0;
SetLength(Arr, 0);
AStream.ReadBuffer(s, SizeOf(s));
SetLength(Arr, s);
for i:=0 to pred(s) do begin
AStream.ReadBuffer(ss, SizeOf(ss));
SetLength(Arr[i], ss);
AStream.ReadBuffer(PChar(Arr[i])^, ss);
Memo1.Lines.Add(Arr[i]);
end;
end;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c