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

Использование массивов в пользовательском классе в Delphi: сохранение и загрузка данных

Delphi , Синтаксис , Массивы

При работе с компонентами в 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




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


:: Главная :: Массивы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:38:17/0.0013768672943115/0