2009-08-01 12 views
18

Cercando di riorganizzare i miei pacchetti per un set di TFrame-descendent components, trovo che sia apparentemente necessario suddividere alcuni dei miei TFrame di utilità separati dalle finestre di dialogo che li usano, principalmente perché i primi sono registrati nella tavolozza come componenti veri e questo sembra confondere l'IDE a volte rispetto alle forme di dialogo che le usano. Le forme di dialogo a loro volta sono chiamate da componenti non visuali, che fanno parte di un terzo pacchetto. Questo, fino ad ora, sembra rendere la maggior parte delle dependency-related complaints/confusioni del compilatore. (Non sono ancora uscito, comunque)."Importa implicitamente" è sempre una brutta cosa nei pacchetti Delphi?

Quando si compila il pacchetto con la finestra di forme (che chiamano la Frames), io sono sempre l'avvertimento "Unità 'MyFrames' implicitamente importati in pacchetto 'MyDialogForms'"

Dato che si presenta come avvertimento del compilatore, ho avuto tempo fa l'impressione che "importare implicitamente" un'unità non sia generalmente una buona cosa. Ci sono casi specifici in cui non è così? cioè dove l'importazione implicita di un'unità è OK, e/o una pratica appropriata? ... e se sì, quali sono quei casi specifici?

risposta

28

Ecco il problema:

Si può avere una sola copia di un'unità nel vostro programma. Se provate a caricare la stessa unità due volte tramite i pacchetti, si solleverà un'eccezione e il pacchetto non verrà caricato la seconda volta. Il modo per evitare ciò è strutturare i pacchetti in modo che nessuna unità venga utilizzata in più di una di esse.

Il codice per ogni unità compilata deve essere incluso nel pacchetto. Il compilatore inizierà con tutte le unità dichiarate nella sezione contiene, ma anche tutte le altre unità utilizzate da quelle unità devono essere compilate in modo da renderle raggiungibili, a meno che tali unità non siano contenute in un altro pacchetto elencato in richiede. Questi extra sono le unità "implicitamente importate". Il problema è che sono importati in modo implicito, non esplicitamente indicato nella sezione contiene dove verranno visualizzati comodamente nel Project Manager sulla destra. Ciò significa che potresti non notare che la tua unità si trova in un pacchetto e finire per inserirla in un altro. Quindi quando si tenta di eseguire il programma e caricare i pacchetti, le cose si interrompono. Ecco perché il compilatore ti avvisa di questo.

È un avviso e non un errore, per un motivo. Finché capisci come funziona il sistema, è tecnicamente sicuro utilizzare le importazioni implicite. Ricorda solo che quelle unità finiscono nel pacchetto se le dichiari o no. Ma poi di nuovo, dal momento che stanno finendo lì, sia che tu lo dichiari o meno, è probabilmente più semplice aggiungerli ufficialmente e risparmiarti la seccatura.

+2

(nota che nel pacchetto non significa nel BPL. Vedere $ weakpackageunit;) –

+1

Mason - GRAZIE! Questa è la panoramica concettuale più cogente e concisa che ho letto su questo da quando è iniziato il mio pacchetto sagas. – Jamo

+0

In che modo Delphi gestisce i riferimenti ricorrenti a unità fondamentali come SysUtils, Forms, ecc. Tra i pacchetti? Sembra che questi potrebbero causare lo stesso tipo di problema. – Jamo

10

+1 per Mason's answer. Il luogo in cui le unità implicitamente importate diventano un problema si trova in un grande progetto in cui diventa esponenzialmente più difficile tenere traccia delle unità collegate da qualsiasi luogo.

Trovo che il modo migliore sia quello di avere una cartella per pacchetto, e quella cartella contiene tutti i file per il pacchetto. Se vedo un avviso di "importazione implicita", aggiungo il pacchetto richiesto o aggiungo l'unità al pacchetto. Quindi tutte le unità sono specificate nel pacchetto che le contiene e sono tutte nella stessa cartella. Non aggiungo mai cartelle al percorso di ricerca, perché ogni progetto conosce direttamente tutti i suoi file.

La struttura non è molto difficile da gestire e protegge da problemi in cui diverse unità contengono versioni diverse di un file.

+0

Questo suona come una raccomandazione solida - potrei provarlo! Grazie per la risposta, Cobus. Molto apprezzato. – Jamo

Problemi correlati