19

パッケージを一連のTFrame 子孫コンポーネント用に再配置しようとしていますが、主に前者が true としてパレットに登録されているため、ユーティリティ TFrame 子孫の一部を、それらを使用するダイアログ フォームから分離する必要があるようです。コンポーネントを使用するダイアログ フォームに関して、IDE を混乱させることがあるようです。次に、ダイアログ フォームは、3 番目のパッケージの一部である非ビジュアル コンポーネントによって呼び出されます。これにより、これまでのところ、コンパイラの依存関係に関連する苦情/混乱のほとんどが解消されるようです。(ただし、私はまだ外出していません)。

(フレームを呼び出す)ダイアログ フォームを使用してパッケージをコンパイルすると、「ユニット 'MyFrames' が暗黙的にパッケージ 'MyDialogForms' にインポートされました」という警告が表示されます。

コンパイラの警告として表示されることを考えると、私はずっと前に、ユニットを「暗黙的にインポートする」ことは一般的に良いことではないという印象を受けました。そうでない特定の例はありますか? つまり、ユニットを暗黙的にインポートしても問題ない場合、および/または適切なプラクティスはどこですか?...もしそうなら、それらの特定のケースは何ですか?

4

2 に答える 2

30

問題は次のとおりです。

プログラム内にユニットのコピーを 1 つだけ持つことができます。パッケージを介して同じユニットを 2 回ロードしようとすると、例外が発生し、パッケージは 2 回目はロードされません。これを回避する方法は、ユニットが複数のパッケージで使用されないようにパッケージを構成することです。

コンパイルするすべてのユニットのコードは、パッケージに含まれている必要があります。コンパイラは、 containsセクションで宣言したすべてのユニットで開始しますが、これらのユニットで使用される他のユニットもコンパイルする必要があるため、これらのユニットがrequiresの下にリストされている別のパッケージに含まれていない限り、到達可能になります。これらのエクストラは、「暗黙的にインポートされた」ユニットです。問題は、それらが暗黙的にインポートされ、 contains に明示的に記載されていないことです。プロジェクト マネージャーの右側に便利に表示されるセクションです。これは、ユニットがパッケージに入っていることに気付かず、別のパッケージに入れられてしまう可能性があることを意味します。次に、プログラムを実行してパッケージをロードしようとすると、問題が発生します。そのため、コンパイラはそれについて警告します。

これは警告であり、エラーではありません。理由があります。システムの仕組みを理解している限り、暗黙的なインポートを使用しても技術的に安全です。これらのユニットは、宣言するかどうかにかかわらず、最終的にパッケージに含まれることを覚えておいてください。しかし、繰り返しになりますが、宣言するかどうかに関係なく、最終的にはそこにあるため、公式に追加して手間を省く方がおそらく簡単です。

于 2009-08-01T03:36:54.893 に答える
10

メイソンの答えに+1 。暗黙的にインポートされたユニットが問題になる場所は、どこからでもリンクされているユニットを追跡することが指数関数的に難しくなる大規模なプロジェクトです。

パッケージごとにフォルダーを作成し、そのフォルダーにパッケージのすべてのファイルを格納するのが、断然最善の方法だと思います。「暗黙のインポート」の警告が表示された場合は、必要なパッケージを追加するか、ユニットをパッケージに追加します。したがって、すべてのユニットはそれらを含むパッケージで指定され、それらはすべて同じフォルダーにあります。すべてのプロジェクトがすべてのファイルを直接認識しているため、フォルダーを検索パスに追加することはありません。

この構造は維持するのがそれほど難しくなく、異なるユニットに異なるバージョンのファイルが含まれるという問題からあなたを守ります。

于 2009-08-01T08:05:50.933 に答える