Решил посмотреть, где явно выделяется память. И вот наткнулся на такой кусок кода
- Код: Выделить всё
- procedure TMainForm.RemoveCommand(commIndex_: byte);
 var i,j:integer;
 begin
 for i:=0 to CommandCount-1 do
 if Commands[i].CommIndex=commIndex_ then break;
 if i<CommandCount then
 begin
 Сommands[i].Destroy; // <--- 1
 for j:=i to CommandCount-2 do
 Commands[j]:=commands[j+1]; // <--- 2
 dec(CommandCount);
 setlength(Commands,CommandCount);
 end;
 end;
Здесь пояснения. Commands - динамический одномерныйц массив класса TCommand (который унаследован от TObject) длиной High(Byte).
В пункте 1 безусловно, надо заменить на Сommands[i].Free;
Алгоритм очень прост. По значению commIndex_ находим нужный нужный нам элемент массива и осовобождаем его.
Затем сдвигаем элементы массива справа налево правее освобожденного.
В результате этого в пункте 2 последний и предпоследний элементы указывают на один и тот же экземпляр класса. Вот этот момент и смущает.
Затем массив обрезается на 1 элемент, последний элемент уходит из зоны видимости.





