Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: 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 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.056 c
9-1111554916
Starter
2005-03-23 08:15
2005.06.29
Несколько видов


1-1117619099
12345
2005-06-01 13:44
2005.06.29
Эффект 25 кадра


3-1116842790
Cat
2005-05-23 14:06
2005.06.29
Поле Date 01.01.2005


1-1117688549
john_mag
2005-06-02 09:02
2005.06.29
обработчик MouseToCall


14-1117912350
Dezmond
2005-06-04 23:12
2005.06.29
MS C# vs Borand C#