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

Как удалить одно значение из динамического массива

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



Автор: http://www.swissdelphicenter.ch

type
  TArrayString = array of string;

procedure DeleteArrayIndex(var X: TArrayString; Index: Integer);
begin
  if Index > High(X) then
    Exit;
  if Index < Low(X) then
    Exit;
  if Index = High(X) then
  begin
    SetLength(X, Length(X) - 1);
    Exit;
  end;
  Finalize(X[Index]);
  System.Move(X[Index + 1], X[Index],
    (Length(X) - Index - 1) * SizeOf(string) + 1);
  SetLength(X, Length(X) - 1);
end;

// Example : Delete the second item from array a
// Beispiel : Losche das 2. Element vom array a

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TArrayString;
begin
  DeleteArrayIndex(a, 2);
end;

Перевод текста на русский язык:

В предоставленном коде Delphi предназначен для удаления элемента из динамического массива строк (TArrayString). Вот разбивка кода:

type
  TArrayString = array of string;

Эта строка объявляет тип alias для массива строк, который будет использоваться в течение всего кода.

procedure DeleteArrayIndex(var X: TArrayString; Index: Integer);
begin
  if Index > High(X) then
    Exit;
  if Index < Low(X) then
    Exit;
  if Index = High(X) then
  begin
    SetLength(X, Length(X) - 1);
    Exit;
  end;

  Finalize(X[Index]);
  System.Move(X[Index + 1], X[Index],
      (Length(X) - Index - 1) * SizeOf(string) + 1);
  SetLength(X, Length(X) - 1);
end;

Процедура принимает динамический массив строк (X) и индекс как параметры. Она проверяет, является ли заданный индекс валидным, сравнивая его с High(X) (самый высокий валидный индекс) и Low(X) (самый низкий валидный индекс). Если индекс выходит за пределы диапазона, она выходит из процедуры.

Если индекс не находится на конце массива (Index = High(X)), она finalize-ит элемент на этом индексе, перемещает все элементы после удаленного элемента, чтобы заполнить образовавшийся пробел, и затем устанавливает длину массива в один меньше его текущего значения. Это эффективно удаляет элемент на заданном индексе.

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TArrayString;
begin
  DeleteArrayIndex(a, 2);
end;

В этом примере обработчик события кнопки Button2Click для формы пытается удалить второй элемент из массива a. Однако есть два проблемы с этим кодом:

  1. Массив a объявлен, но не инициализирован.
  2. Процедура DeleteArrayIndex модифицирует свой входной параметр, изменяя длину массива и потенциально освобождая память. Это проблема, потому что вызывающий код не ожидает этих изменений.

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

Вот альтернативное решение:

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TArrayString;
begin
  SetLength(a, 3); // Инициализируем массив с тремя элементами
  a[0] := 'Element1';
  a[1] := 'Element2';
  a[2] := 'Element3';

  DeleteArrayIndex(a, 1);
end;

procedure TForm1.DeleteArrayIndex(var X: TArrayString; Index: Integer);
var
  i: Integer;
begin
  for i := Index to High(X) - 1 do
  begin
    X[i] := X[i + 1];
  end;

  SetLength(X, Length(X) - 1);
end;

В этом измененном коде обработчик события кнопки Button2Click инициализирует массив и затем вызывает процедуру DeleteArrayIndex, чтобы удалить второй элемент. Процедура DeleteArrayIndex iterates through the remaining elements and moves them down one position to fill the gap created by removing the specified index. Finally, it sets the length of the array to be one less than its current value.

Это измененный код не модифицирует оригинальный массив в месте, а вместо этого создает новый массив с желаемыми содержимым.

В статье описывается алгоритм удаления элемента из динамического массива в языке Delphi, который использует процедуру SetLength для изменения размера массива и перемещает значения элементов после удаленного элемента.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-01 23:51:31/0.003911018371582/0