Добавить комментарий

Delphi

Рефлексия в 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
...    

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.