2014-12-26 5 views
-2

Задача:Delphi: определение того, какой компонент необходимо создать во время выполнения

Форма должна иметь визуальный компонент.

Существует 2 версии одного и того же компонента, имеющих тот же класс бабушки и дедушки. Каждый из них позволяет использовать различные функции.

На основании параметров конфигурации правильный компонент должен загружаться при загрузке формы. По умолчанию один из компонентов присутствует в форме во время разработки. Во время выполнения приложение должно решить, следует ли сохранять этот компонент или отбрасывать его и загружать другой компонент с помощью тех же обработчиков событий и свойств, что и предыдущий PLUS, который позволяет использовать дополнительные функции. Они не из одной ветви наследования.

В ООП условиях:

TGrandParent -> TParent -> TDesiredComponent1 (.. Present во время разработки Loaded по умолчанию) TGrandParent -> TDesiredComponent2 (необходимо загрузить на основе конфигурации)

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

Будет очень хорошо, если это можно сделать кратко в одном месте. Любая идея, как этого достичь?

+0

Это не похоже на правильный путь решения проблемы. Если бы я был вами, я бы искал лучший дизайн. –

+0

Прежде всего, если вы хотите определить, какой компонент необходим во время выполнения, почему вы даже создаете его во время разработки? Разве это не пустая трата циклов процессора (создание компонента именно так, что он будет уничтожен через несколько минут позже). Во-вторых, как вы будете обращаться к любому из этих компонентов, когда у них есть разные свойства/методы? Да, я видел, что они имеют общие свойства/методы, но как вы определяете, можно ли вызвать какой-либо метод «расширенного» компонента, если у другого компонента этот метод отсутствует? – SilverWarior

+0

Правильный подход заключается в добавлении абстрактного абстрактного слоя (класса или интерфейса), который предоставляет все возможные свойства и методы, а затем во время выполнения определяет, когда можно получить доступ к некоторому свойству, или когда может быть запущен определенный метод и возвращает какой-либо полезный результат или предупреждение, если это не представляется возможным. Теперь этот абстрактный слой должен только перенаправлять данные, возвращаемые из свойств или методов ваших двух компонентов, или возвращать некоторый предопределенный результат, если ваши компоненты не имеют этого метода или свойства. – SilverWarior

ответ

0

Это то, что я сделал - создайте 2 версии компонента1. Один, который сохраняет прежнее поведение, и тот, который унаследован от компонента2. Мне нужно было сохранить старую версию, потому что изменение компонента во всем мире по-прежнему вызывало проблемы в некоторых местах после нового наследования. Любое лучшее решение будет полезно, но это, похоже, работает очень хорошо, но не проверено на проблему с памятью/производительностью. Спасибо за помощь.

-1

Как только я использовал TReader.OnCreateComponent событие, чтобы сделать такой трюк. Но в целом я бы предпочел более четкий и мудрый дизайн.

Если честно, как только я использовал более интересный трюк: во время выполнения я обнаружил компонентный VMT Component1 и изменил его, поэтому, когда был вызван Component1.NewInstance/Create, компонент Component2.NewInstance/Create был выполнен. Это определенно решит вашу проблему :)

Смежные вопросы