Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа со списком `TObjectList` и `TFileStream` в Delphi: сохранение и загрузка объектов

Delphi , Компоненты и Классы , Классы

Работа со списком TObjectList и TFileStream в Delphi: сохранение и загрузка объектов

При работе с компонентами в Delphi, разработчики часто сталкиваются с необходимостью сохранения состояния объектов в файл для последующей загрузки. В данной статье мы рассмотрим, как можно использовать компоненты TObjectList и TFileStream для сохранения и загрузки списка объектов на основе TComponent.

Проблема сохранения объекта в файл

Разработчик столкнулся с проблемой при попытке сохранить объекты из TObjectList в файл. После сохранения, файл создавался, но его размер не изменялся при изменении данных в объектах, и при попытке загрузки данные восстанавливались как nil. Проблемой оказалась неправильная публикация свойства, которое нужно было сохранить.

Контекст задачи

В примере кода представлен пользовательский класс TNewObject, который наследуется от TComponent. В классе определено свойство BizName для хранения строки. Для сохранения списка объектов класса TNewObject используется TObjectList, а для работы с файлом - TFileStream.

type
  TNewObject = class(TComponent)
  private
    FName: String;
  public
    property BizName: String read FName write FName;
    constructor Create(const AName: String);
    destructor Destroy; override;
  end;

var
  Form1: TForm1;
  List: TObjectList<TNewObject>;

Сохранение объекта в файл

Для сохранения объектов используется метод WriteComponent класса TFileStream. Важно помнить, что сохраняются только опубликованные свойства объекта.

procedure TForm1.SaveButtonClick(Sender: TObject);
var
  i: Integer;
  fs: TFileStream;
begin
  if SaveDialog1.Execute then
  begin
    fs := TFileStream.Create(SaveDialog1.FileName, fmCreate);
    try
      for i := 0 to List.Count - 1 do
        fs.WriteComponent(List[i]);
    finally
      fs.Free;
    end;
  end;
end;

Решение проблемы

Проблема была связана с тем, что свойство BizName не было опубликовано для потоковой передачи. Для решения проблемы необходимо опубликовать свойство BizName, переопределив методы ReadName и WriteName, и вызвав метод DefineProperty из класса TFiler.

type
  TNewObject = class(TComponent)
  private
    FName: String;
    procedure ReadName(Reader: TReader);
    procedure WriteName(Writer: TWriter);
  protected
    procedure DefineProperties(Filer: TFiler); override;
  public
    property BizName: String read FName write FName;
    // ...
  end;

procedure TNewObject.ReadName(Reader: TReader);
begin
  FName := Reader.ReadString;
end;

procedure TNewObject.WriteName(Writer: TWriter);
begin
  Writer.WriteString(FName);
end;

procedure TNewObject.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineProperty('BizName', ReadName, WriteName, FName <> '');
end;

Альтернативный способ определения свойств

Также можно использовать альтернативный способ определения свойств, переопределив метод DefineProperties непосредственно для нужных свойств.

Загрузка объектов из файла

Для загрузки объектов используется метод ReadComponent класса TFileStream. Важно сначала очистить список объектов, чтобы избежать утечек памяти.

procedure TForm1.LoadButtonClick(Sender: TObject);
var
  i: Integer;
  fs: TFileStream;
  vRecord: TNewObject;
begin
  if OpenDialog1.Execute then
  begin
    List.Clear;
    fs := TFileStream.Create(OpenDialog1.FileName, fmopenRead);
    try
      while not fs.Eof do
      begin
        vRecord := TNewObject(fs.ReadComponent(nil));
        List.Add(vRecord);
      end;
    finally
      fs.Free;
    end;
  end;
end;

Заключение

При работе с потоковой передачей компонентов в Delphi важно помнить о публикации свойств для сохранения и загрузки. В данной статье мы рассмотрели примеры кода, которые помогут правильно настроить потоковую передачу для списка объектов TObjectList. Используя предложенные методы, разработчики смогут эффективно сохранять и загружать объекты в файл, обеспечивая тем самым сохранность их состояния.

Создано по материалам из источника по ссылке.

Разработчик в Delphi использует `TObjectList` и `TFileStream` для сохранения и загрузки объектов, столкнувшись с проблемой неправильной публикации свойства при сохранении объекта.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:54:03/0.0050058364868164/1