Есть ли способ найти неиспользуемые обработчики событий в Delphi?

StackOverflow https://stackoverflow.com/questions/687554

Вопрос

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

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

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

Это было полезно?

Решение

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

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

например ,

кнопка.onclick := DefaultClickHandler кнопка.onclick := DefaultClickHandler;

кнопка.onClick := Специальный обработчик кликов.;

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


однако вы, вероятно, можете найти все заброшенные обработчики, выполнив поиск по всем методам, которые find имеют (Отправитель:TObject) подпись метода и сравнение этого его метода с методами в .dfm (убедитесь, что вы сохранили его в виде текста, если вы работаете с более старой версией delphi), в моей книге подозрительным было бы отсутствие автоматической настройки.

--

если вы не хотите идти по пути cygwin, вы можете загрузить src и dfm в два TStirngLists и вырвать имя / идентификаторы из каждого и сгенерировать список с парой циклов и некоторыми манипуляциями со строками.я предполагаю , что потребуется около 20 минут работы , чтобы получить то , с чем вы сможете жить .

Другие советы

Это немного некрасиво (ОК, это очень много уродливый), но для одного устройства он близок к надежному и не требует дополнительных инструментов:

  1. Убедитесь, что текущая версия формы проверена в системе управления версиями!
  2. Перейдите в верхнюю часть интерфейса класса, где находятся обработчики событий.Удалите все интерфейсы метода обработчика событий.
  3. Посмотрите на Code Explorer / Error Insight.Будут выделены методы, которые имеют реализации, но не имеют интерфейсов.Удалите реализации.
  4. Теперь сохраните устройство.Delphi будет по очереди жаловаться на отсутствие обработчика событий для каждого фактически обработанного события.Записывайте их по мере появления ошибок.
  5. Ознакомьтесь с оригинальной версией формы и удалите обработчики событий для всего, чего нет в вашем списке.

Используйте рефакторинг "Метод переименования", чтобы переименовать каждый обработчик событий.Установите флажок "Просматривать ссылки перед рефакторингом".

Проверьте окно рефакторинга.Если обработчик события связан с элементом управления, в разделе "Обновления конструктора VCL" будет показано, какие элементы управления связаны с методом.

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

Примечание:это для D2006, может немного отличаться в более поздних версиях.

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

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

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

Предполагая, что вы не используете RTTI или вручную не назначаете обработчики событий:(Я пользователь C ++ Builder, а не Delphi, поэтому следующее может быть не совсем корректным.)

  1. Составьте список всех опубликованных методов в вашем коде.
    • Правильный способ сделать это - прочитать *.pas.Найдите каждый текстовый блок , который начинается с class декларация или published директива и заканчивается end, private, или public.Внутри каждого из этих текстовых блоков извлеките каждый procedure.
    • Самый простой способ сделать это - составить список распространенных типов обработчиков событий и предположить, что они опубликованы.
  2. Получив этот список, распечатайте все из списка, чего нет в вашем DFM-файле.

Мне удобнее всего использовать инструменты Cygwin или Linux для написания сценариев.Вот скрипт bash, который работает в Cygwin и должен делать то, что вы хотите.

#!/bin/bash

for file in `find -name *.pas`; do
    echo $file:

    # Get a list of common event handling procedures.
    # Add more types between the | symbols.
    egrep '^[[:space:]]+procedure.*(Click|FormCreate|FormClose|Change|Execute)\(' $file | 
    awk '{print $2}' | cut -f 1 -d '(' > published.txt

    # Get a list of used event procedures.
    egrep '^[[:space:]]+On.* =' ${file%.pas}.dfm | awk '{print $3}' > used.txt

    # Compare the two.
    # Files listed in the left column are published but not used, so you can delete them.
    # Files in the right column were not by our crude search for published event 
    # handlers, so you can update the first egrep command to find them.
    comm -3 published.txt used.txt

    echo

done

# Clean up.
rm published.txt used.txt

Чтобы действительно использовать это, если вы не знакомы с Cygwin:

  • Скачайте и установите Cygwin.Я подумай установка по умолчанию должна предоставить вам все инструменты, которые я использовал, но я не уверен.
  • Сохраните скрипт в вашем исходном каталоге как cleanup.sh.
  • Запустите командную строку Cygwin.
  • Если ваш источник находится в c:\MyApp, затем введите cd /cygdrive/c/myapp
  • Тип ./cleanup.sh и нажмите Enter.

Есть гораздо более простой подход, чем у Крейга.

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

Если вам это не нравится, вы просто меняете имена обратно.

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

Проводник кода создателя моделей содержит так называемый Просмотр обработчика событий.Он также показывает обработчики событий, не подключенные ни к какому компоненту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top