И опять неясно. Ты пишешь что удаляешь первый элемент но насамом деле-третий.
И теперь уже непонятно в чем разница между доступными и недоступными злементами.
Сделал как понял.
При удалении ставится метка об удалении
При добавлении длина массива увеличивается на 1 и
новый элемент добавляется в конец
Уплотнение происходит так
Все элементы ниже индекса поднимаются вверх на 1 позицию
тем самым закрывая дырку. Длина массива уменьшается на 1
Код:
type
TArr=array of record
Enabled,Deleted:boolean;
Data:integer;
end;
{-------------------------------------------
процедура ставит метку удаления
на строке Index
Возвращает индекс удаленного элемента
Если удаление запрещено- то -1
---------------------------------------------}
function DeleteRec(var Arr:TArr;Index:integer):integer;
begin
if Arr[Index].Enabled then
begin
Arr[Index].Deleted:=true;
Result:=Index
end
else Result:=-1;
end;
{------------------------------------------------
процедура сдвигает хвост массива на строку Index
уменьшает длину массива на 1
--------------------------------------------------}
procedure ShiftRec(var Arr:TArr;Index:integer);
var
i:integer;
begin
if Index <0 then Exit
else
begin
for i:=Index+1 to High(Arr) do
Arr[i]:=Arr[i+1];
SetLength(Arr,Length(Arr)-1);
end;
end;
{----------------------------------------------------
процедура добавляет запись в конец массива
увеличивает длину массива на 1
-----------------------------------------------------}
procedure AddRec(var Arr:TArr;Dat:integer;Enabl:boolean);
begin
SetLength(Arr,Length(Arr)+1);
Arr[High(Arr)].Data:=Dat;
Arr[High(Arr)].Enabled:=Enabl;
end;