Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Персистентность. Сохранение


Автор: NieL 20.5.2009, 14:35
Начал разбираться с персистентностью. В ходе изучения столкнулся с проблемой сохранения /загрузки 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.


Автор: former 20.5.2009, 15:22
Вот http://forum.vingrad.ru/topic-94245.html почитай.

Автор: CodeMonkey 20.5.2009, 15:33
Возможно, вас заинтересует http://delphikingdom.ru/asp/viewitem.asp?catalogid=1379 и http://dl.getdropbox.com/u/201788/Projects/PersistentDemo.zip.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)