تضمين ملف في الملف التنفيذي في Resource
#1
باسم الله الرحمان الرحيم

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

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

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

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

http://delphi4arab.net/forum/showthread.php?tid=39
https://delphi4arab.net/forum/showthread...t=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 حتى يمكننا استدعائه
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 2 users say قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ, Delphi4Us
الرد
#2
الآن إلى الأهم بعدما أنشئنا الملف 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]
في الاخير كلمة طيبة تكفي
‏اللّهمّ فرّج أُموراً ضَاقت بها صُدورنا وعجزت بها حيلتنا وقلّ بها صَبرنا الّلهمّ أَسعِد قلوبنا بما أنتَ أعْلَمُ بِهِ مِنّا
[-] كل من 4 users say قال شكرا ل larbiparadox على المشاركة المفيدة
  • أبو معاذ, Delphi4Us, Mr.DOS, محمد عبد العزيز
الرد
#3
بارك الله فيك يا غالي. Cool
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 2 users say قال شكرا ل أبو معاذ على المشاركة المفيدة
  • larbiparadox, Delphi4Us
الرد
#4
كفيت ووفيت جزاك الله خيرا
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 2 users say قال شكرا ل Delphi4Us على المشاركة المفيدة
  • larbiparadox, أبو معاذ
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم