Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление элемента из динамического массива. [D7, WinXP]


Gear ©   (2005-06-06 14:40:00) 

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


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] )  ) - разные величины для каждого элемента. Как выкрутится красиво?


Sapersky   (2005-06-06 18:27:00) [1]

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

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


Chlavik   (2005-06-06 18:23:00) [2]

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

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


VladimirB   (2005-06-06 16:54:00) [3]

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


REA   (2005-06-06 16:50:00) [4]

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


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

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


Erik1   (2005-06-06 14:49:00) [6]

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


Alexander Panov   (2005-06-06 14:45:00) [7]

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

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;


Digitman   (2005-06-06 14:41:00) [8]


> sizeof(A[Index]))


ой врешь !


Наверх

Титульная страница Поиск, карта сайта Написать письмо