طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل العشرون - منتديات اصلو عربى
منتديات اصلو عربى




إضافة رد
  #1  
قديم 08-14-2012, 12:50 PM
الصورة الرمزية arabasl
arabasl arabasl غير متواجد حالياً
مدير عام
 
تاريخ التسجيل: Jun 2012
الدولة: www.ArabASL.com
المشاركات: 208
Post طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل العشرون

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


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

الفصل العشرون




استخدام توابع النظام Windows API




سوف تتعلم في هذا الفصل كيفية استدعاء توابع النظام API من داخل برامج فيجول بيسك، تتيح لك هذه التقنية استخدام قوة وسرعة وشمولية هذه التوابع، مباشرة من برنامجك في فيجول بيسك.
توابع فيجول بيسك القياسية
لقد استخدمت فعلياً العديد من توابع فيجول بيسك خلال قراءتك هذا الكتاب، مثال على ذلك التابع Str() الذي يحول المتحول الرقمي إلى متحول نصي، والتابع MsgBox() الذي يُظهر رسالة للمستخدم بأزرار معينة، ومن ثم يعود بقيمة تمثل رد المستخدم على هذه الرسالة.
ماذا لو كانت هناك بعض المهام التي تريد تأديتها، غير مدعومة أو موجودة في لغة فيجول بيسك؟ في هذه الحالة، قد تجد دعماً لهذه المهمة مع توابع النظام ويندوز API، المشروحة لاحقاً في هذا الفصل؟.
مكتبات الربط الديناميكية
يمكن أن يكون امتداد ملف مكتبة الربط الديناميكية، الامتداد DLL (مثل الملف MyFile.DLL)، أو أن يكون له الامتداد EXE (مثل الملف MyFile.EXE). والأشهر هو النوع الأول، لذلك أخذ الأحرف الأولى من اسمها Dynamic Link Libraries.
تحتوي ملفات مكتبات الربط الديناميكية DLL، على توابع داخلها، يمكن استدعاؤها من أي برنامج آخر، وكأنها جزء من هذا البرنامج.
دعنا نفترض وجود ملف DLL معين، يتضمن التابع المسمى MyFunction()، ولنفترض أيضاً أن هذا التابع يتطلب وسيطاً واحداً، ويعود بقيمة معينة. وهو مشابه للتابع Str() الموجود ضمناً في فيجول بيسك، ويتطلب وسيطاً واحداً هو قيمة رقمية ما، ويعود بقيمة نصية String تمثل هذا الرقم.
تستطيع الآن، كتابة برنامج فيجول بيسك يستخدم هذا التابع MyFunction()، الموجود في الملف MyFile.DLL، في هذه الحالة يستطيع برنامجك استخدام هذا التابع، بنفس الطريقة التي تستخدم فيها أي تابع داخلي في فيجول بيسك.
بمعنى آخر، تستطيع زيادة عدد التوابع التي يمكنك استخدامها في فيجول بيسك، بواسطة تقنية مكتبات الربط الديناميكية DLL.
تعتبر الميزة الرائعة لملفات الربط الديناميكية، هي في إمكانية استخدامها من قبل أكثر من برنامج وبنفس الوقت، مختصرة بذلك الكثير من التكرار الغير ضروري، والمستهلك لمساحة القرص الصلب.
يمكن كتابة برنامج فيجول بيسك، يستدعي تابعاً معيناً من مكتبة DLL ما، يقوم هذا البرنامج خلال عملية تنفيذه، بتحميل الجزء الحاوي على شفرة التابع المستدعى، والموجودة في ملف مكتبة DLL، يقوم بتحميله في الذاكرة ومن ثم ينفذه.
يمكنك الآن فهم سبب تسمية هذه الملفات بمكتبات الربط الديناميكية.
هذه الملفات عبارة عن مكتبات من التوابع، تحمَّل هذه المكتبات (ربط هذه المكتبات) مع برنامجك حسب الحاجة فقط (ديناميكياً)، وهي ليست جزءاً من ملف برنامجك التنفيذي وإنما تتواجد في ملف منفصل عنه.
علاوةً على ذلك، يمكنك كتابة برنامج فيجول بيسك آخر، يستخدم نفس التابع الموجود في مكتبة DLL (أو تابع آخر موجود في نفس المكتبة). عند تنفيذ هذا البرنامج (والبرنامج الأول مازال منفذاً)، يصبح لديك برنامجان يقومان باستدعاء نفس التابع الموجود في الملف DLL نفسه. وفي الواقع، يمكن وجود أكثر من برنامج يقوم بالاستفادة من نفس مكتبة DLL.
بكلام ملخص جداً، تعتبر مكتبات DLL، ملفات تحوي توابع بداخلها، وهي متاحة للاستخدام من أي برنامج وفي نفس الوقت.
توابع النظام ويندوز API
قد تلاحظ (كمشغل لويندوز)، وجود العديد من المزايا المتوفرة في النظام ويندوز، مثل تحريك الفأرة، نقر الفأرة، اختيار البنود من القوائم، الخ.
بالطبع، يستطيع ويندوز تنفيذ العديد من المهام الأخرى، مثل حفظ الملفات، إظهار الصور، إدارة أجهزة الكومبيوتر المختلفة، وأداء الآلاف من العمليات الهامة الأخرى.
يعتبر ويندوز بحد ذاته برنامجاً، مثل بقية البرامج الأخرى، ولكن بالنسبة للمستخدمين، فإنهم لا يميلون لاعتباره برنامجاً، بل يعتبرونه آليةً تمكنهم من تنفيذ البرامج الأخرى (وآليةً لتطوير برامج، بواسطة لغات البرمجة مثل فيجول بيسك).
بكلمة أصح، معظم الأعمال التي ينفذها ويندوز، هي في الحقيقة استدعاءات للتوابع الموجودة في ملفات مكتبات DLL.
وعندما يريد ويندوز أداء مهمة معينة، فإنه فعلياً يستدعي التابع الخاص بهذه المهمة من خلال ملف مكتبة DLL المحتوية على هذا التابع.
لقد رأيت مسبقاً كيف أن العديد من البرامج يمكنها استخدام نفس التابع من الملف DLL نفسه وبشكل آني وهذا يعني أن برنامجك المطور في لغة فيجول بيسك يمكنه استخدام التوابع الموجودة في نفس ملف DLL والذي يستخدمه ويندوز نفسه.
والآن دعنا نرى الفوائد من استخدام التوابع التي يستخدمها ويندوز نفسه:
تعتبر مكتبات DLL التي يستخدمها ويندوز موجودة في جهازك الشخصي فعلياً، ويفترض أن مستخدمي برنامجك لديهم ويندوز أيضاً وهذا يعني أنه لا حاجة لتوزيع ملفات DLL الخاصة بويندوز (وهي كبيرة جداً) مع ملفات برنامجك، لأن ملفات الويندوز موجودة مسبقاً عل أجهزة باقي المستخدمين.
تعمل توابع مكتبات DLL بشكل جيد وخالي من الأخطاء وبذلك تضمن الثقه فى برامجك وتوافقيتها على جميع أجهزة الكمبيوتر الشخصية التي تستخدم النظام ويندوز.
لا توجد لغة برمجة يمكنها تنفيذ كل المهام التي يمكن للنظام ويندوز أن يؤديها، حتى أعقد اللغات مثل فيجول سي++، لذلك لابد لك من استخدام توابع النظام ويندوز API بشكل مباشر.
يوجد العديد من التوابع الخاصة بالنظام ككل، وعند استدعاء أحد هذه التوابع من مكتبات ويندوز نفسه، تضمن وثوقية عمل النظام بشكل كامل.
لنفرض مثلاً احتياج برنامجك في مرحلة ما، لإعادة إقلاع الجهاز Reset. في حال اعتمدت على تابع إعادة الإقلاع الخاص بك، توقع أن يسبب تابعك بعض المشاكل.
مثلاً، هناك برنامج منفذ حالياً، ويحتاج لحفظ آخر التعديلات التي جرت على ملف ما، أو هناك مستخدمين آخرين متصلين مع جهازك الشخصي، وإعادة إقلاع الجهاز بدون تنبيه وتنفيذ بعض المهام قبل عملية إعادة الإقلاع، يتسبب في الكثير من الضرر.
أما في حال استخدمت ما إذا تابع إعادة الإقلاع الخاص بالنظام ويندوز، فتأكد بأنه سيقوم بالعمل بدون أي أضرار، وسيقوم بجميع الإجراءات الضرورية، مثل تنبيه باقي البرامج أو المستخدمين على ضرورة الخروج حالياً، ويمكن في بعض الأحيان إلغاء أمر إعادة الإقلاع لأسباب خاصة.
لقد رأيت الآن، وجود أسباب كثيرة ومنطقية، لاستخدام توابع الويندوز API، لنكتب الآن برنامجاً يستخدم توابع النظام ويندوز، ونرى كيفية عمله.
ملاحظة
صممت مايكروسوفت النظام ويندوز، بطريقة تسمح له باستخدام التوابع من ملفات DLL. بكلمة أصح، صممت مايكروسوفت هذه المكتبات بطريقة تسمح للبرامج الأخرى (مثل البرامج المطورة في فيجول بيسك)، بقابليتها لاستخدام هذه التوابع، من ملفات DLL الخاصة بويندوز. تسمى توابع النظام ويندوز (واجهة برمجة التطبيقات) ويطلق عليها اختصاراً API (Application Programming Interface).
برنامج API
سننشئ الآن، البرنامج API، يوضح هذا البرنامج، كيفية استخدام توابع API من خلال برامجك المطورة في فيجول بيسك.
أنشئ الدليل C:\VB5Prg\Ch20، لكي تحفظ المشروع فيه.
أنشئ مشروعاً جديداً بنوع Standard EXE، من القائمة File.
اختر البند Save Form1 As من القائمة File، ثم احفظه باسم MyApi.Frm، في نفس الدليل.
اختر البند Save Project As من القائمة File، ثم احفظه باسم MyApi.Vbp في نفس الدليل السابق أيضاً.
صمم النموذج frmMyApi وفق الجدول 20-1.
بعد انتهائك من بناء النموذج frmMyApi، ينبغي ظهوره كالشكل 20-1.


الجدول 20-1. جدول خصائص النموذج frmMyApi.
القيمة الخاصية الكائن
frmMyApi Name Form
برنامج API Caption
True RightToLeft
cmdBeep Name CommandButton
&رنين Caption
cmdExit Name CommandButton
&خروج Caption

الشكل 20-1 النموذج frmMyApi بعد انتهاء تصميمه.
أضف النص التالي لقسم التصريحات العامة للنموذج frmMyApi:
'يجب التصريح عن كل المتحولات
Option Explicit
أضف النص التالي لحادثة Click الخاصة بالزر cmdExit:
Private Sub cmdExit_Click()
End
End Sub
يتسبب نقر الزر خروج، بإنهاء البرنامج والعودة إلى فيجول بيسك.
إضافة وحدة نمطية BAS جديدة للمشروع
تحتوي نافذة المشروع على نموذج واحد فقط هو frmMyApi، (انظر الشكل 20-2 الممثل لنافذة المشروع).
أظهر نافذة المشروع، من القائمة View، البند Project Explorer.
الشكل 20-2 يحتوي المشروع MyApi على نموذج وحيد.
سنضيف وحدة نمطية جديدة BAS إلى المشروع MyApi:
اختر البند Add Module، من القائمة Project.
يستجيب فيجول بيسك بإظهار نافذة Add Module (انظر الشكل 20-3).
تأكد أن صفحة New هي الظاهرة في نافذة Add Module.
اختر الرمز Module، ثم انقر الزر فتح.
نتيجة ذلك، تضاف وحدة نمطية جديدة BAS إلى المشروع.
الشكل 20-3 إضافة وحدة نمطية جديدة للمشروع MyApi.Vbp.
للوحدة النمطية المضافة اسم افتراضي هو Module1، لذلك يجب تغيير الاسم إلى MyApi.BAS كالتالي:
اختر البند Save Module1 As من القائمة File، واحفظه باسم MyApi.BAS في الدليل C:\VB5Prg\Ch20.
انظر لنافذة المشروع مرة أخرى، وكما ترى (انظر الشكل 20-4)، تتضمن نافذة المشروع النموذج frmMyApi، والوحدة النمطية MyApi.BAS.
الشكل 20-4 تتضمن نافذة المشروع النموذج frmMyApi، والوحدة النمطية MyApi.BAS.
التصريح عن توابع API
هدفنا من هذا البرنامج، تنفيذ تابع API من خلال البرنامج API، لذلك يجب إخبار فيجول بيسك عن اسم التابع التي تود استخدامه، وأين يوجد (اسم الملف DLL الذي يحويه)، وكيفية عمل هذا التابع (الوسائط المطلوبة لهذا التابع والقيمة العائدة منه).
تدعى عملية إخبار فيجول بيسك عن تفاصيل التابع بالتصريح Declare عن هذا التابع.
أضف الأسطر التالية إلى قسم التصريحات العامة للوحدة النمطية MyApi.BAS:
'يجب التصريح عن كل المتحولات
Option Explicit
Declare Function MessageBeep Lib "User32" _
(ByVal wType As Long) As Long
اختر البند Save Project من القائمة File، لحفظ المشروع كاملاً.
يعتبر السطر التالي في قسم التصريحات العامة للوحدة النمطية MyApi.BAS، سطر التصريح عن تابع API:
Declare Function MessageBeep Lib "User32" _
(ByVal wType As Long) As Long
يبدأ سطر التصريح عن تابع API بالعبارة Declare، بعد Declare مباشرة، يأتي دور تحديد نوع التابع، هل يعود التابع بقيمة (Function)، أم لا يعود بقيمة (Sub).
بعد تحديد نوع التابع، ينبغي تحديد اسم التابع المراد استدعاؤه. في مثالنا الحالي، يسمى التابع MessageBeep.
بعد تحديد اسم التابع، ينبغي تحديد موقعه. في مثالنا الحالي، التابع موجود في المكتبة Lib المسماة User32.
يتواجد الملف User32.DLL، في الدليل الفرعي System، الموجود في الدليل الرئيسي C:\Windows، (بالنسبة للنظام Windows95).
ويتواجد في الدليل C:\WinNT\System32، (بالنسبة للنظام WinNT).
عَلِم فيجول بيسك نتيجة سطر التصريح السابق، موقع التابع MessageBeep()، (المكتبة User32.DLL).
بعد تحديد موقع التابع، ينبغي تحديد الوسائط المطلوبة لعمله، ونوع البيانات الخاصة بكل وسيط. يتطلب التابع MessageBeep() وسيطاً واحداً فقط، هو wType من النوع Long.
أخيراً، بعد تحديد كل الوسائط المطلوبة (بشكل عام)، يأتي دور تحديد نوع القيمة التي يعود بها التابع بعد انتهاء مهمته. يعود التابع MessageBeep() بقيمة من النوع Long، لذلك كتبت العبارة As Long آخر سطر التصريح.
ستتعلم في آخر هذا الفصل، كيفية إيجاد أسطر التصريحات الخاصة بتوابع API الأخرى.
تنفيذ التابع MessageBeep()
لنكتب الآن العبارات الخاصة بتنفيذ التابع MessageBeep:
يجب ملاحظة أمر هام جداً، هو كون عبارة تنفيذ التابع، مطابقة تماماً لما جاء في سطر التصريح عن هذا التابع، من حيث الوسائط المطلوبة ونوع كل وسيط، ونوع القيمة العائدة من التابع.
اكتب الأسطر التالية في الإجراء cmdBeep_Click():
Private Sub cmdBeep_Click()
Dim Dummy
Dummy = MessageBeep(1)
End Sub
اختر البند Save Project من القائمة File، لحفظ المشروع كاملاً.
صرحت في الإجراء السابق عن متحول محلي باسم Dummy كالتالي:
Dim Dummy
ثم استدعيت التابع MessageBeep():
Dummy = MessageBeep(1)
وأسندت القيمة العائدة من التابع MessageBeep() إلى المتحول Dummy.
فعلياً، وفي هذا المثال بالذات، لا فائدة أبداً من القيمة العائدة من هذا التابع، ولكن فقط لتوضيح أن تابع API يعود بقيمة، يجب إسنادها إلى متحول ما.
يحتاج التابعMessageBeep() إلى وسيط واحد فقط، ويعرِّف هذا الوسيط كيفية إصدار الصوت بالضبط، كما سيتم شرحه لاحقاً.
نفّذ برنامج API.
انقر الزر رنين، وتأكد من سماعك صوتاً.
تمرن على البرنامج، ثم انقر الزر خروج لإنهاء البرنامج.
بالتأكيد، يمكن استخدام العبارة Beep الجاهزة في فيجول بيسك، بدلاً من هذه الطريقة الطويلة لعمل نفس الشيء. لكن الهدف من هذا التمرين، هو معرفة كيفية استدعاء تابع API ما.
تعتمد طريقة إصدار الصوت، على كيفية تعريف بطاقة الصوت لديك. قد يصدر الصوت من خلال بطاقة الصوت، وليس من خلال سماعة الجهاز الداخلية.
غيِّر قيمة الوسيط المطلوب للتابع MessageBeep() من 1 إلى -1 وذلك كما يلي:
Dummy = MessageBeep(-1)
نفّذ البرنامج مرة أخرى، وتأكد من إصدار الصوت عبر سماعة الجهاز هذه المرة. تُجبر القيمة -1، التابع MessageBeep() على إصدار الصوت عبر سماعة الجهاز الداخلية، حتى لو كان لديك بطاقة صوت معرفة بشكل صحيح.
عند إصدار الصوت عبر سماعة الجهاز الداخلية، تكون فترة إصدار الصوت صغيرة جداً (بالكاد تسمعها). لكي تطيل فترة إصدار الصوت، غيِّر الإجراء cmdBeep_Click() إلى:
Private Sub cmdBeep_Click()
Dim Dummy
Dim I
For I=0 To 100
Dummy = MessageBeep(1)
Next
End Sub
تتسبب إضافة الحلقة For-Next في تنفيذ التابع مائة مرة متتالية.
معرفة اسم دليل Windows
كمثال على استدعاء تابعAPI آخر، دعنا نستخدم تابع API، الذي يخبرنا عن اسم الدليل الذي جُهِّز فيه النظام Windows:
ضع زراً جديداً على النموذج frmMyApi.
أسند القيم التالية لخصائصه:
Name: cmdWhereWindows
Caption: دليل ويندوز
ينبغي ظهور النموذج بعد الانتهاء من تصميمه، كما في الشكل 20-5.
الشكل 20-5 النموذج frmMyApi بعد إضافة الزر دليل ويندوز.
أضف الأسطر التالية إلى قسم التصريحات العامة للوحدة النمطية MyApi.Bas.
بعد الانتهاء من إضافة الأسطر الجديدة، يصبح كالتالي:
'يجب التصريح عن كل المتحولات
Option Explicit
Declare Function MessageBeep Lib "User32" _
(ByVal wType As Long) As Long
Declare Function GetWindowsDirectory Lib "Kernel32" _
(ByVal lpBuffer As String,ByVal nSize As Long) As Long
لاحظ، أن التصريح الجديد عن التابع GetWindowsDirectory()، أصعب وأعقد قليلاً من التصريح عن التابع السابق MessageBeep().
اسم التابع الثاني GetWindowsDirectory()، وهو موجود في ملف المكتبة Kernel32.Dll.
ظهر قسم جديد في سطر التصريح الثاني، هو العبارة Alias. حيث يمكننا تغيير اسم التابع الأصلي إلى اسم مستعار آخر، وذلك في حال حدوث تعارض بين أسماء التوابع مع بعضها البعض، أو مع عبارات فيجول بيسك المحجوزة الأخرى. يكفينا ما تعلمناه عن العبارة Alias، ولن نخوض في تفاصيلها أكثر من ذلك.
يتطلب التابع GetWindowsDirectory() وسيطين هما: الوسيط lpBuffer من النوع String، والوسيطnSize من النوع Long:
(ByVal lpBuffer As String,ByVal nSize As Long)
يعود التابع بقيمة بعد تنفيذه، من النوع Long.
اختر البندSave Project من القائمة File، لحفظ المشروع كاملاً.
ربط نص البرنامج الخاص بحادثةClick للزر دليل ويندوز
اتبع الخطوات التالية:
اكتب الأسطر التالية في الإجراء cmdWhereWindows_Click():
Private Sub cmdWhereWindows_Click ()
Dim Result
Dim WindowsDirectory A String
WindowsDirectory = Space(144)
Result = GetWindowsDirectory(WindowsDirectory,144)
If Result = 0 Then
MsgBox "لم أستطع الحصول على اسم مجلد ويندوز"
Else
WindowsDirectory = Trim(WindowsDirectory)
MsgBox "مجلد ويندوز هو:" & WindowsDirectory
End If
End If
اختر البندSave Project من القائمة File، لحفظ المشروع كاملاً.
صرحت في الأسطر السابقة عن متحولين هما:
Dim Result
Dim WindowsDirectory A String
ثم ملأت المتحول WindowsDirectory، بأحرف مسافات (144 حرف مسافة):
WindowsDirectory = Space(144)
يغنينا التابع Space()، عن كتابة أحرف المسافات فعلياً، لإسنادها للمتحول. ولولا هذا التابع، لاضطررنا لكتابة السطر التالي:
WindowsDirectory = " (اضغط مفتاح المسافة 144 مرة هنا) "
بعد ذلك، نفّذ التابع GetWindowsDirectory() كالتالي:
Result = GetWindowsDirectory(WindowsDirectory,144)
تُسند النتيجة (القيمة العائدة من التابع) للمتحول Result. لا يحتوي المتحولResult على اسم مجلد النظام Windows، بل يحتوي على رقم، يمثل نجاح التابع في أداء عمله أو فشله.
إذا كانت قيمة المتحول Result مساوية للصفر، يكون التابع قد فشل في أداء مهمته ولسبب من الأسباب، أما إذا كانت قيمة المتحولResult لا تساوي الصفر، يكون التابع قد نجح في أداء مهمته.
تساوي قيمة الوسيط الثاني 144، وهي تمثل طول سلسلة الأحرف التي ينبغي وضعها في المتحول WindowsDirectory، يُستخدم المتحول WindowsDirectory كخرج Output لمعلومات التابع GetWindowsDirectory().
بكلام آخر، يضع التابع GetWindowsDirectory() اسم مجلد الويندوز في المتحول WindowsDirectory. من الضروري جداً ملء المتحولWindowsDirectory بأحرف مسافات وبطول 144 حرف، قبل استدعاء التابع GetWindowsDirectory()، لأن التابع يُحدِّث سلسلة الأحرف الموجودة في المتحول WindowsDirectory، ويفترض هذا التابع وجود منطقة من الذاكرة، لوضع سلسلة الأحرف الجديدة (اسم مجلد ويندوز)، قبل عملية تنفيذه.
بعد ذلك، نفذت العبارة If-Else-End If التالية:
If Result = 0 Then
MsgBox "لم أستطع الحصول على اسم مجلد ويندوز"
Else
WindowsDirectory = Trim(WindowsDirectory)
MsgBox "مجلد ويندوز هو:" & WindowsDirectory
End If
إذا كانت قيمة Result تساوي الصفر (القيمة العائدة من التابع)، هذا يعني فشل التابع GetWindowsDirectory() في الحصول على اسم الدليل الذي جُهِّز فيه النظام Windows لسبب من الأسباب. ينبغي على المبرمج، توضيح هذا الأمر للمستخدم، وإظهار رسالة له، تخبره عن عدم قدرته في الحصول على اسم مجلد الويندوز.
أما إذا كانت قيمة المتحولResult لا تساوي الصفر، هذا يعني نجاح التابع في الحصول على اسم الدليل، وتنفذ الأسطر الواقعة بعد العبارة Else. وهي:
WindowsDirectory = Trim(WindowsDirectory)
MsgBox "مجلد ويندوز هو:" & WindowsDirectory
تكون قيمة المتحول WindowsDirectory مبدئياً، سلسلة من المسافات بطول 144 حرف مسافة. لذلك اضطررنا لاستخدام التابع Trim() لجعل المتحول WindowsDirectory خالياً من المسافات الزائدة.
ملاحظة
يزيل التابع Trim() أحرف المسافات الزائدة من يمين المتحول ويساره، لكنه لا يزيل أحرف المسافات الفاصلة بين الكلمات الموجودة في المتحول.
مثلاً، لو كان لدينا العبارات التالية:
myName = " Ahmad Waddah "
myName = Trim(myName)
Print myName
بعد تنفيذها، تكون النتيجة:
Ahmad Waddah
نلخص الكلام السابق فنقول:
هيأت المتحول WindowsDirectory لاستقبال المعلومات من التابع GetWindowsDirectory().
أرسلت هذا المتحول للتابع عن طريق استدعاء التابع فعلياً.
وَضع التابع اسم مجلد Windows في المتحول WindowsDirectory.
غير التابع GetWindowsDirectory() قيمة المتحول WindowsDirectory من سلسلة أحرف مسافات، إلى سلسلة أحرف تمثل اسم الدليل، مع بقاء المسافات الزائدة في آخر المتحول.
حَذف التابع Trim() المسافات الزائدة من المتحول WindowsDirectory.
أظهرت العبارة MsgBox اسم الدليل، للمستخدم.
احفظ النموذج بضغط مفتاحي Ctrl + S.
نفذ البرنامج وتأكد من ظهور رسالة تخبرك عن اسم مجلد Windows، عند نقر الزر دليل ويندوز.
إضافة زر الخروج من الويندوز
اتبع ما يلي:
ضع زراً جديداً على النموذج frmMyApi.
أسند القيم التالية لخصائصه:
Name: cmdExitWindows
Caption: خروج &من الويندوز
ينبغي أن يصبح النموذج كما في الشكل 20-6.
الشكل 20-6 النموذجfrmMyApi بعد إضافة زر الخروج من الويندوز.
أين توجد أسطر التصريح عن توابع API
رأيت سابقاً، كلاً من التابع MessageBeep()، والتابع GetWindowsDirectory()، وعرفت كيفية استخدامهما عن طريق هذا الكتاب. تصور أنك تريد الآن، استخدام تابع يتسبب في إعادة إقلاع الجهاز Reboot.
كيف تعرف اسم التابعAPI الصحيح؟ وما هو السطر الذي يصرح عنه بشكل صحيح؟ أين أجد هذه المعلومات؟.
انظر إلى دليل فيجول بيسك، ستجد مجلداً فرعياً يسمى \Winapi، والملف التنفيذي Apiload.exe.
نفّذ البرنامج Apiload.exe عن طريق مستكشف Windows، أو عن طريق قائمة زر ابدأ، ثم بند البرامج، ثم بند Microsoft Visual Basic، ثم بند API Text Viewer، وهو أحد بنود المجموعة Microsoft Visual Basic.
تظهر نافذة API Viewer نتيجة تشغيل البرنامج، (الشكل 20-7).
الشكل 20-7 نافذة API Viewer.
استخدم النافذة السابقة، لمعرفة كيفية التصريح عن تابع معين. كالتالي:
اختر البند Load Text File من قائمة File، في البرنامج API Viewer.
يظهر مربع الحوار Select a Text API File.
اختر الملف Win32api.txt من الدليل الفرعي Winapi، ثم انقر فتح.
تُحمَّل جميع البنود الموجودة في الملف Win32api.txt، إلى مربع السرد Available Items.
تأكد من اختيار البند Declare في الحقلAPI Type.
يتضمن مربع السرد Available Items الآن، جميع تصريحات توابع النظامAPI.
ابحث عن البند ExitWindowsEx، وانقره مرة واحدة لاختياره.
انقر الزر Add الموجود في نافذة البرنامج API Viewer.
يظهر البند المضاف في الحقل Selected Items (أسفل نافذة البرنامج).
استخدم الفأرة لاختيار محتويات الحقل Selected Items، ثم انقر الزر Copy.
يتم نسخ محتويات الحقل Selected Items المختارة، إلى حافظة النظام Windows.
ضع مؤشر الفأرة على قسم التصريحات العامة للوحدة النمطية MyApi.Bas، وذلك بنقر موقع الكتابة (لتنشيط نافذة نص البرنامج)، ثم انتقل إلى آخر سطر.
الصق النص الموجود في حافظة Windows، (وذلك بضغط المفتاحين Ctrl+V).
يصبح النص الموجود في قسم التصريحات العامة للوحدة النمطية MyApi.Bas كما يلي:
'يجب التصريح عن كل المتحولات
Option Explicit
Declare Function MessageBeep Lib "User32" _
(ByVal wType As Long) As Long
Declare Function GetWindowsDirectory Lib "Kernel32" _
(ByVal lpBuffer As String,ByVal nSize As Long) As Long
Declare Function ExitWindowsEx Lib "User32" _
(ByVal uFlags As Long,ByVal dwReserved As Long) As Long
تحتاج من برنامج API Viewer أيضاً، الثوابت المستخدمة مع توابع API.
عد ثانية إلى البرنامج API Viewer، واختر البند Constant من الحقل API Type (حتى تظهر لائحة بثوابت توابع API).
قد يظهر لك مربع حوار، يسألك إذا كنت تريد تحويل الملف المحمَّل الحالي، إلى ملف Database، جاوب بنعم، فيظهر مربع الحوار Select a Name for New Database.
احفظ ملف قاعدة البيانات باسم Win32api.Mdb في الدليل \Winapi.
تأخذ عملية التحويل بعض الوقت، ولكن عند تنفيذ البرنامج API Viewer في المرة المقبلة، اختر البند Load Database File، واختر الملف Win32api.Mdb.
يتعامل البرنامج في هذه الحالة، مع ملف قاعدة بيانات، وليس مع ملف نصي، وستلاحظ الفرق الكبير في السرعة التي يتعامل فيها مع البنود من حيث العرض أو البحث الخ.
في جميع الحالات، تظهر الآن جميع ثوابت التوابع API.
أزح البنود عن طريق الأسهم أو شريط التمرير الأفقي، حتى ترى البند EWX_SHUTDOWN، انقر عليه مرة واحدة فقط، ثم انقر الزر Add.
يظهر البند EWX_SHUTDOWN في المربع السفلي من البرنامج API Viewer.
اختر البند نفسه من المربع السفلي، ثم انقر الزر Copy.
يتم نسخ هذا البند إلى الحافظة Clipboard.
انقل مؤشر الفأرة إلى آخر سطر في الوحدة النمطية MyApi.Bas، ثم الصق النص الموجود في الحافظة.
يصبح الآن النص الموجود في قسم التصريحات العامة للوحدة النمطية MyApi.Bas كالتالي:
'يجب التصريح عن كل المتحولات
Option Explicit
Declare Function MessageBeep Lib "User32" _
(ByVal wType As Long) As Long
Declare Function GetWindowsDirectory Lib "Kernel32" _
(ByVal lpBuffer As String,ByVal nSize As Long) As Long
Declare Function ExitWindowsEx Lib "User32" _
(ByVal uFlags As Long,ByVal dwReserved As Long) As Long
Public Const EWX_SHUTDOWN = 1
اختر البند Save Project من القائمة File، لحفظ المشروع كاملاً.
إسناد نص برنامج حادثة Click للزر cmdExitWindows
اتبع ما يلي:
اكتب ما يلي في الإجراء cmdExitWindows_Click():
Private Sub cmdExitWindows_Click()
Dim Dummy
Dim Answer
Answer = MsgBox("هل تريد الخروج من الويندوز بالتأكيد؟", _
vbYesNo)
If Answer = vbYes Then
Dummy = ExitWindowsEx(EXW_SHUTDOWN,0)
End If
End Sub
يصرح نص البرنامج الذي كتبته سابقاً، عن متحولين محليين هما: Dummy و Answer.
لكتابة برنامج احترافي ووثوقي، يجب التأكد أن المستخدم يريد وبشكل مؤكد، تنفيذ العمل الذي طلبه من البرنامج.
في هذا المثال، تم التأكد من نية المستخدم على الخروج، قبل تنفيذ تابع الخروج من الويندوز، بإظهار رسالة واضحة قابلة للتراجع (نقر الزر لا).
إذا نقر المستخدم زر نعم، ينفذ السطر الذي يلي تعليمة If:
Dummy = ExitWindowsEx(EXW_SHUTDOWN,0)
لاحظ عدم استخدام القيمة العائدة من التابع (لا تهمك حالياً)، لذلك تم وضعها في متحول باسم Dummy (زائف).
يغلق التابع النظامWindows بكامله، بسبب وضع قيمة الوسيط الأول مساوية لقيمة الثابت EXW_SHUTDOWN.
بالعودة إلى قسم التصريحات العامة للوحدة النمطية MyApi.Bas، نجد السطر التالي:
Public Const EXW_SHUTDOWN = 1
يدل هذا السطر على أن قيمة الثابت EXW_SHUTDOWN تساوي الواحد، وهي قيمة ثابتة لا يجوز تغيرها ضمن البرنامج.
إذاً، السطرين التاليان متكافئان من حيث النتيجة:
Dummy = ExitWindowsEx(EXW_SHUTDOWN,0)
Dummy = ExitWindowsEx(1,0)
تستخدم تقنية تعريف الثوابت، لجعل البرنامج أوضح في الفهم، ومن البديهي أن السطر الأول أوضح من السطر الثاني.
قبل تجريب البرنامج API، تأكد من حفظ المشروع، وإغلاق كافة التطبيقات الأخرى.
نفّذ البرنامج API.
انقر زر خروج من الويندوز.
تظهر رسالة تأكيد، تطلب منك إجابة صريحة بنعم أو لا.
انقر نعم.
تأكد من إغلاق النظام Windows.
معرفة اسم مجلد Windows\System
بطريقة مشابهة جداً لمعرفة اسم مجلد Windows، يمكننا معرفة اسم مجلد Windows\System، اتبع ما يلي:
أضف زراً جديداً للنموذج frmMyApi.
أسند القيم التالية لخصائصه:
Name: cmdWhereSystem
Caption: System &دليل
يصبح النموذج بعد الانتهاء كما في الشكل 20-8.
الشكل 20-8 النموذج بعد إضافة زر دليل System.
أضف سطر التصريح التالي لقسم التصريحات العامة للوحدة النمطية MyApi.Bas:
Declare Function GetSystemDirectory Lib "kernel32" Alias _
"GetSystemDirectoryA" _
(ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
أضف الأسطر التالية للإجراء cmdWhereSystem_Click():
Private Sub cmdWhereSystem_Click()
Dim Result
Dim SystemDirectory A String

SystemDirectory = Space(144)

Result = GetSystemDirectory(SystemDirectory,144)

If Result = 0 Then
MsgBox "لا يمكن الحصول على اسم مجلد النظام"
Else
MsgBox "مجلد النظام هو:" & SystemDirectory
End If
End Sub
من المؤكد أنك وجدت الأسطر السابقة، مشابهة جداً للأسطر التي كتبتها في إجراء الحصول على اسم دليل Windows، مع اختلاف بسيط جداً هو في اسم التابع API.

الخلاصة
تعلمت في هذا الفصل، كيفية استخدام توابع النظام API Windows من برامج فيجول بيسك. ورأيت أيضاً وجوب التصريح عن التابع قبل التمكن من استخدامه، وبمجرد التصريح عن التابع، يمكنك استخدامه وكأنه موجود فعلاً في فيجول بيسك. تزيد بهذه الطريقة عدد التوابع الممكن استخدامها.
شاهدت أيضاً برنامج API Viewer، الذي يساعدك على نسخ الأسطر المصرحة عن التوابع، ولصقها في برنامجك.
صحيح أن هذا البرنامج لا يعلمك طريقة استخدام التوابع، لكن يمكن في بعض الأحيان اكتشاف ما يفعله التابع من اسمه المجرد.
تتواجد المعلومات الكاملة عن توابع API، في ملفات التعليمات Help Files، والوثائق التي تأتي مع بعض اللغات الأخرى مثل لغة Visual C++.

ودا اشرح الكامل لبرنامج الفيجوال بيسك قسمته على عشرين فصل لتسهيل فهمه وما تنسونيش فى الردود اوكى بااااااااااااى



__________________
 click on the picture to see it with the normal size
رد مع اقتباس
إضافة رد


(مشاهدة الكل عدد الذين شاهدوا هذا الموضوع : 2 :
اندرتيكر
أدوات الموضوع
انواع عرض الموضوع

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

كود [IMG]متاحة
كود HTML معطلة



المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل الثالث عشر!! arabasl منتدى Programming Languages 0 08-14-2012 12:37 PM
طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل الثانى عشر!! arabasl منتدى Programming Languages 0 08-14-2012 12:35 PM
طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل الحادى عشر!! arabasl منتدى Programming Languages 0 08-14-2012 12:30 PM
طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل الرابع! arabasl منتدى Programming Languages 0 08-14-2012 01:17 AM
طريقه عمل برنامج خاص بك باستحدم فيجوال بيسيك الفصل الثالث! arabasl منتدى Programming Languages 0 08-14-2012 01:10 AM

المنتدى ان المواضيع المكتوبة لا تعبر عن رأي الادارة ويتحمل محتوى المشاركة كاتبها ولا تستطيع ادارة المنتدى مراقبة جميع المشاركات اليومية لذلك في حال وجدت اي محتوى مخالف لحقوق الملكية قم بإبلاغ الادارة مباشرة
الساعة الآن 01:23 AM


Powered by ArabASL.Com; Version 3.8.7
Copyright © 2017 Arab ASL Solutions, Inc. All rights reserved. منتديات عرب اى اس ال
Adsense Management by Losha