TResourceStream は使えます。ただ、VCL だと TBitmap や TJpegImage に LoadFromResourceName() メソッドがあるのですが、FMX の TBitmap にはそれがありません。ここはクラスヘルパの出番のようです。
[FMX.ResourceHelper.pas]
unit FMX.ResourceHelper;
interface
uses System.Classes, System.Types, FMX.Types;
{$DEFINE USE_BITMAPHELPER}
{$IFDEF USE_BITMAPHELPER} type TBitmapExtention = class helper for TBitmap public procedure LoadFromResourceName(Instance: THandle; const Name: string; ResType: PChar = RT_RCDATA); end; {$ENDIF}
function LoadFromResource(Bitmap: TBitmap; Instance: THandle; const ResName: string; ResType: PChar = RT_RCDATA): Boolean;
function ResourceToFile(const FileName: string; Instance: THandle; const ResName: string; ResType: PChar = RT_RCDATA): Boolean;
const RT_CURSOR = PChar(1); RT_BITMAP = PChar(2); RT_ICON = PChar(3); RT_MENU = PChar(4); RT_DIALOG = PChar(5); RT_STRING = PChar(6); RT_FONTDIR = PChar(7); RT_FONT = PChar(8); RT_ACCELERATOR = PChar(9); RT_MESSAGETABLE = PChar(11); {$IFDEF MSWINDOWS} {$EXTERNALSYM RT_CURSOR} {$EXTERNALSYM RT_BITMAP} {$EXTERNALSYM RT_ICON} {$EXTERNALSYM RT_MENU} {$EXTERNALSYM RT_DIALOG} {$EXTERNALSYM RT_STRING} {$EXTERNALSYM RT_FONTDIR} {$EXTERNALSYM RT_FONT} {$EXTERNALSYM RT_ACCELERATOR} {$EXTERNALSYM RT_MESSAGETABLE} {$ENDIF}
implementation
{$IFDEF USE_BITMAPHELPER} { TBitmapExtention }
procedure TBitmapExtention.LoadFromResourceName(Instance: THandle; const Name: string; ResType: PChar); begin LoadFromResource(Self, Instance, Name, ResType); end; {$ENDIF}
{ Functions }
function LoadFromResource(Bitmap: TBitmap; Instance: THandle; const ResName: string; ResType: PChar): Boolean; var rs: TResourceStream; begin result := False; rs := TResourceStream.Create(Instance, ResName, ResType); try Bitmap.LoadFromStream(rs); result := True; finally rs.Free; end; end;
function ResourceToFile(const FileName: string; Instance: THandle; const ResName: string; ResType: PChar): Boolean; var rs: TResourceStream; begin result := False; rs := TResourceStream.Create(Instance, ResName, ResType); try rs.SaveToFile(FileName); result := True; finally rs.Free; end; end; end.
既存の TBitmap のクラスヘルパとバッティングするようであれば、{$DEFINE USE_BITMAPHELPER} をコメントアウトして、関数版の LoadFromResource() を使うといいでしょう。オマケで、リソースをファイルとして保存する ResourceToFile() 関数も含まれています。
uses ..., FMX.ResourceHelper;
procedure TForm1.Button1Click(Sender: TObject); begin Image1.Bitmap.LoadFromResourceName(HInstance, 'CLAUDIA'); // クラスヘルパ版 //LoadFromResource(Image1.Bitmap, HInstance, 'CLAUDIA'); // 関数版 end;
上記コードはリソースから Image1 (TImage) に PNG 画像 (RCDATA: "CLAUDIA") をロードします。
もちろん OS X でも動作します。
|