К сожалению, использовать SetLength не выходит - установка таким образом длинны массива происходит только 1 раз, потом не меняет (не знаю с чем это связанно), поэтому и пришлось переходить на указатели и использовать выделение памяти. Поэтому в данном случае от PCommandStackElmt = ^TCommandStackElmt; избавиться не удается =(
Код:
PCommandStack[Self.FCount].Command:=TCommand.create;
// сначала записываем в поле указатель на только что созданный класс
PCommandStack[Self.FCount].Command:=ICommand;
// а затем затираем его
Хммм, действительно пересоздавать не надо, спасибо.
Код:
PCommandStack[Self.FCount].@Command:=@ICommand;
В теории, элемент уже создан (где то заранее и передан через AddNew (ICommand: TCommand)), поэтому и была мысля "подменить" указатель, чтобы по возможности минимизировать время обработки, но видимо, нужно будет массив указателей.
Таким образом, остался только вопрос с "безопасной" работой памяти в ReallocMem (ибо избавиться от него не удается). Пытался сделать конструкцию с GetMemory и дополнительным указателем, с последующим копированием данных и переприсвоением указателя:
Код:
GetMem(RecPnt,(BufSize)*SizeOf(TCommandStackElement));
if PCommandStack<>nil then
begin
Move(PCommandStack^,RecPnt^,SizeOf(TCommandStack));
FreeMem(PCommandStack, FSize * SizeOf(TCommandStack));
end;
PCommandStack := RecPnt;
Но даже эта конструкция не устойчива к быстрой скорости обработки информации.