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