При работе с компонентами в Delphi, иногда возникает необходимость сохранения и загрузки данных, которые представлены в виде массивов. В частности, опубликованные свойства, которые представляют массивы, не могут быть сериализованы напрямую, так как Delphi не знает, как их обрабатывать. Вместо этого, можно использовать методы DefineProperties, которые позволяют определить пользовательские операции чтения и записи для таких свойств.
Пример использования DefineProperties для массива строк
Для сохранения и загрузки массива строк в пользовательском классе, можно определить методы ReadArray и WriteArray, которые будут использоваться в методе DefineProperties. Ниже приведен пример реализации такого класса:
unit UnitCustomClass;
interface
uses System.Classes, System.SysUtils;
type
TCustomClass = class(TComponent)
private
FStringArray: TArray<string>;
function GetItem(I: Integer): string;
procedure SetItem(I: Integer; Value: string);
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadArray(Reader: TReader);
procedure WriteArray(Writer: TWriter);
public
property Items[Index: Integer]: string read GetItem write SetItem;
end;
implementation
procedure TCustomClass.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty('ArrayData', ReadArray, WriteArray, True);
end;
procedure TCustomClass.ReadArray(Reader: TReader);
var
I: Integer;
begin
SetLength(FStringArray, Reader.ReadInteger);
for I := Low(FStringArray) to High(FStringArray) do
FStringArray[I] := Reader.ReadString;
end;
procedure TCustomClass.WriteArray(Writer: TWriter);
var
I: Integer;
begin
Writer.WriteInteger(Length(FStringArray));
for I := Low(FStringArray) to High(FStringArray) do
Writer.WriteString(FStringArray[I]);
end;
function TCustomClass.GetItem(I: Integer): string;
begin
if (I >= Low(FStringArray)) and (I <= High(FStringArray)) then
Result := FStringArray[I]
else
Result := '';
end;
procedure TCustomClass.SetItem(I: Integer; Value: string);
begin
if (I >= Low(FStringArray)) and (I <= High(FStringArray)) then
FStringArray[I] := Value;
end;
end.
Сохранение и загрузка данных через поток
Для сохранения состояния объекта в файл, можно использовать стандартные методы WriteComponent и ReadComponent, которые предназначены для сериализации компонентов:
procedure TCustomClass.SaveToStream(const Stream: TStream);
begin
Stream.WriteComponent(Self);
end;
procedure TCustomClass.LoadFromStream(const Stream: TStream);
begin
Stream.ReadComponent(Self);
end;
Заключение
Использование DefineProperties позволяет реализовать пользовательские операции чтения и записи для сложных типов данных, таких как массивы. Важно правильно определить методы ReadArray и WriteArray, а также обеспечить корректную обработку индексов массива. При необходимости, можно использовать стандартные методы WriteComponent и ReadComponent для упрощения процесса сериализации компонентов.
Пример реализации сохранения и загрузки данных массива строк в пользовательском классе Delphi с использованием методов `DefineProperties` для обеспечения сериализации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.