![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление элемента из динамического массива. [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]))
ой врешь !