フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: FireMonkey アプリケーションで画像リソースファイルを使う
DEKO
管理者
投稿数: 2691
FireMonkey アプリケーションで画像リソースファイルを使う
on: 2013/05/03 02:34 Fri

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 でも動作します。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.028 sec.