Удаление и добавление значений динамического массива

Материал из DRKB

Удаление и добавление значений динамического массива[править | править код]

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;


Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00246



Крутая штука динамический массив. Очень быстрая и здоровая реализация. Единственное, чего на мой взгляд не хватает, это механизма удаления элемента из середины массива и соответственно вставки в середину. Насколько я понял ( и проверил ), в памяти массив хранится по-разному в зависимости от типа его элементов. Скажм если в массиве строки(!! не shortString ) - хранятся указатели на них, а если прямоугольники (TRect) - то непосредственно сами прямоугольники.

Ниже привожу подпрограммы удаления и добавления элемента.


procedure delElem(var A: TRectArray; Index: integer);
var Last: integer;
begin
   Last := High(A);
   if Index < Last then
     Move(A[Index+1], A[Index], (Last-Index) * SizeOf(A[Index]));
   SetLength(A, Last);
end;

procedure addElem( var A: TRectArray; Index: integer; ANew: TRect );
var Len: integer;
begin
   Len := Length(A);
   if Index > = Len then
     Index := Len+1;
   SetLength(A, Len+1);
   Move(A[Index], A[Index+1], (Len-Index) * SizeOf(A[Index]));
   A[Index] := ANew;
end;

Подпрограмма delElem полностью универсальна, а в addElem Вам нужно поменять тип добавляемого элемента (ANew) на требуемый.


Source: http://delphiworld.narod.ru
ID: 00792