【问题标题】:Save TList of objects in text file在文本文件中保存对象列表
【发布时间】:2011-01-16 18:27:44
【问题描述】:

我有以下课程:

type
  TSong = class(TObject)
  private
    FArtist: String;
    FTitle: String;
    procedure SetArtist(Artist: String);
    procedure SetTitle(Title: String);
  public
    property Artist: String read FArtist Write SetArtist;
    property Title: String read FTitle Write SetTitle;
    constructor Create(Artist, Title: String);
  end;
type
  TPlaylist = class(TList)
    private
      procedure ShowInListBox(Box: Pointer);
    public
      { Public-Deklarationen }
    end;

在运行时,我创建这些类的实例:

Playlist := TPlaylist.Create;
Playlist.Add(TSong.Create('Artist 1', 'Title 1'));
Playlist.Add(TSong.Create('Artist 2', 'Title 2'));
Playlist.Add(TSong.Create('Artist 3', 'Title 3'));
Playlist.Add(TSong.Create('Artist 4', 'Title 4'));

当程序关闭时,我想将这些数据保存到一个文本文件中。我该怎么做?

最好的方法可能是创建一个属于 TPlaylist 类的过程,对吧?

procedure SaveToTxtFile(fName: String);

这样的函数究竟应该做什么?当程序再次启动时,我希望能够再次构建播放列表。

如果将数据保存在这样的文本文件中,那就太好了:

Artist 1///Title 1
Artist 2///Title 2

【问题讨论】:

    标签: delphi file class list save


    【解决方案1】:

    你在正确的轨道上。您正在尝试做的是称为序列化,将对象转换为像文件一样的可流式形式。

    您需要开发一种格式。确切的格式无关紧要,只要它是一致的并保留重建对象所需的所有数据。你说你想要一个文本文件,所以在这种情况下你可以通过使用内置文件 IO 的 TStringList 采取一些捷径。

    试试这样的:

    procedure TSong.Serialize(serializer: TStringList);
    begin
      serializer.Add(format('%s///%s: %s', [Artist, Title, Filename])); //add a filename member! You need one!
    end;
    
    procedure TPlaylist.Serialize(const filename: string);
    var
      serializer: TStringList;
      i: integer;
    begin
      serializer := TStringList.Create;
      try
        for i := 0 to Count - 1 do
          TSong(self[i]).Serialize(serializer);
        serializer.SaveToFile(filename);
      finally
        serializer.Free;
      end;
    end;
    

    您还需要实现反向反序列化。应该不会太难。

    【讨论】:

    • 你也可以谷歌“delphi 序列化”来获取一些基于 RTTI 的选项。另见stackoverflow.com/questions/73895/…
    • 是的,这对于一般情况肯定更有用。但是对于这么简单的事情,使用 RTTI 可能是大材小用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多