2012-03-17 8 views
10

Ho aggiunto del codice al mio progetto delphi per interagire con il registro, utilizzando alcuni tutorial che ho trovato online per guidare il mio sforzo. Ogni esempio che ho visto sembra utilizzare tale struttura per il loro accesso al registro:La variabile Delphi potrebbe non essere stata inizializzata con avviso

var 
    Registry: TRegistry; 
begin 
    try 
    Registry := TRegistry.Create; 
    //additional code to access and use the registry object could go here 
    finally 
    Registry.Free; 
end; 

Ma quando ho implementare il mio codice che segue quella struttura, sto ottenendo un messaggio di avviso che il mio Registro variabile non può essere stato inizializzato sulla linea dove liberare l'oggetto TRegistry.

Quindi, mi chiedo se gli esempi che ho trovato siano semplicemente sbagliati nel modo giusto per accedere al registro. Dovrei chiamare Free sul mio oggetto TRegistry a prescindere dal fatto che crei qualcosa di buono, e ignori semplicemente l'avviso? Dovrebbe, invece, il mio blocco try/finally circonda solo il codice dopo il la chiamata di costruttore riuscita, ma non la chiamata di creazione? Qualcos'altro?

risposta

22

Nel codice, se TRegistry.Create genera un'eccezione, la variabile Registry non verrà assegnata. E così finalmente tenterà di accedere a una variabile non inizializzata.

Il modo corretto di scrivere il codice è di assicurarsi che la variabile sia assegnata prima di immettere il blocco try/finally.

Registry := TRegistry.Create; 
try 
    //additional code to access and use the registry object could go here 
finally 
    Registry.Free; 
end; 

Questo è il modello di gestione ciclo di vita più fondamentale nella codifica Delphi e si dovrebbe impegnarsi profondamente alla memoria muscolare.

Si noti che se il costruttore non riesce, quindi riordinerà l'oggetto parzialmente costruito prima di propagare l'eccezione. Il nuovo riferimento oggetto, Registry in questo codice, viene assegnato solo se il costruttore si completa correttamente.

Spero che gli esempi che hai trovato siano stati effettivamente scritti come sopra il mio codice e in qualche modo li hai trascritti in modo errato. Se sono scritti secondo la domanda, allora sono chiaramente in errore.

+0

ho bisogno di fare qualsiasi controllo aggiuntivo dopo la creazione prima del blocco try per assicurarsi che il registro sia inizializzato correttamente? –

+0

E, ad esempio, http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7 sarebbe uno dei tutorial che ho trovato che in effetti appare errato, da qui la domanda per cercare di capire se quel codice somiglia effettivamente a quello che uno sviluppatore delphi più avanzato farebbe o meno. –

+0

Chiaramente hai bisogno di trovare fonti migliori di quel sito! –