# Native Code > برنامه نویسی در Delphi > مقالات مرتبط با Delphi/Win32 > مقاله: ساخت فایلهای Resource و استفاده از آنها

## Mahmood_M

با سلام ...
چند روز پیش مقاله ای در وبلاگم قرار دادم ، گفتم بد نیست در این سایت هم گذاشته بشه تا شاید نیازی از دوستان برطرف کنه ...
در این مقاله در مورد ساخت و استفاده از فایلهای Resource بحث خواهیم کرد ...
فایلهای رسورس همانطور که می دانید ، روشی مناسب برای قرار دادن چند فایل در کنار فایل exe برنامه می باشند ، درواقع با این روش ، یک فایل exe خواهیم داشت ، اما چند فایل مورد نیاز را هم در درون آن قرار داده ایم که به راحتی قابل استفاده اند ...
مثل همیشه برای فهم بهتر ، یک پروژه ی نمونه را بررسی میکنیم ...
خوب قصد داریم یک فایل Bmp ، یک فایل Cursor موس ، یک فایل آیکون و یک فایل Mp3 را در داخل فایل Exe خود قرار دهیم ...

*ساخت فایل Resource* :
برای ساخت و کامپایل یک فایل رسورس دو مرحله ی ساده در پیش داریم :
نوشتن لیست فایلها در یک فایل متنی و ساخت فایل RC ( یک فایل Resource Script )کامپایل فایل RC ساخته شده توسط برنامه ی کامپایلر رسورس دلفی ( brcc32.exe ) و ساخت فایل RES نهایی
تنها مطلبی که باید به آن توجه شود ، نحوه نوشتن لیست فایلها در فایل متنی است ، ترتیب نوشتن مشخصات فایل در لیست به صورت زیر است :
ResName   ResType   FileNameتوضیح مشخصات بالا را در زیر خواهید یافت ! :
*ResName* : در دلفی ، برای تک تک فایلهای قرار داده شده در فایل Resource باید یک نام انتخاب کنیم ، درواقع نام امکانی برای شناخت فایل در داخل فایل رسورس است ، به عنوان مثال فرض کنید یک فایل BMP در داخل فایل گذاشته اید ، اگر MyBitmap را به عنوان نام فایل در داخل فایل رسورس انتخاب نمایید ، در دلفی به وسیله ی همین نام می توانید به آن دسترسی داشته باشید . پس در ابتدای مشخصات باید نام فایل مورد نظر در فایل رسورس را وارد نماییم ...*ResType* : دلفی برای هرنوع فایل در فایل رسورس یک " نوع " مشخص میکند ، به وسیله ی این مشخصه ، به دلفی می فهمانیم ! که فایل ما یک نوع خاص است ، به عنوان مثال برای فایلهای BMP نوع BITMAP قرار داده میشود ، انواع مختلف برای فایلهای رسورس را در ادامه خواهید شناخت . پس در قسمت دوم هم باید نوع فایل را مشخص نماییم ...*FileName* : در این قسمت هم باید نام و مسیر فایلی که می خواهیم در فایل رسورس قرار داده شوند را وارد می نماییم ...
خوب ، میخواستیم یک فایل BMP ، یک کرسر موس ، یک آیکون و یک فایل MP3 را در داخل فایل رسورس قرار دهیم ، لیست زیر بدین منظور مناسب به نظر میرسد :

