Начал разбираться с персистентностью. В ходе изучения столкнулся с проблемой сохранения /загрузки TObjectList'а (каждая запись является TPersistent-классом). Записывает в файл вроде бы как надо, а вот с чтение как мне кажется что-то намудрил не то. Вот собственно код:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, contnrs, StdCtrls;
type TMyItem = class(TPersistent) private FField1: string; FField2: Integer; published property Field1: string read FField1 write FField1; property Field2: Integer read FField2 write FField2; end;
TWriter_ = class(TWriter); TReader_ = class(TReader);
TForm1 = class(TForm) btn_Save: TButton; btn_load: TButton; btn_ToListBox: TButton; ListBox1: TListBox;
procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btn_SaveClick(Sender: TObject); procedure btn_loadClick(Sender: TObject); procedure btn_ToListBoxClick(Sender: TObject); private { Private declarations } FMyList: TObjectList; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn_loadClick(Sender: TObject); var S: TStream; i: Integer; R: TReader_; Item: TMyItem; begin S := TFileStream.Create('test.txt', fmOpenRead); try R := TReader_.Create(S, S.Size); try while S.Position < S.Size do begin Item := TMyItem.Create; R.ReadProperty(Item); FMyList.Add(Item); end; finally R.Free; end; finally S.Free; end; end;
procedure TForm1.btn_SaveClick(Sender: TObject); var S: TStream; i: Integer; W: TWriter_; begin S := TFileStream.Create('test.txt', fmCreate); try W := TWriter_.Create(S, $FF); try for i := 0 to FMyList.Count - 1 do W.WriteProperties(TMyItem(FMyList[i])); finally W.Free; end; finally S.Free; end; end;
procedure TForm1.btn_ToListBoxClick(Sender: TObject); var i: Integer; begin listBox1.Clear; for i := 0 to FMyList.Count - 1 do listBox1.Items.Add(TMyItem(FMyList[i]).FField1 + ';' + IntToStr(TMyItem(FMyList[i]).Field2)); end;
procedure TForm1.FormCreate(Sender: TObject); var Item: TMyItem; begin FMyList := TObjectList.Create;
Item := TMyItem.Create; Item.FField1 := 'abc'; Item.FField2 := 123;
FMyList.Add(Item);
Item := TMyItem.Create; Item.FField1 := 'def'; Item.FField2 := 456;
FMyList.Add(Item);
end;
procedure TForm1.FormDestroy(Sender: TObject); begin FMyList.Free; end;
end.
|
|