Соответствующая документация находится здесь в разделе Типизированные константы :
Типизированные константы, в отличие от истинных констант, могут содержать значения массива,
типы записей, процедур и указателей. Типизированные константы не могут встречаться в
константные выражения.
Объявите типизированную константу следующим образом:
const identifier: type = value
где идентификатор - любой допустимый идентификатор, тип - любой тип, кроме
файлы и варианты, а значение является выражением типа. Например,
const Max: Integer = 100;
В большинстве случаев значение должно быть константным выражением; но если тип является
массив, запись, процедурный тип или тип указателя, применяются специальные правила.
Эти специальные правила для процедурных типов следующие:
Чтобы объявить процедурную константу, укажите имя функции или
Процедура, которая совместима с объявленным типом константы.
Например,
function Calc(X, Y: Integer): Integer;
begin
...
end;
type TFunction = function(X, Y: Integer): Integer;
const MyFunction: TFunction = Calc;
С учетом этих деклараций вы можете использовать процедурную константу
MyFunction в вызове функции:
I := MyFunction(5, 7)
Вы также можете присвоить значение nil процедурной константе.
Это объясняет, почему вы можете объявить типизированную константу с помощью TFoo
.
Что касается анонимных методов, они нигде не перечислены в этой документации. Теперь анонимный метод реализован как интерфейс. Этот интерфейс имеет класс поддержки, сгенерированный компилятором, и поэтому должен быть создан экземпляр этого класса. Этот экземпляр размещается в куче, и это (по крайней мере, одна причина), почему вы не можете объявить анонимный метод константой.