Code: |
type TArrayString = arrayofstring;
procedure DeleteArrayIndex(var X: TArrayString; Index: Integer); begin ifIndex > High(X) then Exit; ifIndex < Low(X) then Exit; ifIndex = 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; |
Взято с сайтаhttps://www.swissdelphicenter.ch/en/tipsindex.php
Автор: https://sunsb.dax.ru
Крутая штука динамический массив. Очень быстрая и здоровая реализация. Единственное, чего на мой взгляд не хватает, это механизма удаления элемента из середины массива и соответственно вставки в середину. Насколько я понял ( и проверил ), в памяти массив хранится по-разному в зависимости от типа его элементов. Скажм если в массиве строки(!! не shortString ) - хранятся указатели на них, а если прямоугольники (TRect) - то непосредственно сами прямоугольники.
Ниже привожу подпрограммы удаления и добавления элемента.
Code: |
procedure delElem( var A:TRectArray; Index:integer ); var Last : integer; begin Last:= high( A ); ifIndex < 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 ); ifIndex > = Len thenIndex := Len+1; setLength( A, Len+1); move( A[Index], A[ Index+1 ], (Len-Index) * sizeof( A[Index] )); A[Index] := ANew; end;
|
Подпрограмма delElem полностью универсальна, а в addElem Вам нужно поменять тип добовляемого елемента (ANew) на требуемый.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!