delphi4arab منتديات دلفي للعرب
تضمين ملف في الملف التنفيذي في Resource - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : تضمين ملف في الملف التنفيذي في Resource (/showthread.php?tid=11482)



تضمين ملف في الملف التنفيذي في Resource - larbiparadox - 29-08-2021

باسم الله الرحمان الرحيم

السلام عليكم ورحمة الله وبركاته

كيفية دمج ملف سواء كان : خط ، dll ، او صوت ، صورة ، ايقونة

يوجد من سبقني في شرح هذا الموضوع ، لكن أردت أضع له لمسة خاصة بي كيفية إضافة خط في الملف التنفيذي

مواضيع سابقة :

http://delphi4arab.net/forum/showthread.php?tid=39
https://delphi4arab.net/forum/showthread.php?tid=2303&highlight=Resource

01 - قبل دمج أي ملف يجب إنشاء ملف res ، الملف المسؤول عن إنشاء هذا ملف هو brcc32.exe الموجود في ملفات الدلفي يختلف المسار حسب نسخة الدلفي المثبة مثال 10.4
كود :
C:\Program Files (x86)\Embarcadero\Studio\21.0\bin

قبل إنشاء هذا الملف نشرح كيف يكون في الملف التنفيذي :

نفتح الملف التنفيذي بواسطة برنامج Resource Hacker

لتحميل البرنامج
http://www.angusj.com/resourcehacker/


[صورة: 682591333.jpg]

في هذا المثال يوجد فهارس كل فهرس يحتوي على مجموعة من الملفات مضمنة ، لا أريد أشرحها كلها ، كما يمكن لهذا البرنامج إعادة إستخراج إقونات و حفظها أو إضافة صور أخرى أو حذفها ، أو تعديل على الفورم

* الآن كيف أنشئ ملف res توجد عدة طرق

01 - بواسطة برنامج Resource Hacker
[صورة: 581643401.jpg]

1 لفتح نافذة الاضافة

2 نختار الملف المراد إظافته

3 إسم الفهرس الذي أضيف له الملف ، يمكن أن نختار الفهرس الخاص بالملف التنفيذي RCDATA أو إسم جديد

4 ادراج الملف

في الاخير نضغط على حفظ نعطي اسم للملف لكن التبع يكون res


الطريقة رقم 02 

بواسطة برنامج تحرير النصوص notepad أو note bloc  نكتب داخل الصفحة

كود :
MyFont1 FONT1 "bukra-bold.ttf" MyFont2 FONT1 "bukra-regular.ttf"

نشرح الكتابة :        Font1 هو إسم الفهرس و    MyFont1 و MyFont2 هو الملف المخزن بهذا الاسم

بعدها نحفظه على ملف تابعه rc يكون كالتالي MyFont.rc

عن طرق أوامر cmd كما ذكرنا في البداية الملف المسؤول عن إنشاء res هو brcc32.exe

كود :
brcc32.exe myFont.rc

تنفيذ يدوي رقم 1 ندخل المسار و بعدها 2 امر التنفيذ مع اسم ملف rc
[صورة: 824989496.jpg]

او طريقة سهلة انشاء ملف bat و وضع فيه الكود ، عند الضغط عليه مرتين ينشأه مباشرة

الطريقة رقم 03 . السهلة . بواسطة الدلفي

[صورة: 740950534.jpg]

بعد الدخول 1 و 2 بعد إدخال الملف صورة أو إقونة أو خط تكون النتيجة كما مبين في رقم 3 ، رقم 4 نوع الملف ، رقم 5 يكون للملف اسم أو id حتى يمكننا استدعائه


RE: تضمين ملف في الملف التنفيذي في Resource - larbiparadox - 29-08-2021

الآن إلى الأهم بعدما أنشئنا الملف res كيف نستدعيه

نضيفه كما هو مبين في الصورة بعد {$R *.dfm} ، ملاحظة مهمة ملف res يرفق مع المشروع و ليس مع الملف التنفيذي

ملاحظة : إذا تم ادراج من الدلفي ، كما هو مبين في الطريقة رقم 3 ، نستغني على هذه المرحلة

[صورة: 545565978.jpg]

* في هذا المثال سأشرح إدراج الخط :

- أولا اثبيت الخط في جهازي حتى يسهل إعطاء إسمه لكل مكون ، للتثبيت الضغط مرتين الخط المحمل ،   1 إسم الخط و 2 قفل الثبيت
[صورة: 406957637.jpg]

في حالة عدم تثبيته سيتوجب عليا كتابة لكل مكون كمثال
كود :
Button1.Font.Name := 'arbfonts.com-Bukra Bold';

مثال:
[صورة: 476271583.jpg]


* للان الاستدعاء :

يمكن إستخراجه من الملف للتنفيذي و وضعه بجانبه

ولاستداعاء الخط أو الملف يكفي معرفة الفهرس للموجود في و إسمه أو رقمه

كود :
procedure TForm1.FormCreate(Sender: TObject); var     ResStream : TResourceStream;     sFileName : string; begin     sFileName:=ExtractFilePath(Application.ExeName)+'bukra-bold.ttf';     ResStream:=nil;     try         ResStream:=TResourceStream.Create(hInstance, 'MyFont1', 'FONT1');         try             ResStream.SaveToFile(sFileName);         except             on E:EFCreateError Do ShowMessage(E.Message);         end;     finally         ResStream.Free;     end;     AddFontResource(PChar(sFileName));     SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); end;

بعد غلق البرنامج نقوم بحذفه

كود :
procedure TForm1.FormDestroy(Sender: TObject); var     sFile:string; begin     sFile:=ExtractFilePath(Application.ExeName)+'bukra-bold.ttf';     if FileExists(sFile) then     begin         RemoveFontResource(PChar(sFile));         SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);         DeleteFile(sFile);     end; end;


لكن الطريقة المفضلة لإستخراجه في الذاكرة و لن نحتاج الى حذفه عند الخروج


كود :
procedure TForm1.FormCreate(Sender: TObject); var LStream : TResourceStream; cFonts: DWord; begin LStream := TResourceStream.Create(HInstance, 'MyFont1', 'FONT1'); try cFonts:= 0; AddFontMemResourceEx(LStream.Memory, Cardinal(LStream.Size), nil, @cFonts); finally LStream.Free; end; end;


* بعدما أكملنا البرنامج لتأكد منه ، نحذف خط الكتابة أو تجربته في جهاز أخر
لحذفه من الجهاز ، 1 مسار مجلد الخطوط ، 2 بالضغط على الزر الايمن ثم حذف

[صورة: 148040955.jpg]

النتيجة ، الخط بدون تثييت الخط

[صورة: 249922622.jpg]
في الاخير كلمة طيبة تكفي


RE: تضمين ملف في الملف التنفيذي في Resource - أبو معاذ - 29-08-2021

بارك الله فيك يا غالي. Cool


RE: تضمين ملف في الملف التنفيذي في Resource - Delphi4Us - 30-08-2021

كفيت ووفيت جزاك الله خيرا