Показать сообщение отдельно
  #3  
Старый 03.04.2012, 08:23
Velz Velz вне форума
Прохожий
 
Регистрация: 02.04.2012
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

К сожалению, использовать 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;
Но даже эта конструкция не устойчива к быстрой скорости обработки информации.
Ответить с цитированием