Главная страница
    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.46 MB
Время: 0.048 c
15-1190138260
Mozart
2007-09-18 21:57
2007.10.21
знатели Exchange!!! ПОМОГИТЕ!!!!


2-1190688191
Arkadiy
2007-09-25 06:43
2007.10.21
числа в строковом поле


15-1190196831
de.
2007-09-19 14:13
2007.10.21
FireBird


4-1177066904
..::KraN::..
2007-04-20 15:01
2007.10.21
Открыть с помощью...


10-1138718085
BiN
2006-01-31 17:34
2007.10.21
Некорректная передача строкового параметра при работе с Excel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский