Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Вниз

Запись 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.046 c
15-1190329171
Bogdan1024
2007-09-21 02:59
2007.10.21
Помогите рассчитать мощность UPS


2-1190800881
Yogan
2007-09-26 14:01
2007.10.21
mssql


2-1190282755
Tifon
2007-09-20 14:05
2007.10.21
Отображение немецких умляутов


2-1190627331
АндрейК
2007-09-24 13:48
2007.10.21
множественный выбор в DBGrid


15-1190195376
Beastie Boys
2007-09-19 13:49
2007.10.21
у дизайнеров хорошая фантазия?





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