Pregunta

Búsqueda de código muerto en Delphi es generalmente muy sencillo: basta con compilar y luego escanear en busca de rutinas que faltan sus puntos azules. del enlazador inteligente muy bien acerca de hacer su seguimiento, la mayor parte del tiempo.

El problema es que esto no funciona para los controladores de eventos porque son métodos publicados, que (en teoría) podría ser invocados a través de RTTI de alguna manera, a pesar de que esto casi nunca sucede en la práctica real.

Estoy tratando de limpiar una gran unidad de forma VCL que ha sido doblado, plegado, fusiformes y mutilado diversas ocasiones a lo largo de su historia. Es seguro que sería agradable si tuviera alguna manera de encontrar los controladores de eventos que no están realmente referenciados por DFM de la forma y eliminarlos. ¿Hay alguna manera fácil de hacer esto? Un plug-in IDE experto, por ejemplo?

¿Fue útil?

Solución

No creo que esto es posible desde un punto de vista automática. controladores de eventos se activan cuando un evento en particular se produce dentro de un objeto. Que el aun no se activa en un plazo determinado doesnt significa que tampoco hay una vía de ejecución para llevar a él.

También puede asignar dinámicamente los controladores en tiempo de ejecución por lo cuál se utiliza en una situación no se garuanteed.

por ejemplo.

button.onclick: = DefaultClickHandler;

button.onClick: = SpecialClickHandler;

Si se asume que los manipuladores clic coinciden con la firma evento onclick, pero te podría obtener una compilación si la firma es incorrecta.


Sin embargo, es probable que pueda encontrar todos los controladores abandonados mediante la búsqueda de todos los métodos que encontrar un (Sender: TObject) firma del método y la comparación de que su de los métodos a los de la .dfm (asegúrese de guardar como texto si está trabajando con una versión anterior de Delphi), no antyhing cableado de forma automática sería sospechoso en mi libro.

-

si no quieres ir por el camino cygwin, se puede cargar el src y DFM en dos TStirngLists y rasgar el nombre / identificativos de cada uno y generar una lista con un par de bucles y algunas manipulaciones de cadenas. yo creo que es de unos 20 minutos de trabajo para conseguir algo que se puede vivir.

Otros consejos

Esto es un poco feo (OK, es mucho feo), pero para una unidad que está cerca de toda prueba, y no requiere herramientas adicionales:

  1. Asegúrese de que la versión actual del formulario se registró en control de código fuente!
  2. Ir a la parte superior de la interfaz de la clase en la que los controladores de eventos son. Eliminar todas las interfaces de métodos de controlador de eventos.
  3. Mira Código Explorador / Error Insight. Los métodos que tienen implementaciones, pero no se resaltarán las interfaces. Eliminar las implementaciones.
  4. Ahora guarde la unidad. Delphi, uno a la vez, se quejó de la falta controlador de eventos para cada evento que se maneja en realidad. Anota los datos como los errores surgen.
  5. Confirmar la versión original del formulario, y quitar los controladores de eventos para cualquier cosa no en su lista.

Utilice la refactorización "Cambiar el nombre de método" para cambiar el nombre de cada controlador de eventos. Marque la casilla "Ver referencias antes de refactorización" casilla de verificación.

Comprobar la ventana Refactoring. Si el controlador de eventos está vinculada a un control, habrá un "diseñador VCL actualizaciones" Mostrar sección que el control (s) están vinculados al método.

Esto también mostrará si el método es llamado desde cualquier otra unidad, o se asigna mediante programación.

Nota:. Esto es para D2006, puede ser ligeramente diferente en versiones posteriores

No hay una solución que está garantizado para dar una respuesta correcta en el caso más general (basado, como señalas, en la posibilidad de llamar a ellos a través de RTTI).

Una solución sería hacer pruebas de cobertura de código y observa los manipuladores que nunca fueron alcanzadas.

No estoy al tanto de una aplicación preexistente o plugin para hacer esto, pero no debería ser difícil de guión.

Suponiendo que no está utilizando RTTI o asignar manualmente los controladores de eventos: (. Soy un usuario de C ++ Builder en lugar de Delphi, por lo que el siguiente puede no ser del todo correcta)

  1. Haga una lista de todos los métodos publicados en su código.
    • La forma correcta de hacer esto es leer *.pas. Encuentra cada bloque de texto que comienza con una declaración class o una directiva published y termina con una end, private o public. Dentro de cada uno de estos bloques de texto, extraer cada procedure.
    • La forma más fácil de hacer esto es hacer una lista de tipos de controlador de eventos comunes y asumir que son publicados.
  2. Una vez que tenga esta lista, imprimir todo, desde la lista que no ha encontrado en su archivo DFM.

Estoy más cómodo el uso de herramientas de Cygwin o Linux para scripting. Aquí hay un script bash que trabaja en Cygwin y debe hacer lo que quiera.

#!/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

Para utilizar realmente esto, si usted no está familiarizado con Cygwin:

  • Descargar e instalar Cygwin. I piensan la instalación por defecto debe darle todas las herramientas que he usado, pero no soy positivo.
  • Guardar la secuencia de comandos en el directorio de origen como cleanup.sh.
  • Iniciar un símbolo del sistema Cygwin.
  • Si la fuente está en c: \ MyApp, a continuación, escriba cd /cygdrive/c/myapp
  • ./cleanup.sh Tipo y pulse Intro.

Hay un enfoque mucho más fácil que Craig.

Ir a un controlador de eventos sospechosos. Cambiar el nombre de una manera coherente - que hago esto poniendo una X delante del nombre, bajar a la puesta en práctica y hacer lo mismo. Ver lo que piensa el compilador de la misma.

Si no es feliz que acaba de cambiar los nombres de atrás.

Puede utilizar el mismo método para eliminar elementos de datos que ya no hacen nada.

ModelMaker Código Explorador contiene una llamada controlador de eventos vista. También muestra controladores de eventos no conectados a cualquier componente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top