المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : إستعمال ملفات الموارد resources File في Delphi


ikossan
20-Aug-2007, 01:36 PM
ملفات الموارد Ressources Files


يحتاج المبرمج في كثير من الأحيان في برامجه بعض الموارد الإضافية مثل أصوات و صور و أيقونات وعلب حوار أو غير ذلك.
لهذا الغرض يحتاج لربط ملفه مع الموارد التي سيحتاجها برنامجه إما على شكل ملفات يرفقها في مجلد, أو يرفقها داخل الملف التنفيذي.
نعم يمكنك دمج ملفات سيحتاجها البرنامج التنفيذي داخل الكود exe او تجمع داخل ملف Dll.
تقوم بربط ملف الكود البرمجي بملفات resources ذاة إمتداد res , هذه الملفات ذات الإمتداد res.* هي ملفات مصرفة Compiled تضم مجموعة من

الموارد التي سيحتاجها البرنامج الذي أنت بصدد تحريره.
ملف الموارد يمكنه أن يضم أي شيئ يمكنك أن تحتاجه:
- سلاسل محرفية Ressources String.
- قوائم Menu.
- علب حوار شخصية Dialogs Box.
- خطوط Fonts.
- أيقونات.
- معلومات عن إصدارة برنامجك Version Information.
- صور Bmp.
- المؤشرات Cursors.
- ملفات Wav.
- ملفات شخصية RCData ( فورم, Html, Video Files....).
- أو غيرها من الموارد كيفما كان نوعها ,ملفات فيديو, MP3, ملفات bynary, ملفات Dll, ملفات Vxd....

كما قلت ملف res.* هو ملف مصرف وملفه المصدري هو ملف نصي **** يحمل عادة إمتداد rc.*. يمكنك تحرير هذا الملف في أي محرر نص ASCII editor

تريده مثلا كبرنامج notepad.exe..

سنكتب به لائحة كل الموارد التي ستستعملها وفق هذا الإملاء:

ResNameOrID ResTYPE ResPathFileNameResNameOrID :هو إسم من نوع string أو عدد من صنف Integer

تميز به المورد.

ResTYPE : هو صنف المورد, هناك أصناف معرفة في ويندوز ويمكنك استعمال دوال winapi جاهزة كأصناف Icon و wave و غيرها..أسماء

الموارد المعرفة إفتراضيا في ويندوز :

. Cursor
· Animated Cursor
· Group Cursor
· Bitmap
· Icon
· Group Icon
· Menu
· Dialog
· Dialog Include
· String Table
· Message table
· Font Directory
· Font
· Accelerators Table
· RC Data (custom binary data)
· Version Information
· Plug'n'Play
· VXD[/align
]وكذلك يمكنك تعريف أنواع خاصة بك وتعطي إسما خاصا لهذا الصنف كأن تسميه html مثلا بالنسبة لمورد مكتوب للويب.

ResPathFileName :هو إسم الملف مع المسار الكامل إذا ما وجد في مجلد إخر.
مثال لملف موارد نصي:
[align=left]

support HTML "support.html"
******* HTML "*******.html"
help HTML "help.html"
bg JPG "bg.jpg"
back BMP "back.bmp"
forward BMP "forward.bmp"
home BMP "home.bmp"
next GIF "next.gif"
عند كتابة هذا النص سجله في ملف بامتداد rc مثلا MyRes.rc. ثم نقوم بتصريفه إلى ملف res.
بورلاند توفر ملف سطر الأوامر BRCC32.exe يقوم بتصريف ملفات الموارد النصي إلى ملف موارد مصرف بامتداد res.

C:\> C:\DelphiPath\BIN\BRCC32.EXE C:\ProjectPath\ MyRes.rcبعد التصريف ستحصل على ملف جديد يحمل نفس إسم ملف الموارد النصي ويحمل امتداد res .
هناك برامج لتحرير ملفات الموارد في منصة رسومية WYSIWYG و هي تقنية ما تراه هو ما ستحصل عليه : What you see is what you get
.بالنسبة لبورلاند هناك برنامجين الأول هو Image Editor وهو بسيط ولا يمكنه تحرير جميع الأصناف ويصلح فقط لصور من صنف BMP وِ Cursor و

Icons.

http://img258.imageshack.us/img258/6599/image001lb8.gif

و هناك برنامج ثاني هو RESOURCE WORKSHOP وهو يأتي مع االإصدارات السابقة لديلفي و سي++ بويلدر إصدار entreprise و professionel.

http://img48.imageshack.us/img48/1897/image003la9.jpg

