أحـــــلى مـــنـــتـــديـــات أمـــيـــن عـــبـــلــــة الــــحـــب
استخدام Forms وResources  في  DLLs 613623
كلام عن الحب
إن الإنسان قبـل الحب شيء وعنـد الحب كل شيء وبعـد الحب لا شيء"
أكبر متعة في الحب تجد نفسك محبوبا عند الناس
"

استخدام Forms وResources  في  DLLs 613623
عزيزي الزائر / عزيزتي الزائرة يرجي التكرم بتسجبل الدخول اذا كنت عضو معنا
او التسجيل ان لم تكن عضو وترغب في الانضمام الي اسرة المنتدي
سنتشرف بتسجيلك
شكرا استخدام Forms وResources  في  DLLs 829894
المدير المنتدى
شكراً لتسجيلك في
أحلى منتديات أمين عبلة الحب
نحن سعداء جدا لاختيارك بأن تكون واحداً من أسرتنا و نتمنى لك الاستمتاع بالإقامة معنا، تفيد وتستفيد ونأمل منك التواصل بإستمرار.
مع أطيب الأمنيات,
إدارة المدير.
أحـــــلى مـــنـــتـــديـــات أمـــيـــن عـــبـــلــــة الــــحـــب
استخدام Forms وResources  في  DLLs 613623
كلام عن الحب
إن الإنسان قبـل الحب شيء وعنـد الحب كل شيء وبعـد الحب لا شيء"
أكبر متعة في الحب تجد نفسك محبوبا عند الناس
"

استخدام Forms وResources  في  DLLs 613623
عزيزي الزائر / عزيزتي الزائرة يرجي التكرم بتسجبل الدخول اذا كنت عضو معنا
او التسجيل ان لم تكن عضو وترغب في الانضمام الي اسرة المنتدي
سنتشرف بتسجيلك
شكرا استخدام Forms وResources  في  DLLs 829894
المدير المنتدى
شكراً لتسجيلك في
أحلى منتديات أمين عبلة الحب
نحن سعداء جدا لاختيارك بأن تكون واحداً من أسرتنا و نتمنى لك الاستمتاع بالإقامة معنا، تفيد وتستفيد ونأمل منك التواصل بإستمرار.
مع أطيب الأمنيات,
إدارة المدير.
أحـــــلى مـــنـــتـــديـــات أمـــيـــن عـــبـــلــــة الــــحـــب
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.


أكـــــبر مـــــــــــــتعة في الـــــــــــحب تجـــــــــد نفـــــــسك محبــــوبا عنــــــد النــــــاس
 
الرئيسيةالبوابة**أحدث الصورالتسجيلدخول
تمنادى الحب عندما يأتى الليل ، ويغلق الناس أبواب بيوتهم بإحكام يخرج من قلب الظلمة مناد يقول : - هل كل هذه البيوت تنام على الحب ؟ ! ويظل يردد السؤال ، الذى لا يجيب عليه أحد ، حتى تظهر أول خيوط الفجر !

 

 استخدام Forms وResources في DLLs

اذهب الى الأسفل 
كاتب الموضوعرسالة
المدير
AMINE PàTCHIKà
AMINE PàTCHIKà
المدير


الجنس : ذكر
الابراج الدلو
تاريخ الميلاد تاريخ الميلاد : 25/01/1988
العمر : 36

المدير العام
منتديات أمين عبلة الحب :

استخدام Forms وResources  في  DLLs Empty
مُساهمةموضوع: استخدام Forms وResources في DLLs   استخدام Forms وResources  في  DLLs Emptyالخميس ديسمبر 27, 2012 3:36 pm

استخدام Forms وResources  في  DLLs 500092465

استخدام Forms وResources  في  DLLs 500092465

استخدام Forms و Resources في DLLs

استخدام Forms وResources  في  DLLs 500092465

استخدام Forms وResources  في  DLLs 500092465


مقدمة:
بقى جانبين مهمين فى
DLLs سأغطيهما فى
هذا الدرس وهما إستخدام
Forms و Resources ، ويعد هاذين الجانبين
من الجوانب التى تُظهر قوة ومرونة
DLLs .








استخدام Form فى DLLs : إن DLL يمكن أن يختوى Forms مثل احتوائه على الكود تماماً
،ولا تختلف طريقة بناء فورم فى
DLL عنها فى
التطبيق العادى ، لنأخذ مثال عملى لبناء فورم فى
DLL :
1-ابنى تطبيق
DLL جديد (امسح التعليقات
الظاهرة فى ترويسة
DLL إذا رغبت بذلك) خزّن الDLL باسم MyForms.dpr .
2-اختر
file
ثم
new
لبناء فورم جديد لمشروع
DLL أضف أي أدوات تريدها على الفورم
.
3-غيّر الخاصية
name
للفورم إلى
DLLForm ،خزّن الفورم
باسم
DLLFormU.pas .
4-عد إلى وحدة
DLL
المصدرية ، أضف دالة تدعى
ShowForm التى
تبنى وتُظهر الفورم ،استخدم الكود التالي:



