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

Вниз

Запись TList в файл   Найти похожие ветки 

 
mfender ©   (2007-09-27 20:59) [0]

Здравствуйте.
Делаю незатейливую конструкцию и подумываю, как бы её записать в файл:


   FNRRecords: TList;

{ это запись, из которых состоит FNRRecords }
 TNRRec = ^PNRRec;
 PNRRec = record
   Category: Integer;
   Arts: TStrings;
 end;


Есть ли простой способ сохранить FNRRecords в файл? Ну и считать содержимое файла в FNRRecords


 
Джо ©   (2007-09-27 21:16) [1]

Вот примерно так, процудуры чтения/записи PNRRec в поток:

procedure SaveRecToStream (AStream: TStream; ARec: TPNRRec);
var
 Text: string;
 Ln: Integer;
begin
 AStream.Write(ARec.Category,SizeOf(ARec.Category));
 Text := ARec.Arts.Text;
 // запишем сначала длину строки, а затем саму строку
 Ln := Length(Text);
 AStream.Write(Ln,SizeOf(Ln));
 AStream.Write(Text[1],Ln)
end;

procedure LoadRecFromStream (AStream: TStream; var ARec: TPNRRec);
var
 Text: string;
 Ln: Integer;
begin
 AStream.Read (ARec.Category,SizeOf(ARec.Category));
 // Прочтем сначала длину строки
 AStream.Read(Ln,SizeOf(Ln));
 // Установим размер
 SetLength(Text,Ln);
 // И прочтем само тело строки
 AStream.Read(Text[1],Ln);
 ARec.Arts.Text := Text;
end;

Это, конечно, первое приближение. Зачастую удобней сделать PNRRec классом, а вышеприведенные процедуры — его методами.

В файл, таким образом, писать можно так:

var
 Rec: TPNRRec;
 Fs: TFileStream;
begin
 ...
 Fs := TFileStream.Create("d:\rec.dat",fmCreateNew);
 try
   SaveRecToStream(Fs,Rec);
 finally
   Fs.Free
 end;
end;


Читать:

var
 Rec: TPNRRec;
 Fs: TFileStream;
begin
 ...
 Fs := TFileStream.Create("d:\rec.dat",fmOpenRead);
 try
   LoadRecToStream(Fs,Rec);
 finally
   Fs.Free
 end;
end;


Для нескольких экземпляров записей поступаешь по схеме: открыл поток - записал/прочитал поочередно все элементы - закрыл поток.

В таком духе.


 
mfender ©   (2007-09-27 21:29) [2]

В том-то и дело, что их может быть (и есть) неограниченно много.

Вобщем, решил пойти путём XML:


procedure TNR.SaveToFile;
var
 I, N: Integer;
 Doc: TXMLDocument;
 R, C, A: IXMLNode;
begin
 try
   Doc := TXMLDocument.Create(FFileName);
   Doc.Version := "1.0";
   R := Doc.AddChild("root");
   if FNRRecords.Count > 0 then
   begin
     for I := 0 to FNRRecords.Count - 1 do
     begin
       C := R.AddChild("category");
       C.NodeValue := TNRRec(FNRRecords[i]).Category;
       if TNRRec(FNRRecords[I]).Arts.Count > 0 then
       begin
         for N := 0 to TNRRec(FNRRecords[I]).Arts.Count - 1 do
         begin
           A := C.AddChild("art");
           A.NodeValue := TNRRec(FNRRecords[N]).Arts[N];
         end;
       end;
     end;
   end;
   Doc.SaveToFile(FFileName);
 except

 end;
end;


Щас посморю, какие будуть ошибки ))))

Ну, считывать тем же путём.


 
mfender ©   (2007-09-27 22:36) [3]

Ошибки были. Теперь всё правильно:


procedure TNR.SaveToFile;
var
 I, N: Integer;
 Doc: TXMLDocument;
 R, C, A: IXMLNode;
begin
 try
   Doc := TXMLDocument.Create(FOwner);
   Doc.Active := True;
   Doc.Version := "1.0";
   R := Doc.AddChild("root");
   if FNRRecords.Count > 0 then
   begin
     for I := 0 to FNRRecords.Count - 1 do
     begin
       C := R.AddChild("category");
       C.SetAttribute("oid", TNRRec(FNRRecords[i]).Category);
       if TNRRec(FNRRecords[I]).Arts.Count > 0 then
       begin
         for N := 0 to TNRRec(FNRRecords[I]).Arts.Count - 1 do
         begin
           A := C.AddChild("art");
           A.NodeValue := TNRRec(FNRRecords[I]).Arts[N];
         end;
       end;
     end;
   end;
   Doc.SaveToFile(FFileName);
 except

 end;
end;


 
Джо ©   (2007-09-27 22:47) [4]

> [2] mfender ©   (27.09.07 21:29)
> В том-то и дело, что их может быть (и есть) неограниченно
> много.

for I := 0 to List.Count-1 do


 
Джо ©   (2007-09-28 00:37) [5]

Хотя, конечно, если «неограниченно много», то тут даже Аллах бессилен.


 
Германн ©   (2007-09-28 01:33) [6]


> Делаю незатейливую конструкцию


>  TNRRec = ^PNRRec;
>  PNRRec = record

И это ты называешь "незатейливой конструкцией"? Всё "с ног на голову" :-)



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

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

Наверх




Память: 0.48 MB
Время: 0.022 c
1-1186549318
lecavalie
2007-08-08 09:01
2007.10.21
Подскажите плз. Delphi + Web/wap интерфейс


15-1190136328
Kolan
2007-09-18 21:25
2007.10.21
DMClient RC1


2-1190959443
click
2007-09-28 10:04
2007.10.21
autoSize по горизонтали у TEdit


2-1190891450
Yogan
2007-09-27 15:10
2007.10.21
Многопоточность


4-1177198354
nikitozz
2007-04-22 03:32
2007.10.21
Как завершить процесс.