3

リソースファイル内をループして、次のステートメントですべてのBMPファイルをロードする必要があります。bBitmap.Handle := LoadBitmap(hInstance, 'IMAGE_NAME');

リソースファイルをループするにはどうすればよいですか。通常のIO操作を実行して、テキストファイルのように扱う必要がありますか?別のループで上記のステートメントを実行してビットマップをロードするよりも、各行を読み取ってビットマップ名のリストを作成できます。または、この操作を実行するための組み込みメソッドがDelphiライブラリにありますか?

FILE_NAME_1 BITMAP "btnFile1.bmp"
FILE_NAME_2 BITMAP"btnFile2.bmp"
...。

4

2 に答える 2

5

Delphi のインストールに含まれている Resource Explorer のデモをご覧になることをお勧めします。「c:\Users\Public\Documents\RAD Studio\9.0\Samples\Delphi\VCL\resXplor\resxplor.dpr」にあります (別のパス/Delphi バージョンに合わせて調整してください)。ExeImage.pas ファイルには、リソースを TPicture などに簡単に割り当てることができるクラスがあります。

于 2012-12-03T23:23:10.443 に答える
2

Ken White によって提案された EnumResourceNames は完全に機能し、実装は非常に簡単です。彼はコメントだけを残したので、答えとして受け入れることができませんでした。

これが提案を使用した私の解決策です。

画像をロードする手順内に、次のコード行を追加しました。

var
  returnVal:bool;
  hMdl: HMODULE;
begin
  hMdl:=LoadLibraryEX('FileNameWithResources.exe',0,LOAD_LIBRARY_AS_DATAFILE);
  // I load bitmaps so RT_BITMAP parameter is chosen
  returnVal:=EnumResourceNames(hMdl,RT_BITMAP,@Callback,0);

@callback 関数はブール値を返します。クラスの実装コードの前に、これをクラスレベルに配置する必要があります。それについての宣言はありません。私のクラスはシングルトンなので、クラス レベルの手順を呼び出して TStringList に値を追加します。より複雑な if ステートメントがあり、すべてをループしたい場合は、false を返さないでください。いつでも false を返すと、この関数の呼び出しが終了し、残りのリソース名を取得できなくなります。

function Callback(handle:THandle;ResType:PChar;ResName:Pchar;long:Lparam):bool;stdcall;
var
      tempString: string;    
begin  
      tempString := resname;
      if length(tempString) > 0 then begin
        MyClassName.AddToResourceNames(tempString);
        result := true;
      end else
        result := false;
end;
于 2012-12-04T17:20:20.127 に答える