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

Исправление ошибок копирования записей в Delphi: избегаем ссылки на динамические массивы

Delphi , Синтаксис , Записи и Множества

Для начала, давайте разберемся с проблемой, описанной пользователем. Вопрос касается работы со структурами в Delphi и их копированием. При создании двух экземпляров структуры TVersion и попытке изменить один из них, изменения отражаются на обоих экземплярах. Это происходит из-за того, что динамические массивы в Delphi работают по ссылкам, а не копируют данные.

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

Чтобы избежать такого поведения, необходимо сделать динамический массив приватным и предоставлять доступ к его элементам через свойства. При изменении элементов массива следует убедиться, что ссылка на него уникальна. Это достигается с помощью функции SetLength, которая гарантирует уникальность первого аргумента.

Пример кода

type
  TVersion = record
    private
      Values: array of Integer;
    public
      function Count: Integer;
      property Items[Index: Integer]: Integer read GetItem;
      procedure SetItems(Index: Integer; Value: Integer);
      class operator implicit(aVersion: TVersion): String;
      class operator implicit(aVersion: String): TVersion;
  end;

function TVersion.Count: Integer;
begin
  Result := Length(Values);
end;

property TVersion.Items[Index: Integer]: Integer read GetItem;
function TVersion.GetItem(Index: Integer): Integer;
begin
  if (Index < 0) or (Index >= Count) then
    raise Exception.Create('Invalid index');
  Result := Values[Index];
end;

procedure TVersion.SetItems(Index: Integer; Value: Integer);
begin
  if (Index < 0) or (Index >= Count) then
    raise Exception.Create('Invalid index');
  SetLength(Values, Index + 1); // Убедиться, что массив уникален
  Values[Index] := Value;
end;

class operator TVersion.implicit(aVersion: TVersion): String;
begin
  // Здесь код для преобразования записи в строку
end;

class operator TVersion.implicit(aVersion: String): TVersion;
begin
  // Здесь код для создания структуры из строки
end;

// Остальная часть кода...

Использование измененной структуры

var
  V1, V2: TVersion;
begin
  V1 := '1.2.3.4';
  SetLength(V2.Items, Length(V1.Items)); // Копируем количество элементов
  for var i := 0 to High(V1.Items) do
    V2.Items[i] := V1.Items[i]; // Копирование значений элементов
  ShowMessage(IntToStr(V1));
  ShowMessage(IntToStr(V2));
  V2.Items[2] := 8;
  ShowMessage(IntToStr(V1));
  ShowMessage(IntToStr(V2));
end;

При использовании приведенного выше подхода, изменение V2 не затронет V1, так как они будут иметь разные динамические массивы.

Заключение

Использование приватных полей и свойств для доступа к ним позволяет контролировать процесс копирования и избегать проблем с ссылками на динамические массивы в Delphi. Это ключевой момент для обеспечения независимости экземпляров структур.

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

Проблема связана с копированием структуры в Delphi, где при изменении одного экземпляра изменения отражаются на другом из-за того, что динамические массивы работают по ссылкам.


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

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




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


:: Главная :: Записи и Множества ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-02 09:21:12/0.0062861442565918/0