В более новых версиях (IIRC XE2 и выше) вы можете делать то, что говорит Реми, но IMO не следует.
В версиях до XE2 (или любой другой версии) определение TPointerList
было:
type
...
TPointerList = array[0..MaxListSize] of Pointer;
В более новых версиях это:
type
TPointerList = array of Pointer;
Другими словами, вместо статического типа массива (тип значения) теперь он стал динамическим типом массива (ссылочным типом). Приведение адреса нетипизированного параметра к такому массиву может оказаться сложным.
Разница в определении объясняет, почему в более новых версиях код не работает должным образом: существует один дополнительный уровень косвенности.
Теперь, если вы добавите следующее объявление в файл uAutoComplete.pas :
type
TPointerList = array[0..65535] of Pointer; // assuming 65536 (2^16) entries are enough
тогда остальная часть файла может остаться такой, какой она была раньше. Тогда:
TPointerList(elt)[I] := ...
работает и не требует от вас использования слегка хитрого, косвенного приведения к динамическому массиву Delphi для чего-то, чего на самом деле нет. Обратите внимание, что это также будет работать в более старых версиях.