Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.16;
Скачать: CL | DM;

Вниз

Динамический массив, запись, файл   Найти похожие ветки 

 
asusfi   (2003-06-03 11:25) [0]

Ребята, подскажите, пожалуйста, почему выпадает ошибка в строке выделенной жирным курсивом, когда я загружаю данные из файла сразу после запуска программы (файл "D:\File" уже существует и был до этого создан в процедуре SaveToFile). Если же я сначала запишу данные в файл, а потом не закрывая программу прочитаю их из файла, то все ОК. Подскажит, что я есть делать не так?

type
TRec1 = record
Field11 : String[10];
Field12 : Integer;
end;


TRec2 = record
Field21 : String[10];
FieldRec1 : array of TRec1;
end;

TPRec2=^TRec2;
var
Form1 : TForm1;
RecList : TList;
implementation

{$R *.DFM}

procedure LoadFromFile;
var hFile : Integer;
PRec2 : TPRec2;
Rec2 : TRec2;
begin
RecList:=TList.Create;
SetLength(Rec2.FieldRec1,0);
hFile:=FileOpen("D:\File",fmOpenReadWrite);
While FileRead(hFile,Rec2,SizeOf(Rec2)) > 0 Do
Begin
New(PRec2);
PRec2^:=Rec2;
RecList.Add(PRec2);
End;
FileClose(hFile);
end;

procedure SaveToFile;
varhFile : Integer;
PRec2 : TPRec2;
Rec2 : TRec2;
i : Integer;
begin
RecList:=TList.Create;
// Создаем, скажем, 2 записи и добавляем в список
// Первая запись
Rec2.Field21:="Name1";
SetLength(Rec2.FieldRec1,2);
Rec2.FieldRec1[0].Field11:="йййййййй";
Rec2.FieldRec1[0].Field12:=1;
Rec2.FieldRec1[1].Field11:="аааааааааа";
Rec2.FieldRec1[1].Field12:=2;
// Добавляем в список
New(PRec2);
PRec2^:=Rec2;
RecList.Add(PRec2);
// Втрая запись
Rec2.Field21:="Name2";
SetLength(Rec2.FieldRec1,1);
Rec2.FieldRec1[0].Field11:="ччччччч";
Rec2.FieldRec1[0].Field12:=2;
// Добавляем в список
New(PRec2);
PRec2^:=Rec2;
RecList.Add(PRec2);

SetLength(Rec2.FieldRec1,0);

hFile:=FileCreate("D:\File");
for i:=0 To RecList.Count-1 Do
begin
PRec2:=RecList.Items[i];
Rec2:=PRec2^;
FileWrite(hFile,Rec2,SizeOf(Rec2));
end;
FileClose(hFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SaveToFile;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
LoadFromFile;
end;


 
asusfi   (2003-06-03 11:34) [1]

Забыл добавить после сохранения в файл уничтожение списка.
Ксате теперь не работает и во втором случае.
А вообще такое реально осуществить

if not(RecList=nil) then
begin
if RecList.Count>0 then
For i:=0 to RecList.Count-1 do
begin
PRec2:=RecList.Items[i];
Dispose(PRec2);
end;
RecList.Free;
end;


 
Palladin ©   (2003-06-03 11:36) [2]

переменная динамического массива является указателем, какой смысл сохранять в файл указатели?


 
asusfi   (2003-06-03 11:49) [3]

Хорошо, и как тогда поступить


 
Palladin ©   (2003-06-03 11:53) [4]

ну как как, вывод сам собой напрашивается, мухи отдельно котлеты отдельно...

сохраняешь сначала основные переменные из записи, потом пишеш количество элементов массива
I:=high(Rec2.FieldRec1)+1;
FileWrite(hFile,i,sizeof(i));
а потом в цикле по отдельности сохраняешь каждый элемент
for i:=0 to high(rec2.fieldrec1) do
FileWrite(hFile,rec2.fieldrec1[i],sizeof(trec1));

читаешь точно также: сначала размер
FileRead(hFile,I,sizeof(i));
setlength(Rec2.FileRec1,i);
потом данные
for i:=0 to high(rec2.fieldrec1) do
FileRead(hFile,rec2.fieldrec1[i],sizeof(trec1));


 
asusfi   (2003-06-03 12:02) [5]

Понятно, спасибо за совет, в принципе я так думал, но правда только думал, а не пробовал, Ща попробуем.



Страницы: 1 вся ветка

Текущий архив: 2003.06.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
1-50315
Evg12
2003-06-02 12:39
2003.06.16
Пересылка бита из одной переменной в другую


14-50487
Kostik
2003-05-30 00:27
2003.06.16
Помогите найти инфу по B, B+, B* деревьям.


3-50240
DBDev
2003-05-26 17:18
2003.06.16
Как организовать графический эффект на базе значения в TDBGrid?


7-50546
Dabadabiabo
2003-04-11 11:24
2003.06.16
Убрать прогу с Трэя и ТаскБара при запуске


3-50221
VISUALMAN
2003-05-26 13:58
2003.06.16
DBGrid / Table суммирование столбца