Вниз
Скачать: 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.026 c
4-1115051030
rolex
2005-05-02 20:23
2005.06.29
Как определить работает ли уже данное приложение или это его перв


6-1112392985
Muh
2005-04-02 02:03
2005.06.29
Почему у флешгета получается, а у меня нет :)


9-1111585363
Starter
2005-03-23 16:42
2005.06.29
Misc of GLScene


14-1117610965
Skier
2005-06-01 11:29
2005.06.29
Построение буферной зоны.


3-1116316623
Dell3r
2005-05-17 11:57
2005.06.29
Помогите составить запрос




   Наверх