MYBITMAP BITMAP mybitmap.bmp
MYICON ICON myicon.ico
MYCURSOR CURSOR mycursor.cur
MYMP3 RCDATA mymp3.mp3
به نوع فایلها در لیست بالا توجه کنید ، برای فایلهایی نظیر فایلهای MP3 که اطلاعات در آنها به شکل باینری ذخیره میشود از مقدار RCDATA به عنوان نوع فایل استفاده مینماییم ...
توجه کنید که در لیست بالا فرض را بر این گذاشتیم که تمام فایلهای معرفی شده در پوشه ی پروژه قرار دارند ، یعنی همان پوشه ای که فایل RC در آن خواهد بود ، در غیر اینصورت باید آدرس فایل را به صورت کامل وارد نماییم ، به عنوان مثال :
MYBITMAP BITMAP c:\Windows\mybitmap.bmpیا
MYBITMAP BITMAP "c:\Windows\mybitmap.bmp"خوب ، بعد از نوشتن لیست فایلها ، نوبت به ساخت فایل RC می رسد ، ساخت این فایل به سادگی تغییر پسوند یک فایل متنی است !! ...
برای ساخت فایل RC ابتدا فایل متنی حاوی لیست فایلها را ذخیره نمایید ، حال پسوند آن را از txt به rc  تغییر دهید ، بدین صورت فایل RC ساخته می شود ، حال باید دستور ساخت فایل RES را به کامپایلر دلفی ارسال کنیم ...
کامپایلری که فایلهای RC را کامپایل کرده و فایل Resource را می سازد نامش brcc32 است که همراه دلفی و در پوشه ی bin آن قرار دارد ...
برای استفاده از این فایل تنها کافی است برنامه ی Command Prompt ویندوز را اجرا کرده و دستور اجرای فایل brcc32 را همراه با مسیر فایل RC به عنوان پارامتر اجرا به آن بدهیم ...
اگر فرض کنیم که فایل RC در درایو D و در پوشه ی Resources قرار دارد و نامش هم MyResource.rc است ! ، دستور ما به شکل زیر در خواهد آمد :
*brcc32 D:\Resources\MyResource.rc*
این دستور برنامه ی brcc32 را اجرا کرده و این برنامه دستور فایل Resource شما را در همان پوشه ای که فایل RC قرار دارد خواهد ساخت ...
از مسیر " Start > All Programs > Accessories " برنامه ی Command Prompt را اجرا نمایید و دستور بالا را در آن بنویسید و کلید Enter را بفشارید ... !
برای اجرای برنامه ی Command Prompt همچنین می توانید در پنجره ی Run عبارت cmd را نوشته و کلید Enter را بفشارید ... !!
توجه کنید که برنامه ی brcc32 یک برنامه ی Consol است و در همان پنجره ی Command Prompt اجرا خواهد شد ، پس انتظار روبرو شدن با یک پنجره ی جدا ی مربوط به آن را نداشته باشید ، همچنین اگر خطایی در هنگام کامپایل پروژه اتفاق افتد ، در همان پنجره ی Command Prompt نمایش داده خواهد شد ، به عنوان مثال اگر یکی از فایلهایی که در لیست فایل RC وارد کرده اید ، در مسیر وارد شده وجود نداشته باشد ، پیغامی مانند پیغام زیر در پنجره نمایش داده خواهد شد :
------------------------------------------------------------------

------------------------------------------------------------------در تصویر بالا همانطور که مشاهده میکنید ، فایل mybitmap.bmp در مسیر وارد شده وجود نداشته و پیغام خطایی به همین منظور نمایش داده شده است ..
اگر تمام مراحل کامپایل به درسی و بدون خطا انجام شود ، با تصویر زیر روبرو خواهید شد ! :
------------------------------------------------------------------

------------------------------------------------------------------پس از پایان کامپایل ، فایل رسورس با همان نام فایل RC و با پسوند res در همان پوشه ای که فایل RC قرار دارد ساخته خواهد شد ...
خوب ، تا اینجا فایل رسورس را ساختیم ، حال نوبت به استفاده از فایل رسورس میرسد ...

*استفاده از فایل Resource* :
اولین قدم در استفاده از فایلهای Resource اطلاع دادن به کامپایلر دلفی در مورد استفاده از فایل Resource است !
برای اینکه یک فایل Resource را در فایل Exe قرار دهیم ، باید آن را همراه برنامه کامپایل نماییم ، بدین منظور باید از دستور زیر استفاده نماییم :
{$R MyResource.res}با این کار فایل MyResource.res به عنوان یک فایل Resource همراه برنامه کامپایل شده و درون فایل Exe قرار میگیرد ...
اگر به سورس پروژه ی خود توجه کرده باشید ، خطی با مقدار " R *.DFM$ " خواهید یافت ، این دستور به کامپایلر دلفی اعلام میکند که تمام فایلهای DFM همراه پروژه را در درون فایل Exe قرار دهد ، به طور کلی دستور R$ برای اعلام قرار دادن فایل رسورس در برنامه ، به کامپایلر به کار میرود ...
اما در مورد روشهای استفاده از فایلهای درون Resource :
روشهای مختلفی برای استفاده از فایلهای رسورس وجود دارد و نمی توان یک روش کلی بیان کرد ، به طور کلی نحوه استفاده از این فایلها به نوع فایل درون Resource یا کامپوننت یا ابزاری که به فایل قرار داده شده در فایل Resource احتیاج دارد ، بستگی دارد ... !
در اینجا ما چند روش متداول برای استفاده از 4 نوع فایل BMP ، کرسر موس ، آیکون و MP3 را بررسی خواهیم کرد ...
استفاده از فایلهای BMP :
یکی از راههای استفاده از فایلهای BMP به صورت زیر است :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyBmp : TBitmap;
begin
 MyBmp := TBitmap.Create;
 MyBmp.LoadFromResourceName(hInstance, 'MYBITMAP');
