“暗黙的にインポートされます” Delphiパッケージでは常に悪いことですか?

StackOverflow https://stackoverflow.com/questions/1215664

質問

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

ダイアログフォームでパッケージをコンパイルするとき(フレームを呼び出す)、パッケージ 'MyDialogForms'"に暗黙的にインポートされた" Unit 'MyFrames'という警告が表示されます

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

役に立ちましたか?

解決

問題は次のとおりです。

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

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

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

他のヒント

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

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

構造は実際に維持するのがそれほど難しくなく、異なるユニットに異なるバージョンのファイルが含まれる問題から保護します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top