Понадобилось тут выполнить процедуру, имя которой описано во внешнем ресурсе. С помощью меты написал рефлексивный вызов за несколько минут, аналогично тому, как сделано в SqlControls.CallGuard:
Код:
TYPE
GuardProcVal = RECORD (Meta.Value) p*: Dialog.GuardProc END;
PROCEDURE CallGuard (c: Control; VAR disabled: BOOLEAN; VAR string: ARRAY OF CHAR);
VAR ok: BOOLEAN; dpar: Dialog.Par; v: GuardProcVal; i: Meta.Item;
BEGIN
dpar.disabled := FALSE; dpar.undef := FALSE; dpar.readOnly := FALSE;
dpar.checked := FALSE; dpar.label := "";
Meta.LookupPath(c.prop.guard, i);
IF (i.obj = Meta.procObj) OR (i.obj = Meta.varObj) & (i.typ = Meta.procTyp) THEN
i.GetVal(v, ok);
IF ok THEN v.p(dpar) END
END;
disabled := dpar.disabled; string := dpar.label$
END CallGuard;
Для рефлексивного вызова, надо по имени процедуры получить мета-объект, затем вытащить из него значение особого типа
GuardProcVal, и произвести собственно вызов.
Подумалось, что это не только характерный пример, демонстрирующий работу внутренних механизмов ББ и могущий оказаться полезным желающим разобраться во внутренностях Ящика, но и неплохая точка сравнения ББ с другими системами.
На мой взгляд, в данном способе ничего "военного" в плане критики нет. Рантайм-сущность и обобщённое значение, конкретизированное прикладным типом. Рабочая штучка. Может, стоит его загнать в вики?