end;

کلاس TBitmap تابعی به نام LoadFromResourceName در اختیار میگذارد ، که به وسیله ی آن می توانیم فایلی را از درون فایل Resource لود کرده و درون نمونه ی ساخته شده از نوع TBitmap قرار دهیم ...
در کد بالا ابتدا یک نمونه از نوع TBitmap ساخته می شود و سپس توسط تابع مذکور فایل Bmp لود شده به آن نسبت داده میشود و بعد این کار فایل BMP قابل استفاده خواهد بود ...

به عبارت hInstance در کد بالا توجه کنید ، همانطور که میدانید در تابع مذکورد ، پارامتر اول مربوط به هندلی است که فایل رسورس لود شده در آن قرار دارد ...
اساس کار ویندوز این است که با اجرای یک برنامه به آن آدرسی به عنوان Instance Handle می دهد و برنامه ی اجرا شده هم این مقدار را به عنوان Handle برنامه ( و سایر مواردی که توسط برنامه لود شده اند ) گرفته و در هنگام Create کردن اشیاء ( فرم ها ) این مقدار را در خاصیت hInstance آنها قرار می دهد ( برای اینکه از بحث اصلی دور نشویم ، بهتر است برای کسب اطلاعات بیشتر در این مورد به راهنماهای کثیرالانتشار !! مثل Windows SDK مراجعه کنید ! ) ...
فقط به عنوان یک نکته باید گفته شود که برنامه ما و هر فایل رسورس یا DLL ای که همراه برنامه قرار دارد و توسط آن لود می شود دارای Instance یکسان هستند و همانطور که میدانید ، فایلهای رسورس که همراه برنامه کامپایل شده اند ، با شروع به کار برنامه ، لود شده و Instance به آنها تعلق می گیرد !
امیدوارم با hInstance آشنا شده باشید ، در هنگام استفاده از فایلهای رسورس از این عبارت زیاد استفاده خواهید کرد ...

خوب ، راهی دیگر برای استفاده از فایل BMP درون فایل Resource ، لود مستقیم آن درون یک TImage است :

Image1.Picture.Bitmap.LoadFromResourceName(hInctan  ce, 'MyBitmap');

روش دیگر برای استفاده از فایلهای BMP درون فایل رسورس استفاده از تابع LoadBitmap است که نحوه ی استفاده از آن را در زیر می بینید :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyBmp : TBitmap;
begin
 MyBmp := TBitmap.Create;
 MyBmp.Handle := LoadBitmap(hInstance, 'MYBITMAP');
end;

استفاده از فایلهای Icon :
برای استفاده از فایل Icon می توانید یک نمونه از TIcon را ساخته و سپس با استفاده از LoadIcon آیکون مورد نظر را به آن نسبت دهید :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyIcon : TIcon;
begin
 MyIcon := TIcon.Create;
 MyIcon.Handle := LoadIcon(hInstance, 'MYICON');
end;

بعد از لود آیکون می توانید به راحتی از آن استفاده نمایید ، به عنوان مثال :

Form1.Icon := MyIcon;

استفاده از فایلهای Cursor :
برای استفاده از فایلهای کرسر باید به یک نکته ی مهم توجه نمایید :
دلفی کلاسی به نام Screen را در اختیار ما قرار می دهد ، این کلاس درواقع نوعی رابط بین برنامه ی ما و صفحه ی ویندوز است !
برای اینکه یک Cursor را در برنامه ی خود استفاده نماییم باید ابتدا آن را به یکی از کرسرهای صفحه ی ویندوز توسط Screen مربوط سازیم و سپس آن را به عنوان کرسر برنامه قرار دهیم ، صفحه نمایش ویندوز برای هر کرسر یک مقدار عددی قرار می دهد که برنامه ها به وسیله ی این مقدار عددی کرسر خود را مشخص مینمایند ، به کد زیر دقت کنید :