function ShowForm : Integer; stdcall; var



Form : TDLLForm;



begin



Form := TDLLForm.Create(Application); Result := Form.ShowModal;



Form.Free;



end;








5-أضف جزء exports إلى DLL وصدّر الدالة ShowForm ،يظهر
جزء
exports
كالتالي:



exports







ShowForm;








6-اختر project ثم Build
MyForms لبناء ملف ال DLL ،خزّن الDLL .








لاحظ أن الدالة ShowForm قد صُرِّح عنها باستخدام الكلمة المحجوزة stdcall
،هذه الكلمة
المحجوزة تخبر المترجم ليصدّر الدالة باستخدام الإستدعاء
القياسي "
calling convention"
،stdcall يسمح لهذا الDLL ليُستخدم بواسطة
بيئات تطوير أخرى غير دلفى.








ملاحظة: calling
convention
يحدد
كيف سيمرر المترجم البارامترات عندما يستدعى
الدوال والإجراءات ، الإستدعاءات الخمس
القياسية لل
conventions هى
(
stdcall, cdecl, pascal, regester, safecall) .
الكود التالي يُظهر ال
DLL :


library MyForms;



uses



SysUtils,



Classes,
Forms, DLLFormU in `DLLFormU.pas' {DLLForm};



function ShowForm : Integer; stdcall; var
Form : TDLLForm;begin Form := TDLLForm.Create(Application); Result := Form.ShowModal; Form.Free;end;exports ShowForm;



begin
end.








الآن التطبيق المستدعِى يمكنه أن يصرّح
عن الدالة
ShowForm وأن يستدعيها ، أنظر لتطبيق دلفى التالي:


unit TestAppU;
interfaceuses Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;type



TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject); private



{ Private declarations }



public
{ Public declarations } end; var Form1: TForm1;function ShowForm : Integer; stdcall;
external `myforms.dll';
implementation



