Ссылка на класс как свойство - PullRequest
7 голосов
/ 28 января 2012

Google бесполезен для такого рода поисков, потому что вы получаете сотни миллионов результатов, абсолютно ни один из которых не относится к конкретному вопросу.

Вопрос заключается просто в следующем:

  • Возможно ли иметь свойство Reference Class в Delphi?
  • Если да, то как?

Вот что я пробовал ...

type

  TMyObject = class
    // ...
  end;

  TMyObjectClass = class of TMyObject

  TMyObjectA = class(TMyObject)
    // specifics here
  end;

  TMyObjectB  =class(TMyObject)
    // specifics here
  end;

  TMyComponent = class(TComponent)
  private
    FObjectType: TMyObjectClass;
  published
    property ObjectType: TMyObjectClass read FObjectType write FObjectType;
  end;

Приведенный выше код прекрасно компилируется, однако инспектор объектов вообще не показывает свойство ObjectType.

Моя цель здесь (если вы еще не догадались) - сделать так, чтобы я мог выбратьнаследник класса от определенного базового класса, чтобы заставить один и тот же компонент вести себя по-другому.

Я хочу сделать это таким образом, чтобы компоненту не нужно было напрямую знать о подклассах ( он должен быть полностью модульным ).

Позвольте мне прояснить этот бит: Я не могу использовать Enum для выбора между типами подкласса, так как компонент не может напрямую ссылаться натипы подклассов ( Это просто невозможно в данном конкретном случае )

В любом случае ... заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 28 января 2012

Вы можете найти все классы, которые происходят от определенного базового класса: Delphi: Во время выполнения найти классы, которые происходят от данного базового класса? и сделать это специальным свойством со списком значений, используя TPropertyEditor .

3 голосов
/ 28 января 2012

Если вы собираетесь это сделать, вам нужно будет предоставить редактор свойств .В среде IDE отсутствуют редакторы свойств для свойств типа класса.Вы также должны обрабатывать постоянство .dfm.Вы должны записать тип класса в файл .dfm в виде строки, и когда файл .dfm будет прочитан, вам потребуется исправить ссылку.Новый стиль RTTI может сделать это.

Тем не менее, я не думаю, что что-то из этого действительно жизнеспособно по следующей причине.Код времени разработки выполняется в пакете внутри среды IDE и не имеет доступа к типам классов в активном проекте в среде IDE.Эти типы классов существуют только при запуске этого проекта.Таким образом, свойство ObjectType в коде вашего вопроса не может быть присвоено чему-либо значимому в пакете времени разработки.Ну, вы можете использовать его для классов, определенных в VCL, и для любых других пакетов, установленных в вашей IDE, но я предпочитаю использовать его для классов, определенных в активном проекте.

Я думаю, что все это означаетвместо этого вы должны использовать простое строковое свойство и исправлять ссылки на типы классов только во время выполнения.

...