Вниз
Скачать: CL | DM;

Удаление элемента из динамического массива.   Найти похожие ветки 

 
Gear   (2005-06-06 14:40) [0]

Здравствуйте!
Есть в сети функции удаления элементов из динамического массива:


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;


Так вот что делать если динамический массив это:

TCallList = record
   CallID:        string;
   ani:           string;
 end;

...

CallList: array of TCallList;


В данном случае sizeof( A[Index] )  ) - разные величины для каждого элемента. Как выкрутится красиво?


 
Digitman ©   (2005-06-06 14:41) [1]


> sizeof(A[Index]))


ой врешь !


 
Alexander Panov ©   (2005-06-06 14:45) [2]

Не надо извращаться.
Воспользуйся стандартным способом.

procedure delElem( var A:TRectArray; Index:integer );
var
 Last: Integer;
 i: Integer;
begin
 Last := High(A);
 if Index <  Last then
 begin
   for i := Index to Last-1 A[Index] := A[Index+1];
 end;
 SetLength( A, Last );
end;


 
Erik1 ©   (2005-06-06 14:49) [3]

Если хочеш использовать Move, то запись TCallList должна состоять из простых типов. Вместо String используй ShortString.


 
Суслик ©   (2005-06-06 14:50) [4]

можно использоваться move, но запись должна состоять из простых типов, иначе нужно пользоваться фукнцией finilize.


 
REA   (2005-06-06 16:50) [5]

Не надо извращаться, используй два TStringList. Или класс который будет синхронно с ними работать.


 
VladimirB ©   (2005-06-06 16:54) [6]

В данном случае sizeof( A[Index] )  ) - разные величины для каждого элемента.
С чевойто они разные?
4+4 = 8 байт.
String это ведь указатель и его размер не зависит от длины строки, так что все ОК в delElem.


 
Chlavik ©   (2005-06-06 18:23) [7]

Может тут проще заюзать связанный список ??
type
  PElement = ^TElement;
  TElement =record
   Data:Pointer;
   before:PElement;
  end;

Для того что бы удалить что то надо просто осводить память елеменат ( то что хранится в Дата) и указать и сявзать через Before c предидущим


 
Sapersky   (2005-06-06 18:27) [8]

String это ведь указатель... так что все ОК в delElem

Память, на которую он указывает, не освободится (дельфийский менеджер памяти не настолько умный чтобы учитывать затирающие указатель мувы). Нужно предварительно сделать Finalize для удаляемого элемента - Finalize(A[Index]).



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.051 c
14-1117331280
Kamilcom
2005-05-29 05:48
2005.06.29
Где Вы сейчас находитесь?


14-1117819487
VEG
2005-06-03 21:24
2005.06.29
Кто заметил, когда пропал the5k.org ?


14-1117439308
Kolan
2005-05-30 11:48
2005.06.29
что такое xmas


8-1109790766
seregka
2005-03-02 22:12
2005.06.29
Прозрачность изображения+наложение 2-х изображений


14-1117426539
SPeller
2005-05-30 08:15
2005.06.29
Глюки :)




   Наверх