2011-08-29 10 views
17

私はいくつかのコンパイルされたDelphiアプリケーション(20種類以上のexeとdllファイル)からなるプロジェクトに取り組んでおり、60以上の画像(16x16,24x24,32x32 、...)すべての間。いくつかのアプリケーション間で画像を共有する最良の方法


アイデア1:私はすべてのアプリケーション間で画像を共有する2つの異なる方法にかかわらましたが、私が優れているか分からない

は、資源を作成します。すべての画像を含む.resファイルへのリソースリンク参照を含むDLLプロジェクトのみです。各アプリケーションはdllをロードし、必要に応じてTImageListまたはTImageに必要なイメージを読み込みます。

長所:画像をリポジトリ内のネイティブ形式で保存することができます。

短所:デザイン時に画像が表示されるのは、実行時にのみ読み込まれるためです。また、イメージと同じ数の定数を作成するか、イメージと同じ数の値を持つセットを使用して、各イメージをリソースファイルの名前とは別に参照できるようにする必要があります。


アイデア2:

BPLとしてコンパイルし、すべてのアプリケーションの実行時のパッケージとして含まれているデータモジュールを作成します。画像をいくつかのTImageList(画像のサイズに依存)やTPngImageList(単一のコンポーネントにいくつかのサイズの画像を入れる)に追加します。

長所:このデータモジュールを必要なすべてのアプリケーションに追加し、使用する必要があるすべての画像を設計時に表示することができます。

短所:すべての画像は、使用する必要がある場合でもメモリにロードされます。 TImageList/TPngImageListに画像を追加/変更する際に、画像の順序が変更されないようにする必要があります。すべての画像は単一の.dfmに保存されます。


アイデア3:(新)

もコンパイルされたexeの間でイメージを共有する必要がある他のアプリケーションを見た後、私はまだ別のアイデアを持っていました。 すべての共有イメージを、コンパイル済みのファイルがあるサブフォルダ(例:Data)のプレーンpng/icoファイルとして保存します。

長所:すべての画像をメモリに読み込む必要はありません。必要なものを取得できます。これは、イメージの総数がかなり多い場合(この方法を使用する1つのアプリケーションではDataサブフォルダに1400個のイメージがある)、特に重要です。

短所:画像は誰にでも見える/利用可能になります。ユーザーのマシン上でもう少しディスク容量を使い切ることができます。


この2つのアイデアについてのコメントや、これをよりうまく達成する方法に関する他の提案をお願いしたいと思います。

ありがとうございます!

+0

アイデア2について:実行時に必要としないイメージを解放することはできますか? – Jeff

+0

実行時に不要なイメージを簡単に解放することはできません。主にTImageListから不要なイメージを削除すると、コントロールに割り当てられたイメージインデックスが正しくないためです誰がTImageListを使用しますか。 – smartins

答えて

11

私はオプション1を強く好みます。このようにすると、イメージをレビジョンコントロールリポジトリのネイティブフォーマットで保存できます。オプション2を使用すると、画像が.dfmファイルに保存されますが、これは非常に不満足です。欠点は、画像のデザインタイムを失うことです。私は個人的にそのトレードオフを好む。

私のソフトウェアでは、私は実行時にリソースから読み込むことでデータを取り込む単一のグローバルイメージリストを持っています。もちろん、実行時にイメージインデックスも割り当てられます。これがもたらすもう1つの利点は、フォントスケーリングに適した画像サイズを選択できることです。それ以外の場合は、16pxアイコン、20pxアイコン、24pxアイコン、32pxアイコンなどの別のイメージリストを持つ必要があります。

+0

あなたの答えはDavidに感謝します。私は各ソリューションがどのようにリポジトリに格納されるかについては考えていませんでしたが、あなたはアイデア2のもう一つの欠点であるdfm問題について有効な点を作っています。これも含めて質問を編集します。 – smartins

7

別のオプションは、追加のプロパティが呼び出された独自のTImageコンポーネントを作成することです。

property dllname: string read fdllname write set_dllname; 
property resname: string read fresname write set_resname; 

セッターの手順では、リソースからイメージをロードします。
このようにしても、デザイン時にイメージを見ることができます。

dfmファイルにイメージを保存するためのメカニズムをオーバーライドしてください。これにより、exeファイルが既にdllにあるイメージで膨大にならないようにします。

これを行う方法は100%ではありませんが、そのルートをたどりたい場合は、誰かがその質問に簡単に答えてくれると確信しています。

+0

にfalseを指定することもできるプロパティの 'stored'指示文がありませんか? –

+0

@Marjan、よろしくお願いします。参照:http://stackoverflow.com/questions/2072096/stored-keyword-in-delphi – Johan

関連する問題