Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];
ВнизДинамический массив, запись, файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c