0

モノリシックな Delphi-Win32 アプリをライブラリに分割しようとしています。そのため、Delphi 2009 を使用してライブラリ間でグローバル変数とオブジェクトを共有する方法についていくつか質問を受けます。たとえば、3 つのグローバル オブジェクト (TObject から派生) があります。ユーザー情報、現在のセッション情報、アクティブなデータベース接続の保存、およびこのデータベースでの操作の管理。私のライブラリでは、これらのオブジェクトを操作する必要があります。さらに、特定のライブラリは、TForm から派生したオブジェクトを別の親コントロール用にホストしてメイン フォームに提供します。メイン フォームに渡される TForm から派生したすべてのオブジェクトには、独自のメソッドとプロパティがあります。つまり、それらのクラスは互いに異なります。

グローバル オブジェクトを別のライブラリに入れることを考えていますが、それは難しくなると思いますが、ご検討ください。

この状況で仕事をする方法は?

もう 1 つ質問があります。ライブラリの静的ロードと動的ロードのどちらを使用するのがよいでしょうか。これについてもっと学ぶために、いくつかの本やサイトをお勧めできますか?

前もって感謝します。

4

3 に答える 3

2

モジュール間で変数を共有するために過去に行ったこと (BPL を使用) は、共有 TStringList を介して変数を渡すことでした。一般的に言えば、すべての共有変数を 含むグローバル共有オブジェクトを用意するのが最善です。

複数のライブラリ間で参照されるものはすべて、独自のライブラリにある必要があります。 メイソンのアドバイスは正しかった。

なんらかの特定の理由で動的が本当に必要でない限り、静的な読み込みを使用してください(そうは思えません)。Windows メモリ マネージャーが不要なライブラリをメモリからスワップ アウトするようにします。

複数のライブラリに分割された大規模なアプリケーションを管理した人からの 1 つのヒント。パッケージ、VCL、いくつかのアプリケーション共通ルーチン、そして各「画面」またはアプリケーションのセグメント用のライブラリにコンポーネントがありました。画面を変更する場合は、その 1 つの更新されたライブラリをリリースするだけで済みましたが、他のタイプのライブラリを変更する場合は、通常、すべてを再デプロイする必要があることがわかりました。そのため、構成から アドバンテージを享受することはめったにありませんでした。

于 2009-11-28T15:31:20.323 に答える
1

「ライブラリ」とはBPLパッケージを意味しているようですので、ガイドラインは次のとおりです。

各 BPL がロードされると、その中のすべてのユニットがロードされます。ユニットを複数回ロードすることはできません。つまり、複数のパッケージがいずれかのグローバルにアクセスする必要がある場合、そのグローバルは、他のパッケージのRequiresリストにある 1 つのパッケージに含まれているか、他のすべてのパッケージが Requires である別のパッケージに含まれている必要があります。

静的ロードと動的ロードについては、プログラムで絶対に必要な場合は、静的にリンクしてください。動的ロードは、プラグインなどのオプション機能用です。(そのルートに行きたい場合は、JVCL の JVPlugin を参照してください。これは非常に便利なシステムです。)

于 2009-11-28T05:41:15.077 に答える
-1

このような単純な質問に対して人々が Delphi バージョンに言及している理由がわかりません。答えは「はい」です。実装キーワードの前に共有変数を別のユニットに配置することをお勧めします。次のようなクラスを定義した場合でも、すべてのオブジェクト (フォーム、クラス、コントロール) は TObject から派生します。

type TMyClass = class
  // no inheritance ?
end;

上記のクラスは、依然として TObject から派生しています(Delphi ヘルプを参照)。グローバル変数は TObject または Pointer 型で宣言でき、それらにアクセスするときはハード キャスト TForm(MyPointerVariable).Method を使用します。

var MyPointerVariable: Pointer; // I presume it is already initialized and is a pointer to a TForm descendant
...
begin
     TForm(MyPointerVariable).Caption := 'Stack Overflow';
end;

詳細については、私のブログの Delphi チュートリアルを読んでください。理解するのは非常に簡単です。

于 2009-11-28T06:27:03.977 に答える