Главная страница
    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.46 MB
Время: 0.006 c
14-50431
Lunik
2003-05-29 12:08
2003.06.16
Реестр


6-50412
anpv
2003-04-11 08:51
2003.06.16
!!! Быстрее чем NMFTP !!!


1-50308
McSimm2
2003-06-03 09:16
2003.06.16
Двустрочный итем в ComboBox


14-50514
alxx
2003-05-31 14:11
2003.06.16
Как соединить два офиса?


14-50452
sniknik
2003-05-29 17:52
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский