Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-50201
Инна
2003-05-21 02:00
2003.06.16
Базы данных и инет


1-50285
AbrosimovA
2003-06-04 14:27
2003.06.16
Помогите разобраться с типизиров. и нетипизир. файлами


14-50460
Mic_2000
2003-05-29 15:46
2003.06.16
Как из процедуры вызвать другую процедуру с параметрами в Ib6


1-50393
OlegM
2003-06-04 13:52
2003.06.16
1 PopupMenu и несколько компонентов


1-50270
OlegM
2003-06-03 09:05
2003.06.16
Устойчивая подсказка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский