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

شبكة ابن الخليج

Sitemap | Archive | Tag Could
معهد مطور - ينتهي الإعلان بتاريخ 16\10\2008
التسجيلالبحثمشاركات اليوماجعل جميع المنتديات مقروءةالأرشيف

منتديات نظرة حب - ينتهي الاعلان بتاريخ 6\11\2008جديد برامج وأخبار الالعابالرَّقائق دعوة لترقيق القلوب - ينتهي الاعلان بتاريخ 6\11\2008
كل مايخص المرأة والمجتمعاجمل واروع الصورنغمات إنتظار الشادي - ينتهي الاعلان بتاريخ 6\11\2008

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

مناقشة موضوع استخدام Forms وResources فى DLLs في دروس لغات البرمجة; استخدام Form فى DLLs : إن DLL يمكن أن يختوى Forms مثل احتوائه على الكود تماماً ،ولا تختلف طريقة بناء فورم فى DLL عنها فى التطبيق العادى ، لنأخذ مثال عملى لبناء فورم فى DLL : 1-ابنى تطبيق DLL جديد (امسح ...

العودة شبكة ابن الخليج> منتديات تعليمية> دروس لغات البرمجة

رد
 
LinkBackأدوات الموضوعطرق مشاهدة الموضوع
قديم 05-28-2006, 01:18 مساءً   #1 (permalink)
اسرة ابن الخليج
 
الصورة الرمزية الهوى ماهو كلام
 
تاريخ التسجيل: Jul 2005
الدولة: *K S A*
المشاركات: 4,844
معدل تقييم المستوى: 655الهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيطالهوى ماهو كلام نشيط
إرسال رسالة عبر مراسل ICQ إلى الهوى ماهو كلامإرسال رسالة عبر مراسل MSN إلى الهوى ماهو كلامإرسال رسالة عبر مراسل Skype إلى الهوى ماهو كلام
استخدام 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;

interface

uses

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 :
varDllApp : 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 مظهر فعّال إذا استطعت التحكم فى متى وأين تحمّل هذه المصادر.





من مواضيع الهوى ماهو كلام في المنتدى

الهوى ماهو كلام غير متواجد حالياً   رد مع اقتباس
قديم 10-22-2006, 03:31 مساءً   #2 (permalink)
اسرة ابن الخليج
 
الصورة الرمزية مبحرفى ذكرياتي
 
تاريخ التسجيل: Jun 2006
الدولة: ذكرياتي
المشاركات: 1,946
معدل تقييم المستوى: 1564مبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيطمبحرفى ذكرياتي نشيط
مشاركة: استخدام Forms وResources فى DLLs

مشكور أخوي ويعطيك العافية وجزاك الله خيرا ...





من مواضيع مبحرفى ذكرياتي في المنتدى
__________________
مبحرفى ذكرياتي
مبحرفى ذكرياتي غير متواجد حالياً   رد مع اقتباس
رد

العبارات الدلالية
استخدام



الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 
أدوات الموضوع
طرق مشاهدة الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG]متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة

المواضيع المتشابهه
الموضوعكاتب الموضوعالمنتدىمشاركاتآخر مشاركة
فن التعامل مع Google و كل ما تود معرفته عن هذا المحرك العملاقADMINسكربتات وادوات تطوير المواقع1208-21-2008 09:24 صباحاً
محمد بن عبد الله بن عبد المطلب (رسول الله عند المسلمين)صحوة العراقشخصية و تاريخ105-31-2008 03:53 صباحاً
اتصالات مصر تعلن عن مفاجأة في أعداد المشتركين قريباًالأخـبــارهواتف نقالة008-27-2007 07:00 صباحاً
تحريف القرآنقلب الاسدحوارات ثقافية عامة408-21-2006 08:28 مساءً
لقاء نادر ومباشر مع احد قادة المقاومة العراقيةالهوى ماهو كلامحوارات ثقافية عامة303-03-2006 09:01 مساءً


منتديات شبكة ابن الخليج

ثقافات مغربية مفكرون عرب كلمات احساس تحميل كتاب معاجم الباحث جداول المباريات الدوري البرتغالي الدوري الأسبانيالدوري الإيطاليالدوري البرتغالي Seat جرائم فيديو العاب و مسابقات ثقافية ازياء المحجبات أزياء سورية جديد الطب ساعات عرض ازياء مطبخ الشيف رمزي ديكور مكتبي ازياء المحجبات Nero برامج هندسة برامج حف الملفات برامج دى جى الطرق المثلى في استخدام البرامج افلام كاملة افلام جديده افلام امريكية مسلسلات يابانية انمي الفراشة العاب مباشرة العاب حديثة card PlayStation 2 Travian فرش للفوتوشوب صور متحركه كاميرات رقمية وتقنية صور Nokia 3600 برامج موتورولا ازياء المحجبات دروس للمبتدئين دروس الفوتو شوب دروس فلاتر فوتوشوب دروس ايميج ريدي Adobe ImageReadyدروس افتر افكت Adobe After Effect دروس Video Editing دروس الستروتر تحرير الفيديو ملفات 3D Studio Max دروس محترفين 3D Studio Max دروس swish متوسطة دروس برمجة مواقع دروس Excel دروس Unix لينكس و يونكسوندوز WINDOWS الذكاء الاصطناعي ازياء المحجبات مكتبة هاكات vBulletin قسم ستايلات vBulletinمجلة المنتديات mkPortalقسم ستايلات مجلة المنتديات mkPortal Stylesسكربتات وادوات تطوير المواقعمشاكل وحلول الـ مواقع إشهار المواقع فوتوشوبCinema 4Dخامات فوتوشوبفرش فوتوشوباكشن فوتوشوباشكال فوتوشوبمنتديات اماراتيةدليل مواقعاكتشف شخصيتكاخبارموسوعة الأطفالبوربوينتtorrentاختصار الروابطPageRankتوقيع لاميلكصانع القليترGlitter


الساعة تعتمد على توقيت جرينتش +3. الساعة الآن 01:23 صباحاً.
Search Engine Optimization by vBSEO 3.1.0

Valid XHTML 1.0 Transitional Valid CSS!Powered by vBulletin® Version 3.7.1,
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd
Feeds:   XML   JS   RSS   RSS Feed