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

Цитата:
Сообщение от icWasya
я же говорю
TCommandStackElmt = array[0 .. MaxInt div 4-1] of TCommandStackElement;
PCommandStackElmt = ^TCommandStackElmt;
Размер указан толькол для обмана компилятора - что бы не ругался на границу массива.
а работать так

Код:
PCommandStack : PCommandStackElmt;

GetMem(PCommandStack , FCount*sizeof(TCommandStackElement));
ReallocMem(PCommandStack , FCount*sizeof(TCommandStackElement));
FreeMem(PCommandStack);

Ещё раз для тех кто в танке
если написали
Код:
PCommandStackElmt = array of TCommandStackElmt
, то используйте только SetLength, иначе потом можно огрести по полной

Уххх... в общем получилось все сделать
Итоговая конструкция осталась изначальной:
Код:
  TCommandStackElmt = array of TCommandStackElement;
  PCommandStackElmt = ^TCommandStackElmt;
Обманывать компилятор с помощью [0 .. MaxInt div 4-1] не нашлось необходимости, все отлично работает:
Увеличение массива происходит через SetLength(PACommandStack^,FCount); присвоение данных через PACommandStack^[FCount-1].Command:=ICommand; так-же без проблем.
А косяк обнаружился в теле основной программы - после выполнения AddNew (ICommand: TCommand), технично вызывался деструктор того, что уходило в ICommand...
В общем весь косяк был в том, что я изначально не знал о "указательной" природе классов, и удалял тот-же самый элемент, который только только забил в массив.

P.S. Называется хотел как лучше (раз создал объект - будь добр в конце удалить, дабы не мешался в памяти), а получилось через ...

Спасибо
Ответить с цитированием