Текущий архив: 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.052 c