const
 MyCursor = 2;
...
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Screen.Cursors[MyCursor] := LoadCursor(hInstance, 'MYCURSOR');
 Form1.Cursor := MyCursor;
end;

ابتدا یک ثابت عددی به نام MyCursor تعریف کردیم ( این ثابت را به صورت Global تعریف کنید ، مثلا در قسمت Public فرم ) با مقدار 2 ، در رویداد کلیک یک دکمه ( به عنوان مثال ) کرسر شماره ی 2 مربوط به Screen را برابر با کرسر مورد نظر در فایل Resource قرار دادیم ( توجه کنید که تایع LoadCursor وظیفه ی لود یک فایل کرسر از فایل رسورس را بر عهده دارد ) ، سپس کرسر فرم خود را به آن نسبت دادیم ...
...
استفاده از فایلهای MP3 ( باینری یا RCDATA ) :
در آخر به نحوه ی استفاده از فایلهای MP3 یا به طور کلی فایلهای از نوع RCDATA می رسیم ...
برای استفاده از فایلهایی که با نوع RCDATA در فایل Resource ذخیره میشوند ، معمولا از یک ResourceStream استفاده میکنیم ، نکته ی دیگر اینکه معمولا باید این فایلها را ابتدا در جایی ذخیره کرده و سپس استفاده نماییم ، به عنوان مثال کد زیر نحوه ی ذخیره ی یک فایل به کمک TResourceStream و TFileStream را نمایش می دهد :
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 RS : TResourceStream;
 FS : TFileStream;
 FileName : string;
begin
 FileName := ExtractFilePath(Application.ExeName)+'MyMP3File.mp  3';
 RS := TResourceStream.Create(hInstance, 'MYMP3', RT_RCDATA);
 try
  FS := TFileStream.Create(FileName, fmCreate) ;
  try
   FS.CopyFrom(RS, 0) ;
  finally
   FS.Free;
  end;
 finally
  RS.Free;
 end;
end;
در کد بالا یک نمونه از TResourceStream ساخته و فایل MP3 درون فایل Resource به آن نسبت داده می شود ، سپس یک نمونه از TFileStream ساخته شده و به وسیله ی دستور CopyFrom اطلاعات ResourceStream درون فایل ساخته شده ریخته می شود ، در نهایت هر دو نمونه با دستور Free آزاد شده و چیزی که باقی می ماند یک فایل MP3 ساخته شده درون پوشه ی برنامه است که به مسیر و نام آن به وسیله ی متغیر FileName  دسترسی خواهیم داشت ...

امیدوارم مفید بوده باشه ، موفق و پیروز باشید ...

----------


## BORHAN TEC

خيلي مفيد بود.
البته در دلفي 2009 به بعد اضافه كردن ريسورسها به برنامه خيلي راحتتر شده!!! كافيه كه به منوي Project برويد و گزينه Resources رو انتخاب كنيد. به همين سادگي!!!  :قلب:

----------


## AliReza Vafakhah

با تشکر از آقای مهری 

دوستان برای ساخت فایل های ریسورس من نرم افزار Resource Builder رو پیشنهاد میکنم .
واقعا عالی هست ریسورس های سازگار با هر زبان برنامه نویسی که بخواهید درست میکنه (حتی Compile کردن ریسورس!)

*صفحه اصلی نرم افزار*

----------


## sajioo

> برای استفاده از فایلهایی که با نوع RCDATA در فایل Resource ذخیره میشوند ، معمولا از یک ResourceStream استفاده میکنیم ، نکته ی دیگر اینکه معمولا باید این فایلها را ابتدا در جایی ذخیره کرده و سپس استفاده نماییم ،


سلام
واقعا باید از مطلب مفید شما تشکر کنم. 1 درخواست و2 سوال داشتم.
اینکه آیا می شه فایل رو ذخیره نکرد و مستقیم با یک مدیا پلیر اجراش کرد یا نه؟
اگه میشه چطور؟
دوم اینکه اگه میشه یک نمونه هم از فایل های pdf  قرار بدین . خیلی ممنون.

----------


## sajioo

سلام
بچه های برای استفاده از فایب pdf باید چی بنویسم ؟ کسی بلده؟ مثلا برای mp3  نوشتم RCdata .

----------


## Emdad2001

ممنون Mahmood_M 

اگه میشه نحوه استفاده فونت رو هم بگید ممنون میشم

----------

