Сохранить TList объектов в текстовом файле - PullRequest
4 голосов
/ 14 февраля 2010

У меня есть следующие классы:

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

1 Ответ

7 голосов
/ 14 февраля 2010

Вы на правильном пути. То, что вы пытаетесь сделать, называется сериализация , превращая объект в потоковую форму, такую ​​как файл.

Вам необходимо разработать формат. Точный формат не имеет значения, если он согласован и сохраняет все данные, необходимые для реконструкции объекта. Вы говорите, что вам нужен текстовый файл, поэтому в этом случае вы можете воспользоваться небольшим ярлыком, используя 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;

Вы также захотите реализовать обратную десериализацию. Это не должно быть слишком сложно.

...