2

カスタム コンポーネントのパッケージを作成しています。このパッケージにより、ユーザー/開発者は、このカスタム コントロールで動作するように明示的に設計された多数の事前に作成されたユニットをプロジェクトに含めるか、独自のユニットを作成して既存のものの 1 つと同じことを行うことができます。コードが独自のユニットに実装され、特定のオブジェクトを継承し、その共通オブジェクトのカスタム実装を行う「プラグイン」のようなものと考えてください。

各「プラグイン」ユニットの最後にはinitialization、このクラスをグローバル リストに登録する句があります。そのユニットがプロジェクト内のどこかで「使用」されている限り、グローバル リストに登録されます。このカスタム コントロールは、このカスタム コントロールを使用して、可能なすべての「プラグイン」ユニットのリストを作成します。

たとえば、次のカスタム コントロールには次のプロパティがあります。

property PluginIndex: Integer read FPluginIndex write SetPluginIndex;

initialization内部的には、このインデックスは、対応するユニットのセクション内から登録された「プラグイン」の 1 つに対応しています。

これらの「プラグイン」は、最初の使用時に次のようにインスタンス化されるグローバル オブジェクトを介して登録されます。

function Plugins: TMyPluginList;

implementation

var
  _Plugins: TMyPluginList;

function Plugins: TMyPluginList;
begin
  if _Plugins= nil then
    _Plugins:= TMyPluginList.Create;
  Result:= _Plugins;
end;

問題は、コントロールがパッケージ内に実装されている (そして IDE にインストールされている) ため、「プラグイン」ユニットが別のプロジェクト内から「使用」されているため、パッケージがこれらのユニットの存在を検出しないことです。したがって、このカスタム コントロールも、まったく異なるコンテキストにあるため、グローバル リストにアクセスできません。

設計時にフォーム上でこのコントロールを操作するときに、これPluginIndexを設計時に設定すると、グローバル リストに「プラグイン」が登録されていないため、失敗します。ただし、実行時に同じプロパティを割り当てると問題なく機能します。

このカスタム コントロール (各「プラグイン」ユニットのクライアント使用に依存する) を使用するアプリケーションが、使用されているこれらのユニットを実際に検出できるようにするにはどうすればよいですか?


編集

私がやっていることの最終目標は、この単一のカスタム コントロールをフォームに単純にドロップし、同じフォームで特定のユニットを「使用」させ、最後にこの単一のカスタム コントロール インスタンスで、そのインデックスを選択できるようにすることです。いつでも実際に使用する「プラグイン」の。開発者がこのカスタム コントロールを簡単に削除できるように、できるだけ多くのプロセスをカプセル化して自動化しようとしています。これを機能させるために他の多くのコードを記述する必要はありません。


編集

これは、これらの「プラグイン」ユニットがパッケージの一部であると解釈される可能性があることを認識しています。そうではありません。現在、設計時に正しく機能させるために、これらの「プラグイン」ユニットをパッケージに追加する以外に選択肢はありませんが、パッケージの一部にしたくはなく、このカスタムを使用する開発者次第です。コントロール。アプリケーションで「使用」するだけで、事前に作成された「プラグイン」ユニットとカスタムメイドのユニットの組み合わせを追加できます。

4

0 に答える 0