2009-08-01 4 views
18

Versuchen, meine Pakete für eine Reihe von TFrame-descendent components neu anzuordnen, finde ich es scheinbar notwendig, einige meiner Dienstprogramm TFrame Nachkommen getrennt von den Dialogformularen, die sie verwenden, vor allem, weil die ersteren auf die Palette als echte Komponenten registriert sind und das scheint die IDE manchmal in Bezug auf die Dialogformen zu verwirren, die sie benutzen. Die Dialogformen wiederum werden von nicht-visuellen Komponenten aufgerufen, die Teil eines dritten Pakets sind. Dies, so weit, scheint die meisten dependency-related complaints/Compilers des Compilers gehen weg. (Ich bin aber noch nicht draußen).Ist "implizit importiert" in Delphi-Paketen immer eine schlechte Sache?

Wenn das Paket mit den Formen Dialog Kompilieren (die die Frames nennen), erhalte ich die Warnung „Unit‚MyFrames‘implizit importiert in Paket‚MyDialogForms‘“

Da zeigt sich, Als Compiler-Warnung habe ich vor langer Zeit den Eindruck gewonnen, dass das "implizite Importieren" einer Einheit im Allgemeinen keine gute Sache ist. Gibt es bestimmte Fälle, in denen dies nicht der Fall ist? d. h. wo der implizite Import einer Einheit OK ist und/oder eine angemessene Übung? ... und wenn ja, was sind diese speziellen Fälle?

Antwort

28

Hier ist die Frage:

Sie nur eine Kopie einer Einheit in Ihrem Programm haben. Wenn Sie versuchen, dieselbe Einheit zweimal über Pakete zu laden, wird eine Ausnahme ausgelöst und das Paket wird nicht zum zweiten Mal geladen. Um dies zu vermeiden, müssen Sie Ihre Pakete so strukturieren, dass in mehr als einer Einheit keine Einheit verwendet wird.

Der Code für jede Einheit, die Sie kompilieren, muss im Paket enthalten sein. Der Compiler startet mit allen Einheiten, die Sie deklarieren, in enthält Abschnitt, aber alle anderen Einheiten, die von diesen Einheiten verwendet werden müssen auch kompiliert werden, so dass es erreichbar sein wird, sofern diese Einheiten in einem anderen Paket enthalten sind, die unter aufgeführt ist erfordert. Diese Extras sind die "implizit importierten" Einheiten. Problem ist, sie sind implizit importiert, nicht explizit in der enthält Abschnitt, wo sie bequem im Projekt-Manager auf der rechten Seite angezeigt werden. Dies bedeutet, dass Sie möglicherweise nicht bemerken, dass Ihre Einheit in einem Paket ist, und am Ende in einem anderen Paket. Dann, wenn Sie versuchen, Ihr Programm zu starten und die Pakete zu laden, brechen die Dinge. Deshalb warnt der Compiler Sie davor.

Es ist eine Warnung, und kein Fehler, aus einem Grund. Solange Sie verstehen, wie das System funktioniert, ist es technisch sicher, implizite Importe zu verwenden. Denken Sie daran, dass diese Einheiten im Paket landen, egal, ob Sie sie deklarieren oder nicht. Aber andererseits, da sie dort enden, ob Sie sie erklären oder nicht, ist es wahrscheinlich einfacher, sie nur offiziell hinzuzufügen und sich den Ärger zu sparen.

+2

(beachten Sie, dass in dem Paket nicht in der BPL bedeutet. Siehe $ weakpackageunit;) –

+1

Mason - DANKE! Dies ist der überzeugendste und prägnanteste konzeptionelle Überblick, den ich seit Beginn meiner Paketsagas gelesen habe. – Jamo

+0

Wie behandelt Delphi wiederkehrende Verweise auf grundlegende Einheiten wie SysUtils, Forms usw. in Paketen? Es scheint, als würden diese das gleiche Problem verursachen. – Jamo

10

+1 für Mason's answer. Der Ort, an dem implizit importierte Einheiten zum Problem werden, ist ein großes Projekt, bei dem es immer schwieriger wird, die Einheiten zu verfolgen, die von überall her verbunden sind.

Ich finde den besten Weg bei weitem ist ein Ordner pro Paket, und dieser Ordner enthält alle Dateien für das Paket. Wenn eine Warnung "impliziter Import" angezeigt wird, füge ich entweder das erforderliche Paket hinzu oder füge die Einheit dem Paket hinzu. Daher werden alle Einheiten in dem Paket angegeben, das sie enthält, und sie befinden sich alle im selben Ordner. Ich füge niemals Ordner zum Suchpfad hinzu, weil jedes Projekt alle seine Dateien direkt kennt.

Die Struktur ist wirklich nicht schwer zu pflegen und schützt Sie vor Problemen, wenn verschiedene Einheiten unterschiedliche Versionen einer Datei enthalten.

+0

Das klingt nach einer soliden Empfehlung - ich kann es ausprobieren! Danke für die Antwort, Cobus. Sehr geschätzt. – Jamo