البرنامجين تخلت عنهما بورلاند و لم تعد تدرجهما في توزيعاتها و اكتفت فقط ببرنامج سطر الأوامر Brcc32.exe الذي يوجد في مجلد Bin’ و هو Borland

Resource Compiler. و تنصح بورلاند

ببرنامج قوي يشبه منصة ديلفي و هو Resource Builder:
http://www.resource-builder.com/features.html

http://img48.imageshack.us/img48/2784/image005tc3.jpg


يوجد محرر مفتوح المصدر رائع وسهل يمكنك من تحرير و قرائة الموارد في الملفات rc و res و exe و dll وهو Resource Hacker وهو مجاني.

http://angusj.com/resourcehacker

http://img339.imageshack.us/img339/3791/image006sn2.gif


لنمر لتطبيق عملي باستعمال ملفات الموارد res:

كيف يمكنني إضافة ملف res و استفادة منه في البرمجة بلغة ديلفي؟
عند بدأ أي مشروع جديد ذو واجهة رسومية في الديلفي, فإن ديلفي ستنشأ ملف موارد تلقائيا يحمل نفس إسم المشروع يحتوي على أيقونة التطبيق وعلى معلومات

الأصدارة فقط.
لهذا سننشأ ملفنا الخاص بكل الموارد التي تريدها سواء ملف موارد واحد أو مجموعة ملفات موارد, وستدرجها في مجال Implementation على هذا النحو:


Implementation
{$R MyRes.res}
[/align:
ثم نعرف متغير عام قبلها في مجال Interface
[align=left]

var
Res : TResourceStream;


المتغير Res سنحتاجه عند استخلاص مورد من الموارد الخاصة.

صورة BMP:


image1.Picture.Bitmap.LoadFromResourceName(hinstan ce, 'MYBMP');
أو


Image1.Picture.Bitmap.Handle:=LoadBitmap(hInstance , 'MYBMP');


hinstance هي Instance Handle للتطبيق application.hinstance , و MYBMP هو إسم المورد داخل ملف MyRes.res الذي عرف على أنه من

صنف BMP:


MYBMP BMP c:\mypath\..\image.bmp

ألأيقونات Icon:


Form1.Icon.Handle:= LoadIcon(hInstance, ('MyIcon'));
أو


Image1.Picture.Icon.Handle:= LoadIcon(hInstance,'MyIcon');

Cursor:


// extract the Cursor from Resource
Screen.Cursors[1] := LoadCursor(HInstance, 'MyCURSoR');
button12.Cursor := 1; // assigne cursor
self.Cursor := 1; // assigne cursor
form1.cursor:=1; // assigne cursor

ملف صوت Wave :


procedure PlayWaveRes;
var
Hres: THandle;
Pres: PChar;
begin
Hres := FindResource(0, pchar('MyWAV'), 'WAV'); // search the Resource
Hres := LoadResource(0, Hres); // load it
Pres := LockResource(Hres);
sndPlaySound(Pres, SND_MEMORY); // play the sound WAV
UnLockResource(Hres);
FreeResource(Hres);
end;



ملف MP3 :


procedure PlayMp3Res;
begin
Res := TResourceStream.Create(0,'MyMP3','MP3');
Res.SaveToFile(ExtractFilePath(Application.ExeName ) + 'my.mp3');
Res.Free;

Mediaplayer1.Close; // Mediaplayer1 is TMediaPlayer
Mediaplayer1.FileName := 'my.mp3';
Mediaplayer1.Open;
Mediaplayer1.Play;

end ; // in OnClose event of TForm, set Mediaplayer1.Close.


ملف نص ****:


Res := TResourceStream.Create(0,'MyTXT','****');
Memo****e.Lines.LoadFromStream(Res);
Res.Free;




صورةJPEG :


uses jpeg;

procedure PlayMp3Res;
var
jpg: TjpegImage;
begin
jpg := TJPEGimage.Create;
Res := TResourceStream.Create(hinstance, 'MyJPEG', RT_RCDATA);
Jpg.LoadFromStream(Res);
Image1.Picture.Bitmap.Assign(jpg);
Res.Free;
jpg.Free;
end ;
والأمثلة كثيرة جدا .. أرجو أن أكون قد لخصت فوائد إستعمال الموارد في البرمجة عامة و ديلفي خاصة.

Dr. Mohamed
02-Sep-2007, 08:14 AM
مشكور اخى الكريم على الموضوع واهلا بك فى هذا الصرح الطيبب بين اخوانك وفى انتظار المزيد من الابداعات


احترامى