{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin
ShowForm;end;



end.








لاحظ أنى استخدمت الكلمة المحجوزة
stdcall مرة أخرى عندما صرّحت عن الدالة فى
لتطبيق المستدعِى نظراً لأن الدالة كانت قد صدّرت من ال
DLL
مع
stdcall ، لذلك يجب أن تُستورد مع stdcall ،يجب عليك دائماً أن تستورد الدالة أو الإجراء
بنفس
calling convention الذى استخدمته لتصديره.








ملاحظة: إذا كنت
ستستخدم
DLL
فى تطبيقات دلفى فقط
،فإنك لا تحتاج للقلق حول استخدام
stdcall عند تصديرك لدوالك و إجراءاتك
، أما إذا كان
DLL
سيُستدعى من مجال عريض من التطبيقات فيمكن أن تُصدّر دوالك وإجراءاتك مع
stdcall .








مثال لاستدعاء الدالة السابقم من لغة Visual Basic :
1-شغّل تطبيق جديد فى VB .
2-فى جزء
General للفورم
أكتب سطر التصريح التالي عن الدالة (لا تنسى حساسية هذا السطر بالنسبة
لحالة أحرف اسم الدالة كبيرة أم صغيرة):








Private
Declare Function ShowForm Lib
"myforms.dll" () As

Integer








3-أضف زر أمر على الفورم وفى حدث النقر له أكتب السطر التالي :
dim x as integer
x=showform








4-نفّذ البرنامج ،أنقر على زر
الأمر ،لاحظ أن الفورم الجديد سيظهر .








استدعاء MDI Form فى DLL : امتلاك MDI child من DLL هو حالة خاصة ،لنقل أنك تملك
تطبيق دلفى والفورم
الرئيسي هو
MDI Form ،إذا كنت تحاول أن تستخدم MDI
child
موجود فى DLL
،فإنك ستحصل على اعتراض VCL يقول (لايوجدMDI Forms نشط الآن) .
لكنك تملك MDI Form فما المشكلة إذاً؟ بالنسبة ل VCL أنت لا تملك MDI
Form
.
عندما تحاول أن ترى
MDI
child
،فإن
VCL
تحاول أن تفحص ما إذا كانت خاصية
MainForm لغرض التطبيق صالحة أم لا ،إذا
كانت هذه الخاصية ليست صالحة ،يظهر الإعتراض ،
المشكلة
هى أن ال
DLL كذلك يحتوى على غرض Application غير التطبيق الذى
أنت تعمل عليه حالياً ،وهذا الغرض يتم فحص خاصية
MainForm
له لكن
DLL
لا يملك
MainForm ،هذا الفحص سيفشل دائماً.








لحل هذه المشكلة يجب إسناد غرض
تطبيق التطبيق المستدعِى إلى غرض تطبيق
DLL ،كذلك يجب أن يتم إعادة غرض
تطبيق
DLL
إلى وضعه الأصلى ،لذلك عليك أن تخزن مؤشر لغرض
تطبيق
DLL
فى متغير عام فى
DLL ،لذلك يمكن إعادته لوضعه الأصلى قبل أن يتوقف تحميل DLL .
لنتبع الخطوات التالية الضرورية لمشاهدة MDI
child Form

فى
DLL :
1-إعمل مؤشر عام من النوع
TApplication فى DLL .
2-خزّن غرض تطبيق
DLL فى المتغير الذى عرّفته.
3-أسند غرض تطبيق التطبيق المستدعى إلى غرض تطبيق
DLL .
4-أنجز وأظهر ال
MDI child Form .
5-أعد غرض تطبيق
DLL قبل وقف تحميله.
ضع الكود التالي قرب قمة وحدة المصدر لDLL
:



var
DllApp : TApplication;








كن متأكداً من وضع الكلمة
المحجوزة
var تحت قائمة uses فى وحدة DLL المصدرية ،ثم ابنى الإجراء الذى سيعمل
على تبديل
TApplication ويبنى MDI child Form ،الإجراء سيظهر كالتالي :


procedure ShowMDIChild(MainApp : TApplication);



var



Child : TMDIChild;begin if not Assigned(DllApp) then begin



DllApp := Application;



Application := MainApp;



end;



Child := TMDIChild.Create(Application.MainForm);



Child.Show;
end;








عندما تستدعى هذا الإجراء فإنك
ستمرر غرض التطبيق للتطبيق المستدعِى ،إذا كان مؤشر
DLLApp
لم يتم إسناده ،فإنك تسند غرض تطبيق
DLL إلى مؤشر مؤقت ،ثم تسند غرض
التطبيق للتطبيق المستدعى لغرض تطبيق
DLL ،هذا يفحص تأكيد ما إذا كان
غرض التطبيق قد وضع(أسند) مرة واحدة فقط.
بعد ذلك سيتم بناء
MDI child Form ،يُمرر الفورم الرئيسي للتطبيق
المستدعى كمالك ، فى النهاية ،يظهر الفورم.
كل ما تبقى هو إرجاع مؤشر تطبيق
DLL قبل وقف تحميله ،بإمكانك استخدام DLLProc لإعادة تخزين مؤشر تطبيق DLL كالتالي :


procedure MyDLLProc(Reason: Integer);



begin



if Reason = DLL_PROCESS_DETACH then



{ DLL is unloading. Restore the Application pointer. } if Assigned(DllApp) then Application := DllApp;



end;








تذكّر أنك خزنت مؤشر
تطبيق
DLL
سابقاً ،والآن أنت فقط تعيد تخزينه .
كما رأيت تركيب
MDI child Form فى DLL يتطلب عمل إضافى
لكنه بالتأكيد ممكن.








استخدام Resources in DLLs :
أحياناً تحتاج إلى امتلاك مصادر
Resources محتواة داخل DLL ويتم استيرادها من قبل تطبيقاتك بدلاً عن وضعها كجزء من
الملف التنفيذى للبرنامج.
من أهم استخدامات هذا الأسلوب هو
جعل برنامجك أكثر سهولة فى قابلية نقله إلى
لغات أخرى غير لغتك الوطنية
،
لنأخذ مثالاً على
ذلك :
لنفرض أنك تملك تعليمات شاشة لتطبيقك ،وتلك التعليمات
مشتملة فى خمس سلاسل موجودة فى
DLL
،هذه الجمل يمكن أن تُدعى
IDS_INSTRUCTION1, IDS_INSTRUCTION2 إلى آخره.
يمكنك أن تُحمّل وتعرض السلاسل كالتالى :


LoadString(DllInstance,
IDS_INSTRUCTION1, Buff, SizeOf(Buff));
InstructionLabel1.Caption := Buff;








البارامتر
الأول للدالة
LoadString يحتوى على ممسك Instance لل DLL حيث توجد السلاسل ،البارامتر الثانى يحتوى
رقم
ID
لل
Resource المراد تحميله ،حيث أنك تقوم ببناء DLLs التى
تحتوى السلاسل بعدة لغات مختلفة قبل تحميلها ،ويمكن استخدام الكود التالى لتحديد ممسك ال
DLL .

var
DLLName : String;
begin
case Language of
laFrench : DllName := `french.dll';
laGerman : DllName := `german.dll';;
laSpanish : DllName := `spanish.dll';
laEnglish : DllName := `english.dll';
end;
DllInstance := LoadLibrary(PChar(dllName));
end;








كل ماعليك
فعله هو تحميل ال
DLL الصحيح ،هذا يمثّل أحد
استخدامات
Resources الذى ستجد بالتأكيد الكثير من
الاستخدامات له عند بناء تطبيقاتك .








بناء Resources
DLL

:
يمكنك أن تبنى DLL
يتكون فقط من
Resources ،أو يمكنك مزج الكود وال Resources فى
نفس
DLL
تركيب
Resources
فى
DLL مماثل لإضافة Resources لتطبيقك ،لفعل ذلك ابدأ مشروع DLL جديد ثم أضف سطر فى DLL لربط ال Resources :


{$R RESOURC.RES}








استخدام Resource
DLL

:

يجب عليك أن تحصل على DLL's instance ممسك لل
DLL
قبل أن تستطيع الوصول إلى
Resources
الموجودة فى
DLL ،إذا كان DLL يحتوى على Resources فقط فإنك ستستخدم التحميل الديناميكى ،أما إذا احتوى DLL على Resources وكود معاً فإنك تختار
التحميل الأستاتيكي ل
DLL ،لاحظ أنه فى
حالة تحميل
DLL
ستاتيكياً فإنك تستطيع استخدام
Loadlibrary لالتقاط instsnce handle .








DllInstance := LoadLibrary(`resource.dll');








ومن ثم تستخدم الممسك عندما
تحتاج إليه ،الكود التالى يُحمّل صورة نقطية
موجودة

فى DLL إلى أداة Image :



procedure TMainForm.FormCreate(Sender: TObject);



begin



DLLInstance := LoadLibrary(`resource.dll'); if DLLInstance <> 0 then begin Image.Picture.Bitmap. LoadFromResourceName(DLLInstance, `ID_BITMAP1');



FreeLibrary(DLLInstance);



end else



MessageDlg(`Error loading resource DLL.',



mtError, [mbOk], 0);



end;








لم يبقى الكثير
لنقوله فى هذا الموضوع

،بالطبع بإمكانك تحميل
Resources ستاتيكياً أو ديناميكياً ،فى كلا الطريقتين لك أن
تستخدم
Loadlibrary لالتقاط الممسك لل DLL ، لاتنسى
استدعاء
FreeLibrary عندما تنتهى من العمل مع DLL ،أو قبل أن تغلق تطبيقك.








ملاحظة: استخدام التحميل الديناميكى
له ميزة إضافية حيث أنه يسمح لتطبيقك أن يحمّل بشكل أسرع

، حيث أنك تقوم بتحميل
Resource DLL عندما تحتاجه وتنهى تحميله عند انتهاء حاجتك إليه ،نتيجة لهذا
فإن تطبيقك سيستخدم ذاكرة أقل منه عندما تكون الموارد فى
الملف التنفيذى.








الخلاصة :استخدام Dynamic Link Library ليس صعباً مثلما يظهر لك أول الأمر ، DLLs هو طريق عظيم لإعادة استخدام
الكود ،بعد أن تبنى
DLL يمكنك استدعاؤه من تطبيقك الذى
يحتاجه ،بناء
VCL forms فى DLL واستدعاء هذه الforms من تطبيقات غير تطبيقات دلفى مظهر قوي ،استخدام الResources فى
DLLs مظهر فعّال إذا استطعت التحكم فى
متى وأين تحمّل هذه المصادر.












رجائى أن
أكون قد وفقت لكشف النقاب عن هذا الجانب البرمجى
المهم ليس فقط فى لغة الدلفى
وإنما فى معظم لغات البرمجة التى تتفق فى
DLL كمفهوم ولا تختلف
إلا فى طريقة تجهيزه واستخدامه ... ولا أدعى أن
هذه الدروس المحدودة ستجعلك متمكناً منه بشكل كامل ،ولكننى
أعتبرها بداية ممتازة لتجعلك تنطلق لمزيد من البحث والدراسة والاستخدام لل
DLL وصولاً إلى برمجة
عربية ذات مستوى عالمى.






استخدام Forms وResources  في  DLLs 500092465

استخدام Forms وResources  في  DLLs 500092465

تحياتي لكم

استخدام Forms وResources  في  DLLs 500092465

استخدام Forms وResources  في  DLLs 500092465

استخدام Forms وResources  في  DLLs 483098003
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
استخدام Forms وResources في DLLs
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1
 مواضيع مماثلة
-
» استخدام الانترنت
» استخدام الماوس
»  الدرس الثالث استخدام الجداول

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
أحـــــلى مـــنـــتـــديـــات أمـــيـــن عـــبـــلــــة الــــحـــب  :: الكمبيوتر والأنترنت :: تبادل الخبرات في مجال الحاسب-
انتقل الى:  
الفيس بوك