Изменение кода компонента VCL - PullRequest
4 голосов
/ 17 августа 2011

Мне нужно изменить функциональность компонента. Что вы делаете, когда получаете сообщение «Вы не можете переопределить это», или вам нужно изменить код в закрытом методе (сообщение «метод не существует в базовом классе»), что делает невозможным переход компонента?

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

Если я сталкиваюсь с этой проблемой,

  • Сначала я пытаюсь наследовать от компонента или его предка CustomXXX и посмотреть, решит ли это проблему.Если этого не произойдет,
  • Я углубляюсь, то есть пытаюсь перехватить входящие сообщения. Это можно сделать динамически.Если это оказывается слишком глубоким, потому что код, который должен быть построен на этом, является слишком обширным, или если мне все еще нужно получить доступ к элементам, к которым у меня нет доступа,
  • Я пытаюсь взломать.Один из способов - скопировать компонент и зависимый код в новое устройство с другим именем, переименовать компонент и изменить то, что нужно изменить.
  • Иногда мне нужно только переделать один или два метода, чтобы сделать мойновое поведение возможно.

Никогда не забывайте давать устройству другое имя и компоненту тоже другое имя (возможно, унаследованное от исходного компонента или одного из его предков, поэтому они остаются в той же иерархии). никогда не изменяйте исходные коды, а затем перекомпилируйте VCL.Это кошмар обслуживания.

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

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

Но мой главный совет: не изменяйте исходные единицы ,всегда вводите новый код в новый блок и используйте новое имя класса .Таким образом, оригинальная и измененная версии могут мирно сосуществовать, в том числе в IDE.

4 голосов
/ 17 августа 2011

Существуют некоторые (в основном хакерские) варианты, когда дело доходит до изменения приватных методов или поведения в них:

  • изменить исходный код, перекомпилировать модуль и использовать измененный dcu, как предложено здесь;никогда не делал этого, но я думаю, что это может вызвать у вас сильную головную боль, когда ваш код использует новый dcu, но другой код VCL не
  • часто поведение компонента контролируется многочисленными оконными сообщениями - посмотрите, можете ли вы добиться ваших измененийизменяя реакцию на некоторые из этих сообщений;вы можете переопределить методы обработки сообщений (те, которые имеют ключевое слово message), даже если они объявлены закрытыми, и вы также можете заменить WndProc
  • , вы можете использовать такие хаки, как this , которыйвозится с кастингом
  • , вы можете использовать какой-нибудь обходной механизм, как описано в ответах здесь

Или вы можете получить другой компонент.

...