Добавить комментарий
![]() |
Рефлексия в Delphi |
Рефлексией в программировании обычно называют способность программы анализировать свою структуру и изменять свой код во время выполнения. По понятным причинам, самоизменение более распространено для языков, которые исполняются интерпретаторами напрямую или после компиляции в промежуточный псевдокод.
Delphi ограничивается интроспецией.
Все классы в Delphi обладают методами, необходимыми для интроспеции. ClassName, ClassType и т.д., так что разработчик может легко реализовать свой собственный способ реализации интроспекции, если имеющийся в Delphi покажется недостаточно удобным, а мы пока рассмотрим то, что есть из коробки.
Классы, с которыми мы собираемся работать, нужно зарегистрировать:
RegisterClass(TButton); RegisterClass(TEdit);
Теперь мы можем найти класс по имени, среди зарегистрированных:
var cl : TPersistentClass; obj : TControl; begin cl := GetClass('TButton') if not(assigned(cl)) then ShowMessage('Класс TButton не найден.'); ...
и создать экземпляр выбранного класса
... obj := TControl(cl).Create(form); obj.Parent := form; obj.Left := 10; obj.Top := 50; ...
Таким образом, мы создаём экземпляры, классы, которых не знаем в момент компиляции, а выбор делаем только в момент выполнения программы.
Если не хочется самим возиться с анализом на nil, почти для каждой функции GetЧегоТоТам, есть аналог FindЧегоТоТам, который не возвращает nil, а порождает exception ЧегоТоТамNotFound при неудачном поиске.
Работа с атрибутами, свойствами и методами класса сосредоточена в System.TypInfo:
uses TypeInfo; ... v := GetPropValue(obj, 'Caption'); // Забираем значение в переменную типа Variant ... SetStrProp(obj, 'Caption', 'Кнопка'); // Присваиваем значение свойству типа string ...