Delphi - Как правильно зарегистрировать графический класс начиная с XE8? - PullRequest
11 голосов
/ 08 июня 2019

Я пишу пакет Delphi, который предоставляет новый пользовательский объект TGraphic, позволяющий читать новый формат изображения в таких компонентах VCL, как TImage.

Первоначально я разработал этот пакет с помощью RAD Studio XE7, и он хорошо работал. Однако недавно я перешел на более новую версию компилятора RAD Studio, и хотя мой пакет продолжает нормально работать в этой новой версии, я заметил странную ошибку, которая никогда не появлялась раньше.

У меня есть форма с несколькими компонентами, некоторые из которых являются компонентами TImage. Сразу после открытия среды IDE, когда я впервые открываю свой проект во время разработки, все компоненты TImage, содержащие мой пользовательский компонент TGraphic, теряют свое содержимое. Если я закрою, а затем снова открою проект, изображения снова появятся, и ошибка больше не произойдет, пока я не закрою и не открою свою IDE.

Я покопался в своем коде, чтобы понять, что может вызвать проблему. Чтобы зарегистрировать свой пользовательский компонент TGraphic, я использую раздел инициализации класса, в котором я написал следующий код:

initialization
begin
    Vcl.Graphics.TPicture.RegisterFileFormat('svg', 'Scalable Vector Graphics', TWSVGGraphic);
end;

Однако я обнаружил, что, начиная с версии компилятора XE8, конструктор TImage вызывается перед моим разделом инициализации, вызывая, таким образом, очевидно вышеупомянутую проблему. На все версии компилятора, начиная с XE8, влияют, но эта ошибка никогда не возникала на XE7 или более ранних версиях. Так что с XE8 что-то изменилось.

Вот мои вопросы:

  • Правильно ли я использую для регистрации свой пользовательский графический класс?
  • Если нет, как правильно это сделать?
  • Как выглядит что-то иное после XE8, каков новый правильный способ регистрации моего графического компонента?
  • Кто-нибудь еще сталкивался с такой же проблемой? Как он это решил?
  • Это может быть новая ошибка RAD Studio, или проблема скорее на моей стороне?

1 Ответ

9 голосов
/ 09 июня 2019

Скорее всего, это побочный эффект умной загрузки , которую IDE применяет к пакетам времени разработки. Вы можете переписать это поведение, вызвав ForceDemandLoadState(dlDisable) во время процедуры регистрации вашего пакета.

Подробнее об этом можно узнать из документации более поздних версий Delphi, чем XE8: Явное отключение интеллектуальной загрузки компонентов в пакете времени разработки

...