Domanda

La ricerca di codice morto in Delphi è di solito molto semplice:basta compilare e quindi eseguire la scansione di routine perso i loro punti di blu.Smart linker molto bene per scovarli, la maggior parte del tempo.

Problema è che questo non funziona per i gestori di eventi perché sono metodi pubblicati, che (teoricamente) potrebbe essere richiamato tramite RTTI in qualche modo, anche se questo non avviene quasi mai in pratica.

Sto cercando di pulire un grande VCL forma di unità che è stato piegato, piegato, spindled e mutilati varie volte nel corso della sua storia.Sarebbe certo di essere bello se avessi un modo per trovare i gestori di eventi che non sono in realtà a cui fa riferimento la forma del DFM ed eliminarli.C'è un modo semplice per fare questo?Un plug-in IDE Esperto, per esempio?

È stato utile?

Soluzione

Io non credo che questo è possibile in automatico un punto di vista.i gestori di evento attivato quando si verifica un evento particolare all'interno di un oggetto.Che ancora non ha una data, non vuol dire che non c'è un percorso di esecuzione per la portano ad esso.

inoltre è possibile assegnare i gestori dinamicamente in fase di esecuzione così che cosa è utilizzato in una situazione non è garuanteed.

ad es.

il pulsante.onclick := DefaultClickHandler;

il pulsante.onClick := SpecialClickHandler;

Supponendo che il clic gestori di abbinare l'evento onclick firma, ma che non sarebbe ottenere una compilazione se la firma non è corretta.


tuttavia, si può probabilmente trovare tutti gli abbandonati, i gestori di ricerca per tutti i metodi che trovare un (Sender:TObject) firma del metodo e di confronto che i suoi metodi di quelli in .dfm (assicurarsi che si salva come testo se si lavora con una vecchia versione di delphi), antyhing non via cavo, automaticamente verrebbe il sospetto che nel mio libro.

--

se non volete andare giù il cygwin percorso, è possibile caricare il src e dfm in due TStirngLists e strappare il nome/idents da ogni e generare un elenco con un paio di cicli e alcune stringhe di manipolazioni.la mia ipotesi è a circa 20 minuti di lavoro per ottenere qualcosa che si può vivere con .

Altri suggerimenti

Questo è un po 'brutto (OK, è molto brutto), ma per una sola unità è vicino a infallibile, e non richiede strumenti aggiuntivi:

  1. Assicurarsi che la versione corrente del modulo viene controllato in controllo del codice sorgente!
  2. Vai all'inizio dell'interfaccia della classe in cui i gestori di eventi siano. Eliminare tutte le interfacce metodo del gestore dell'evento.
  3. Guarda Code Explorer / errore Insight. I metodi che hanno implementazioni ma nessuna interfaccia saranno evidenziati. Eliminare le implementazioni.
  4. Ora salva l'unità. Delphi, uno alla volta, si è lamentato il gestore di eventi mancante per ogni evento che è in realtà gestita. Scrivere queste giù come gli errori vengono in su.
  5. Controlla la versione originale del modulo, e rimuovere i gestori di eventi per tutto quanto non sulla vostra lista.

Utilizzare il refactoring "Rinomina metodo" per rinominare ogni gestore di eventi. Controllare "Visualizza riferimenti prima di refactoring" casella di controllo.

Controlla la finestra di refactoring. Se il gestore di eventi è legato a un controllo, ci sarà uno spettacolo di sezione "VCL Designer Aggiornamenti" cui il controllo (s) sono legati al metodo.

Questo mostrerà anche se il metodo viene chiamato da altre unità, o viene assegnato programmazione.

. Nota: questo è per D2006, può essere leggermente diversa nelle versioni successive

Non c'è una soluzione che è garantito per dare una risposta corretta nel caso più generale (basata, come si nota, sulla possibilità di chiamarli via RTTI).

Una soluzione potrebbe essere quella di fare test di copertura del codice e osservare con attenzione i gestori che non sono mai raggiunti.

Io non sono a conoscenza di un'applicazione preesistente o plugin per fare questo, ma non dovrebbe essere difficile da script.

Supponendo che non lo si utilizza RTTI o assegnare manualmente i gestori di eventi: (. Sono un utente di C ++ Builder, piuttosto che Delphi, quindi quanto segue non può essere del tutto corretto)

  1. Fare una lista di tutti i metodi pubblicati nel codice.
    • Il modo corretto per farlo è quello di leggere *.pas. Trova ogni blocco di testo che inizia con una dichiarazione class o una direttiva published e termina con un end, private o public. All'interno di ciascuno di questi blocchi di testo, estrarre ogni procedure.
    • Il modo più semplice per farlo è quello di fare una lista di tipi di gestore di eventi comuni e assumere che siano pubblicati.
  2. Una volta che avete questa lista, stampare tutto, dalla lista che non ha trovato nel file DFM.

Sono più comodo utilizzando strumenti Cygwin o Linux per lo scripting. Ecco uno script bash che lavora a Cygwin e dovrebbe fare quello che vuoi.

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

Per usare in realtà questo, se non hai familiarità con Cygwin:

  • Scaricare e installare Cygwin. I pensare l'installazione di default dovrebbe darvi tutti gli strumenti che ho usato, ma io non sono positivi.
  • Salva lo script alla directory sorgente come cleanup.sh.
  • Avviare un prompt dei comandi Cygwin.
  • Se la sorgente è in C: \ MyApp, quindi digitare cd /cygdrive/c/myapp
  • Tipo ./cleanup.sh e premere Invio.

C'è un approccio molto più facile di Craig.

Vai a un gestore di eventi sospetti. Rinominarlo in modo coerente - faccio questo mettendo una x davanti al nome, scendere l'attuazione e fare la stessa cosa. Vedere ciò che il compilatore pensa di esso.

Se non è felice basta cambiare i nomi di nuovo.

È possibile utilizzare lo stesso approccio per eliminare elementi di dati che non fanno nulla.

ModelMaker Code Explorer contiene un cosiddetto handler evento vista . Essa mostra anche i gestori di eventi non collegati ad alcun componente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top