الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هي فائدة الوحدات النمطية ؟؟؟

مغلق
بدأه ابن مسقط في 10 أكتوبر 2001 · 19 رد · 6,486 مشاهدة · في مراجعة المواضيع
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أخواني في الله

يوجد في برنامج الأكسيس وأخص هنا أكسيس 2000 ، بند في الكائنات باسم الوحدات النمطية ، ولجهلي بإختصاصها أسمحو لي بطرح الأسئلة التالية:-

1- لماذا سميت بذلك الأسم؟

2- ما هي فائدتها وكيف تستخدم ؟

3- وهل يمكن للشارح أن يتفضل بوضع مثال لقاعدة بيانات تعتمد على تلك الوحدات ؟

والله يوفق الجميع

ibnmusqat.gif
#2

الوحدات النمطية هي جزء موجود في كل اصدارات برنامج Microsoft Access و الهدف منها توفير لغة برمجة مناسبة لبناء التطبيقات بداخل Access.

الكود المستخدم في الوحدات النمطية في Microsoft Access 2000 هو Microsoft Visual Basic for Applications 6.0 اما الكود المستخدم في Microsoft Access XP فهو Microsoft Visual Basic For Applications 6.3

سابقا كان يستخدم Microsoft Access Basic و هي لغة تسبه كثيرا Visual Basic for Applications و لكنه تم توحيد اللغات المستخدمة في تطبيقات Microsoft Office

الوحدات النمطية على خلاف ما يعتقد الكثيرون فهي موجودة في معظم برامج Microsoft ، فهي موجودة في Microsoft Word و Microsoft Excel و Microsoft PoerPoint و Microsoft Visio و Microsoft FrontPage و Microsoft Outlook و الكثير غيرها

هي ايضا موجودة في برامج اخرى لا تصنعها مايكروسوفت و من اشهرها Autodesk AutoCAD 2000 و النسخة المحسنة منه Autodesk Map 5 و الكثير غيرها ، اكثر من الف برنامج الى هذه اللحظة.

ما يجعلها موجودة في الكثير من البرامج هو لان مايكروسوفت توزع كود ربطها بالبرامج التي تصنعها الشركات المختلفة بصورة مجانية ، فيصبح لدى برنامج لغة برمجة كاملة بدون اية تعب

كيف تستخدم في Microsoft Access ؟

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

و فصلها في الوحدات النمطية يعطيك الامكانية لبناء مكتبات كود كاملة يستخدمها برنامجك ، مثلا لو كنت تبني برنامج محاسبة و تحتاج كود احتساب شيئ ما ، فيمكنك كتابة كود الاحتساب في الوحدات النمطية و استخدامه في كل اجزاء برنامجك

#3

الأستاذ خضر ترزي

أشكرك على هذه المعلومات القيمة والمفيدة ولدي سؤالين أو ثلاثة في هذا الموضوع أرغب أن تتكرم بالإجابة عليها:

1- سمعت أو قرأت أن هناك نية لميكروسوفت لإلغاء هذه اللغة واستبدالها بلغة VB الشبيهه بها فهل هذا صحيح ؟

2- الوحدة النمطية للفئة ما وظيفتها وما الفرق بينها وبين الوحدات العامة ؟

3- حاولت العثور على الملف التنفيذ لمحرر الوحدات النمطية ولكن لم استطع العثور عليه فأين أجده ؟

ولك جزيل الشكر .

#4

بالنسبة للوحدات النمطية فهي بالفعل نفس الوحدات الخاصة بلغة فيجوال بيزك و لذلك اسمها بالعربي لغة فيجوال بيزك للتطبيقات.

مايكروسوفت الان تخطط بعد ان قامت بالانتهاء تقريبا من تكنولوجيا Visual Studio .NET (ستنتهي منها في غضون ثلاثة ايابيع من كتابة هذه الرسالة) فهي ترغب بان تدمج لغة فيجوال بيزك الجديدة من النسخة القادمة من Microsoft Access و هي Microsoft Access 2004

و لكن يظهر بانه تم توسيع المخطط اكثر من ذلك قليلا ، و لقد قررت الشركة دمج كل فيجوال ستوديوا مع Microsoft Access بحيث تكون برنامج خاص منه لعملية الدمج يسمى Microsoft Visual Studio for Applications

و اذا تم ذلك و هو احتمال اقترب من ان يصبح 100 بالمائة ، ستضاف بذلك لغات جديدة الى الوحدات النمطية ، و ليس ببعين ان تستخدم لغة #C (سي شارب) لبرمجة تطبيقات Microsoft Access او لغات فيجوال ستوديوا الاخرى.

هذا سيتضح اكثر في منتصف العام المقبل عندما يبداء تطوير Access 2004 و الذي ربما نحصل على نسخة منه في الفريق العربي للبرمجة مثلما حصلنا على النسخ المبكرة من Access 2002 XP

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

اي لو وضعنا زر ما و رغبنا ببناء اجراء عند الضغط على الزر فيجب على هذا الاجراء ان يكون بداخل الوحدة النمطية الخاصة بالنموذج

اما باقي الكود فقد قد نقوم ببنائه بصورة مستقلة في وحدات نمطية مستقله ، لغرض التنظيم فقط

الوحدات النمطية المستقلة يمكن ان نستدعي الكود المخزن بها من اية مكان في البرنامج ، اما الوحدات النمطيو التي في النموذج فيمكن استدعاء الكود الخاص بها من داخل النموذج فقط ، مع وجود بعض الاستثنائات في بعض الاحيان

و لكن الوحدات النمطية ليست كل شيئ فهناك شيئ لم تنتبهوا اليه و هو الكائنات Class Module و يظهر في القائمة الرئيسية في Insert و وظيفته بناء كائنات رئيسية اخرى

فمثلا لدينا الكائن application. و به مجموعة كبيرة من الاوامر ، ولن ماذا لو رغبت ببناء كائن مثلة و به الكثير من الاوامر الخاصة بي لاستخدمها في كل برامجي و هذه وظيفة الكائنات المخزنة في الوحدات النمطية

هناك نوع ثالث من الوحدات النمطية و الذي لم يرى النور حتى هذه اللحظة و هو وحدات نمطية تعمل من طرف الجهاز المركزي في ال Transaction Server بحيث تكتب كود يتم تنفيذه في معالج الجهاز المركزي و يتصرف و كانه في جهازك ، الان يمكن القايم به بالاستعانة مع فيجوال بيزك و Access و لكنه لم يدمج بداخل Access الى حتى الان ليصبح لدينا نوع ثالث من الوحدات النمطية.

بالنسبة للمحرر اعتقد بانه مدمج بداخل الملف msaccess.exe او ربما هو عبارة عن مجموعة ملفات dll يتم تنفيذها لتكون المحرر ، لست متاكد من ذلك ، ولكني اتذكر بانه في بعض النسخ كان لديه برنامج تنفيذي مستقل

#5

أستاذي / خضر ترزي

أشكرك جزيل الشكر على ردك الكريم

والتوضيح الذي أستفدت منه.

أستاذي / أبو حمود

لك جزيل الإمتنان على مداخلتك الجميلة والمفيدة.

وأسمحو لي بطلب أخير :

أن أحصل على مثال يتضمن بداخله

كوداً ًللوحدات النمطية مثل كود الإحتساب أو يشبهه

كالذي تكلم عنه الأستاذ/ خضر والذي يستخدم في جميع

أجزاء البرنامج.

والله يوفق الجميع.

ibnmusqat.gif
#6

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

أخوتى الأفاضل .. السلام عليكم و رحمة الله و بركاتة

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

فهل يمكن ان يكون بيننا جيمعا تعاون لعمل ملف يحتوى على دروس و توجيهات لتعلمها .. فالمكتبة العربية فقيرة جدا للمصادر التى توضح المفهوم العام لها مع امثلة بسيطة توضحة الفكرة ..

لعلى اثقلت عليكم باقتراحى هذا

خالص شكرى للجميع

اخـــــBengaـــوكم

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

#7

الأخ benga

أنا مستعد للمساهمة ولكن من أين نبدأ وماهو الترتيب لذلك .

ولك تحياتي

#8

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

اخى الحبيب ابو حمود

اشكرك جدا جدا على حُسن تعاونك الدائم .. اسأذنك فى بعض الوقت حتى ارتب لك افكارى فالحقيقة ..

فأنت فاجئتنى بردك الكريم ، و ان شاء الله سيكون مشروع نافع للجميع و سيكون مصدر - بفضل الله - من المصادر الهامة

شكرا لك

خالص شكرى و تقديرى

اخــــBengaــــوكم

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

#9

الأخ ابن مسقط : تجد على الوصلة التالية مثالا من عمل الأخ أبو هادي ، فيه وحدة نمطية عامة لاحتساب التاريخ الهجري حسب تقويم أم القرى في جميع أجزاء قاعدة البيانات :

http://mypage.ayna.com/harith55/UM-ALQ1.zip

مثال أبسط فيه وحدة نمطية عامة :

http://mypage.ayna.com/harith55/mosalsal.zip

الأخ أبو حمود ، الأخ benga نحن في شوق لما تطرحانه من فوائد، وجزاكما الله عنا كل خير .

#10

الأخ حارث

حياك الله طولت الغيبات .

الأخ benga

أفضل أن تفتح موضوع جديد إذا تجمعت لديك أفكار للموضوع وسنحاول أن نجعله دائما أول موضوع بالأفكار الجديدة .

ولك تحياتي

#11

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

اخى الحبيب ابوحمود

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

- بداية من فكرة اى نظام و كيفية تحليلة و تحليل المطلوب منه و تحديد الجداول المطلوبة و الحقول لكل جدول

- ثم تعريف بانواع الحقول المختلفة بالاكسيس و مثال على استخدام كل منها و بعض الخصائص المتعلقة بكل نوع حقل و كيف يمكن استخدام هذه الخصائص ..

- ثم محاولة فى الاستعلامات و فكرة عملها " فلسفة عملها " و انواعها و طرق وضع المعايير بها .. الخ

- ثم محاولة فى النماذج ايضا فكرتها و انواعها و اهمية كل نوع و مثال علية لتوضيح الأمر .. و افكار استخدامها .. الخ

- ثم الوحدات النمطية انواعها و اقسامها و اهميتها و و اسلوب عملها و امثلة عليها ..

الحقيقة انا لا ادعى علمى الواسع بكل هذه النقاط و لكنى كنت سأبدء و سأبدء باذن الله فى عمل مثل هذا الملف و فكرتى تقوم على عمل هذا الملف و وضعة فى موقع المنتدى او اى موقع يقترحة الاخوة ثم يقوم الجميع بتحميلة و الاستفادة بما فية و يتم عمل الاضافات المختلفة كلا حسب ما رزقة الله من علمة فى اى نقطة او اى ملاحظة او فكرة مرت به او تعلمها من مكان اخر - و بالطبع سيكون هناك عنوان يُشير إلى كاتب كل فكرة حتى يتم رد الحق لأهلة كما انه سيفيد عند مناقشة احد الأخوة للفكرة فيكون النقاش موجه لصاحب الموضوع او الفكرة مباشرة مما يثمر عن إقرار الفكرة او تعديلها و هكذا - و هكذا يصبح لدينا ملف منظم كامل - بل موسوعة كاملة تحمل فى طياتها خبرات الاخوة جميعا و هكذا كما تقول العبارة الرائعة " الخير يجر إلى الخير .. و الشر يجر إلى الشر " فهكذا اعتقد بل اؤكد أن " العلم يجر إلى العلم و الجهل يجر إلى الجهل "

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

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

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

و لكن هذا لن يعفيك من وعدك :) :) بشرح الوحدات النمطية و ستكون فاتحة خير باذن الله

خالص شكرى و تقديرى للجميع

أخـــــBengaـــــوكم

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

#12

الأخ benga

ما نسيت وعدي :)

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

ولك تحياتي

#13

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

الأخ / حارث

شكراً جزيلاً على المثالين اللذين قدمتهما.

ولي سؤال :-

ما هو الدور الذي تقوم به الوحدات النمطية في المثال الثاني؟

ولك ألف تحية.

ibnmusqat.gif
#14

أحيل السؤال على الأخ أبو حمود أو أبو هادي ، لأني أخشى أن يكون تصوري للكود خطأ. ومن أحيل على مليء فليتبع .

#15

طيب ،

أنا في إنتظار من يتفضل على بشرح المثال الثاني،

وله كل الأجر ان شاء الله.

والله الموفق

ibnmusqat.gif
#16

الأخ ابن مسقط

بعد إذن الأخ ابو هادي :

إن كنت تقصد الدالة :

Function IsLoaded(ByVal strFormName As String) As Integer

' Returns True if the specified form is open in Form view or Datasheet view.

Const conObjStateClosed = 0

Const conDesignView = 0

If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then

If Forms(strFormName).CurrentView <> conDesignView Then

IsLoaded = True

End If

End If

End Function

فهي لغرض التأكد من كون نموذج مفتوح أو لا وهي هامة في البرمجة وكثيرا ما نحتاجها .

وللتأكد من كون نموذج مفتوح اكتب في جملة شرطية :

If IsLoaded("اسم النموذج") Then

وتعيد الدالة True ناقص واحد إذا كان النموذج مفتوحا و False صفر إذا كان مغلقا علما أن السطر السابق ممثال للسطر التالي :

If IsLoaded("اسم النموذج")=True Then

ومماثل للسطر التالي :

If IsLoaded("اسم النموذج") = -1 Then

عموما الدالة مفيدة جداً ويحتاج إليها المبرمج بالتأكيد .

طريقة أخرى :

If Not ("اسم النموذج المطلوب التأكد من كونه مفتوحاً أم لا")مفتوح Then

MsgBox "لايمكن فتح هذا النموذج إلا ونموذج ...الخ"

DoCmd.Close

End If

وفي الوحدة النمطية العامة اكتب :

Public Functionمفتوح (النموذج As String)

Dim I As Byte

For I = 1 To Forms().Count - 1

If Forms(I).Name النموذج= Then

=مفتوح True

Exit Function

Else

مفتوح =False

End If

Next I

End Function

ولك تحياتي

#17

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

أستاذي / أبو حمود

جزاك الله الملايين من الخيرات على شرحك الوافي للمثال ،

سوف أحاول تطبيق شرحك على نماذج موجودة عندي.

ولك خالص التحية والتقدير.

ibnmusqat.gif
#18

الأخوة هذه بعض المعلومات التي اعتقد أن فيها بعض الفائدة عن الوحدات النمطية والمتغيرات والإجراءات جمعتها من بعض المنتديات والكتب وغيرها (مصادرها غير معروفة لدي واعتذر مقدماً عن كل نقل لم أشر فيه إلى مصدره) :

إعداد خيارات Visual Basic Editor

Auto Syntax Check : يدقق في أخطاء بناء الجملة بينما تقوم أنت بكتابة الشفرة . بتمكين Auto Syntax Check يمكن أن يعيد VBA تنسيق العبارات أو إضافة أو إزالة المسافات ، ويمكنه أن يغير جعل حروف الكلمات الأساسية كبيرة والمتغيرات لتلائم هذا التكبير في عبارة إعلان المتغير ويمكنه أن يصحح أخطاء بناء الجملة الصغيرة مثل إضافة علامة تنصيص مزودجة ناقصة .

Auto Indent : يضيف مسافة بادئة تلقائية لسطر متتابع الشفرة في نفس عدد وقفات الجدولة كالسطر الحالي .

Requir Variable Declaration : يتطلب الإعلان عن كل المتغيرات بوضوح بتمكين هذا الخيار ، يتم تضمين عبارة Option Explicit في عبارة Declaration لكل الوحدات الجديدة .

Auto List Members : يعرض قائمة بالخيارات الصالحة لعنصر الشفرة الذي طبعته عندما تشير لكائن أو متغير كائن (List PropertiesMethods) .

Auto Quick Info : يعرض بناء الجملة للإجراء أو الطريقة عندما تطبع الاسم متبوعاً بمسافة أو فترة أو أقواس فتح .

Auto Data Tips : تعرض القيمة الحالية للمتغير الذي تم تحديده عندما تكون في وضع توقف (Break) ومؤشر الفأرة فوق المتغير .

Tab Width : يعين عدد مسافات الجدولة ابتداء من إطار Module ، القيمة الافتراضية هي 4 .

Drag-and-Drop Text Editing : يتيح لك تحديد النص وسحبه لمكان آخر في إطار Module .

Default to Full Module View : يعرض كل الإجراءات في الوحدة النمطية أو الإجراء الحالي فقط .

Procedure Separator : يعرض قسم Declarations وكل الإجراءات في نفس اللوح مفصولة بأسطر أفقية .

المتغيرات Variables

، اختصارات أسماء الكائنات

الكائن الاختصار

Database Db

TableDef Tdf

QueryDef Qdf

Recordset Rst

Field Fld

Index Idx

Form Frm

Report Rpt

Control Ctl

TextBox Txt

ComboBox Cbo

CommandButton Cmd

Connection Con

Command Cmd

Parameter Par

جملة Option Compare Database

، هذه الجملة التي تظهر في أعلى الوحدة النمطية تحدد الطريقة المتبعة في القاعدة لمقارنة النصوص ويمكن وضع إما Option Compare Database أو Option Compare Binary أو Option Compare Text .

، يقوم أكسس تلقائياً بوضع جملة Option Compare Database في بداية الوحدة النمطية محدداً بأن طريقة المقارنة هي طريقة الفرز Sort المعتمدة في القاعدة ، وإذا لم يكن في الوحدة النمطية جملة Option Compare Database فإن أكسس يقوم بالمقارنة بالطريقة Binary معتمداً على ترتيب الحروف في جدول الآسكي ASCII الذي يعطي لكل محرف رقماً يخزن به وبالتالي فإن المقارنة ستأخذ بعين الاعتبار حالة الأحرف .

الوحدات النمطية والإجراءات

يتضمن Microsoft Access وحدات نمطية لفئات غير مقترنة مع أي كائن، ووحدات نمطية لنماذج ووحدات نمطية لتقارير تكون مقترنة مع نموذج أو تقرير.

، أنواع الإجراءات

هناك ثلاثة أنواع للإجراءات في VBA وهي إجراءات الدالة والفرعي والخاصية ، ولكل نوع غرض مختلف وزوج من العبارات المخصوصة لتحدد البداية والنهاية .

إجراءات الدالة

يقوم إجراء الدالة بأداء مهمة ، ويمكن أن يرجع قيمة واحدة ، يتم حساب القيمة المرجعة في الإجراء وتعيينها لاسم الدالة كواحدة من عبارات الإجراءات .

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

يمكن أيضاً استخدام إجراء دالة للتجاوب مع حدث ، يقوم أكسس بتشغيل الإجراء تلقائياً عندما يحدث الحدث وينبذ قيمة الدالة المعادة إن وجدت .

الإجراءات الفرعية

يقوم الإجراء الفرعي بأداء مهمة ولا يرجع قيمة ، بداية تستخدم الإجراءات الفرعية للتجاوب مع الأحداث ، تبدأ الإجراءات الفرعية بـ Sub وتنتهي End Sub .

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

Form_eventname

Report_ eventname

بحيث يكون eventname اسم الحدث . يتم تسمية إجراء حدث تم التعرف عليه من قبل عنصر تحكم في نموذج أو تقرير :

Controlname_ eventname

إجراءات الخاصية

يؤدي إجراء الخاصية مهمة إنشاء خاصية تخصيص لكائن ما ، ولعل أحد الأخوة ممن لهم خبرة أكبر أم يقوم بشرحها .

تحوي قاعدة البيانات على نوعين من الوحدات النمطية

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

(2) الوحدات النمطية العامة وهي تحوي الدوال والبرامج الفرعية التي يمكن إستدعاؤها من أي مكان في البرنامج .

أسماء الدوال والإجرءات الفرعية العامة يجب أن تكون فريدة ولاتتكرر في البرنامج وكذلك لايمكن استخدام دوال Access المضمنة كأسماء لدوال خاصة .

— يمكن الإشارة إلى إجراء في وحدة نمطية :

ModuleName.Procedurename

يمكن أن تحوي الوحدة النمطية :

(1) التصريحات Declarations :

وهي تعريف المتحولات Variables والثوابت Constants التي يمكن استخدامها في جميع برامج الوحدة النمطية أو في وحدات نمطية أخرى .

(2) إجراءات الأحداث Event Sub :

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

(3) البرامج الفرعية Procedures :

وهي البرامج الفرعية التي لاترتبط مباشرة بعنصر تحكم أو حدث ويمكن كتابة هذه البرامج في الوحدات النمطية لنموذج أو تقرير أو في الوحدة النمطية العامة .

ويمكن أن تكون البرامج الفرعية إما إجراءات Sub (برامج لا ترجع قيمة) أو دوال Function (برامج ترجع قيمة) .

● بالنسبة لأسماء الأحداث الخاصة بالنماذج فيكتبها أكسس بهذا الشكل :

Sub Form_eventname()

● بالنسبة لأسماء الأحداث الخاصة بالتقارير فيكتبها أكسس بهذا الشكل :

Sub Report_eventname()

● بالنسبة لأسماء الأحداث الخاصة بعناصر التحكم فيكتبها أكسس بهذا الشكل :

Sub controlname_eventname()

● إذا احتوى اسم عنصر التحكم على محارف غير الأرقام والأحرف فإن أكسس سيستبدلها في اسم الإجراء بـ (_) .

● إذا بدأ عنصر التحكم برقم أو بـ (_) فإن أكسس سيسبقها بـ ctl .

● إذا أردت تغيير أسم عنصر تحكم فمن الأفضل أن تقوم بذلك قبل أن تكتب إجراءات أحداث العنصر ، وإذا غيرت اسمه وله أحداث فيجب أن تغير اسماء إجراءات الأحداث المكتوبة بالاسم السابق وإلا لن يتعرف أكسس على هذه الأحداث كأحداث خاصة بهذا العنصر وسيعتبره أكسس إجراء عام ، ولتعديل أسماء الإجراءات اختر من القائمة اليسرى في عرض الوحدة النمطية General ثم اختر الإجراء بالاسم القديم من القائمة اليمنى وكرر هذا العمل لكافة الإجراءات المطلوب تغيير أسمائها .

● عندما تقوم بإنشاء برنامج فرعي فعليك تحديد فيما إذا كان البرنامج الفرعي :

(1) عاماً Public يمكن استدعاؤه من أي مكان في البرنامج .

(2) خاص Private لايمكن استدعاؤه إلا من البرامج الفرعية في نفس الوحدة النمطية .

إذا لم يتم تحديد نوع البرنامج الفرعي فسيعتبره أكسس برنامجاً عاماً تلقائياً .

● إذا أردت استحدام برنامج خاص بحدث نموذج أو تقرير وجعله برنامجاً عاماً امسح كلمة Private واستبدلها بكلمة Public ويمكنك إستدعاؤه بالطريقة التالية :

Form_formname.procedurename

لاحظ أن البرنامج داخل الوحدة النمطية يمكن إستدعاؤه سواء سبق بكلمة Private أ و كلمة Public ولكن عند وضع كلمة Public يمكن استدعاؤه من أي نموذج أو تقرير بالطريقة السابقة ، والفرق بينه وبين الإجراء العام في الوحدة النمطية العامة أن الإجراء في الوحدة النمطية العامة يمكن استدعاؤه من أي مكان في البرنامج ومن أي قاعدة بيانات أخرى بعكس الإجراء العام في الوحدة الخاصة بالنموذج أو التقرير فلا يمكن استدعاءه سوى في قاعدة البيانات الحالية فقط وبالطريقة المذكورة سابقاً .

ملاحظة : بعد تحويل الإجراء إلى إجراء عام في الوحدة الخاصة بالنموذج أو التقرير ثم كتابة :

Form_اسم النموذج.

تظهر كافة البرامج العامة في النموذج وكذلك خصائص النموذج والعناصر الموجدة عليه ، وتجد الإجراء العام بجواره مكعب أخضر .

ملاحظة : الدالة العامة هي التي تظهر في منشئ التعابير فقط : اضغط دالات ثم اسم قاعدة البيانات وستظهر في اليمين أسماء الدوال العامة .إذا احتجت إلى إجراء خاص في وحدة نمطية حوله إلى دالة Function أو اعمل دالة عامة جديدة وضع النداء التالي فيها :

Call اسم الإجراء الخاص

● من الممكن وضع إجراء في الوحدة النمطية لنموذج أو تقرير له نفس اسم إجراء عام في وحدة نمطية عامة وفي هذه الحالة يعتمد أكسس القاعدتين التاليتين ليحدد أي إجراء سيستدعي :

(1) سيبحث عن الإجراء في الوحدة النمطية للنموذج أو التقرير .

(2) فإذا لم يجد الإجراء سيقوم بالبحث في كل الوحدات النمطية العامة .

التعامل مع الكائنات في VBA

في VBA نرى أكسس كمجموعة من الكائنات التي لها الميزات الثلاث التالية :

- الخصائص Properties التي تصف مزايا الكائن .

- الطرق Methods التي تصف عمليات يمكن أن يقوم بها أكسس على الكائن .

- الأحداث Events التي تستخدم لتنفيذ البرامج (الإجراءات) .

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

ويمكنك فعل المزيد مع الكائنات من خلال إجرءاءات VBA . مثلاً يمكنك كتابة إجراء يضع عنوان لنموذج أو يخفي جميع التسميات Label على تقرير .

وتحوي بعض الكائنات في أكسس كائنات أخرى ، مثلاً يحوي النموذج عناصر تحكم Controls .

وتجمع الكائنات في مجموعات Cooections وتحوي كل مجموعة عدداً من الكائنات (المجموعة هي بنفس الوقت كائن) مثلاً المجموعة Forms مؤلفة من جميع النماذج المفتوحة في قاعدة البيانات ، وكل نموذج يحوي مجموعة من عناصر التحكم الموجودة فيه Controls .

ويمكنك أن تحدد كائناً في VBA ينتمي لمجموعة باستخدام إحدى الطرق الثلاث التالية :

Identifier![ObjectName]

عليك كتابة اسم الكائن والأوقواس المربعة ضرورية إذا احتوى اسم الكائن على فراغ أو علامات ترقيم وإلا يمكن عدم كتابتها .

Identifier("ObjectName")

عليك كتابة اسم الكائن أو استخدام متحول String يحوي اسم الكائن ، وإذا كنت تستخدم محولاً لإسم الكائن فمن الطبيعي أن لا تضع الأقواس المزدوجة " " .

Identifier(Index)

يستخدم هذا الشكل عادة للدوران على مجموعة الكائنات في مجموعة ، أو العودة للكائن باستخدام فهرسه في المجموعة .

ويمكن أن يكون Identifier اسم المجموعة التي تحوي الكائن ، أو اسم الكائن الذي تحوي مجموعته الافتراضية ObjectName مثلاً إذا كان نموذج الموظفين هو أول نموذج مفتوح ، يمكن الإشارة إليه بأحدى الطرق التالية :

Forms![نموذج الموظفين]

Forms("نموذج الموظفين")

Forms(0)

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

ويعتمد الشكل الذي تستخدمه على ماذا تريد أن تفعل ؟ فإذا لم تكن تستخدم متحولاً أو فهرساً لتحديد كائن فمن الأفضل استخدام الشكل الأول ، لأن إشارة التعجب تحدد بشكل صريح أن ObjectName هو اسم عنصر من المجموعة .

ويمكنك أيضاَ الإشارة إلى كائن بطريقة ترتيبه في المجموعة باستخدام الشكل Identifier(Index) ، ويستخدم هذا الشكل عادة للدوران على جميع الكائنات في مجموعة .

ولكل مجموعة خاصية Count التي تحدد عدد الكائنات في مجموعة ، ويبدأ فهرس الكائنات في المجموعة من الرقم صفر ، ولذا فإن فهرس الكائن الأخير في المجموعة هو Count-1 . وتسمح خاصية Count بتعيين حدود الحلقة كما في المثال التالي الذي يقوم بتغيير عناوين كل النماذج المفتوحة :

 
For I = 0 To Forms.Count -1
Forms(I).Caption= Now
                                 Next

شروط أسماء المتغيرات

(1) يجب أن تبدأ بحرف .

(2) لايصح أن تحوي فراغات أو علامات ترقيم .

(3) لايصح أن تكون أحد الكلمات المحجوزة في VBA .

، لا تأثير لحالة الأحرف عند كتابة الأسماء .

، اكتب Option Explicit في قسم التصريحات العامة لجعل الإعلان عن المتغيرات أمر إجباري ، ومن فوائد ذلك أن قد تخطئ في اسم المتحول فيعطيك ذلك نتائج خاطئة دون أن تعرف أن السبب هو الخطأ في اسم المتغير .

، الرموز المستخدمة مع المتغيرات عند الإعلان عنها :

الرمز النوع

% Integer

& Long

! Single

# Double

@ Currency

$ String

للإعلان عن مدى المتغيرات

السابقة===الموقع========المدى

Dim ===داخل إجراء====داخل الإجراء فقط (محلي)

Dim===في قسم التصريحات لنموذج أو تقرير أو وحدة نمطية=====جميع إجراءات نفس الوحدة النمطية (متحول وحدة نمطية)

Public===في قسم التصريحات العامة لنموذج أو تقرير=====جميع إجراءات قاعدة البيانات

Public===في قسم التصريحات لوحدة نمطية عامة جميع إجراءات قاعدة البيانات وقواعد البيانات الأخرى

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

، لاحظ أن المتغيرات العامة تحتفظ بقيمها طوال فترة فتح قاعدة البيانات .

، لجعل المتغير المحلي يحتفظ بقيمته بعد نهاية الإجراء حوله إلى متغير ساكن باستخدم Static بدلاً من Dim .

، لجعل متغيرات إجراء متغيرات ساكنة بغض النظر عن طريقة تعريف هذه المتغيرات ضع Static في بداية الإجراء ، مثال :

Static Sub

Static Function

، يمكن أن يكون نوع المتغير إما أحد الأنواع الأساسية وهي :

Integer, Long, Single, Double, Currency, String أو Variant .

أو نوع كائن Object Type .

، إذا كان العدد الذي تستخدمه لايحوي أرقاماً بعد الفاصلة فمن الأنسب تعريفه على أنه عدد صحيح (Byte - Integer -Long) حيث أن العمليات الحسابية تكون أسرع على الأعداد الصحيحة .

، إذا كان العدد يحتوي على فاصلة عشرية فيعرف باستخدام (Single - Double - Currency) مع ملاحظة أن Currency يقبل أربع خانات بعد الفاصلة العشرية وخمسة عشر قبلها ، و Single - Double لديهم مجال أكبر من Currency لكنهما يقومان ببعض التقريبات التي قد لاتكون مرغوبة في الحسابات المالية .

، جميع المتغيرات الرقمية يمكن أن تنسب إلى بعضها البعض ولكن انتهبه من مسألة التقريب .

، وعندما تعرف متغيراً نصياً فإن أكسس يعتبره تلقائياً سلسلة نصية ذات طول متغير وسيكبر المتغير أو يصغر حسب البيانات المنسوبة إليه ، ويمكنك تعريف متغير بطول ثابت بكتابة :

Dim متغير as String * 10

التعليمة السابقة تعرف متغير نصي طوله 50 حرف .

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

، نوع البيانات Variant

نوع البيانات Variant هو نوع بيانات متقلب ، بمعنى أنه يستطيع تخزين أي نوع بيانات . والغرض من هذا النوع هو السماح باستخدام قيم أنواع بيانات مختلفة دون الحاجة لتحويل أنواع البيانات الخاصة بك بنفسك . نوع البيانات Variant هو نوع بيانات فرضي في أكسس VBA ، لذلك إذا لم تحدد بوضوح نوع البيانات لمتغير ما ، يقوم VBA بتعيين نوع البيانات إلى Variant .

المميزات الأساسية لاستخدام متغيرات Variant تتضمن ما يلي :

من الأسهل إنشاء الشفرة لأنك لا تحتاج لمعرفة أنواع البيانات ولا للقلق مما إذا كانت أنواع البيانات الخاصة بالمتغيرات متوافقة أم لا .

متغير بيانات Variant هو الوحيد الذي له قيمة Null إذا أردت تعيين متغير لحقول يمكن أن يكون لها قيمة Null فإن استخدام متغير Variant يجنبك الحاجة لكتابة الشفرة للتعامل مع قيم بيانات Null .

أما عيوب استخدام متغيرات Variant :

تحتاج أقصى ذاكرة ، وكلما كبرت الذاكرة المربوطة في متغيرات الحفظ ، كلما قلت فرصة تواجدها لتشغيل التطبيق .

تتم الإجراءات التي تستخدم متغيرات Variant ببطء في كل مرة تشير فيها لمتغير Variant ، يجب على VBA أن يأخذ وقته في تحويل نوع البيانات لمتغير كائن لتحديد ما إذا كانت الخصائص والطرق التي تمت الإشارة إليها في الشفرة ملائمة للكائن أم لا .

إنشاء أنواع البيانات الخاصة بالمستخدم

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

انظر المثال التالي :

Public Type ddr
d1 As String
d2 As Long
d3 As Integer
End Type
وفي الإجراء :
Dim متغير as ddr
متغير.d1=
متغير.d2=
متغير.d2=

— خيارات الإعلان

[Optional] [byVal | ByRef] [ParamArray] varname[( )] [As type]

، Optional

لجعل المتغير إختياري .

، ByVal

لتمرير نسخة من المتغير بدلاً من القيمة .

، ByRef

لتمرير المتغير نفسه عكس السابق وهو الافتراضي .

، ParamArray

، لا يمكن تمرير عنوان متغير من النوع Variant لمتغير نصي وسيرجع الخطأ التالي :

[CODE2/]Byref argument Type Mismatch
وإحدى الطرق لتجنب هذه المشكلة هي تمرير تعبير وليس متغير وعندها سيقوم أكسس بحساب التعبير وتمرير النتيجة كمتغير دخل ، وأسهل طريقة لتحويل متغير إلى تعبير هي وضعه ضمن أقواس ، مثال :
Function Reverse ( s as strring, ByVal As Integer) as String
End Function
عندما نستدعي الدالة السابقة بالطريقة التالية يحدث خطأ :
[code]
Dim V as Varaint
V="Testing"
Call Reverse(V, 4)

والتصحيح :

Call Reverse((V), 4)

، عندما نمرر متغير إلى إجراء بطريقة تمرير العنوان By Reference فإن قيمته تتغير ، وعندما نمرره بطريقة تمرير القيمة By Val فإن نسخة ثانية من المتغير تمرر للإجراء وبالتالي إذا عدل الإجراء من قيمة المتغير فإنه يعدل على النسخة فقط ولن يتأثر المتغير الأصلي .

انظر المثال التالي لتوضيح الفرق بينهما :

Public Sub Passingvariablebyref()
Dim Strvariable As String
Strvariable = "المتغير قبل الإرسال"
Msgbox Strvariable
Call Getvariablebyref(Strvariable)
Msgbox Strvariable
End Sub
Public Sub Getvariablebyref(Byref Stra As String)
Msgbox Stra & "المتغير الآن في الدالة"
Stra = "المتغير في نهاية الدالة"
End Sub

وعند تغيير الدالة الأخيرة بهذه الدالة :

Public Sub Getvariablebyref(ByVal Stra As String)
Msgbox Stra & "المتغير الآن في الدالة"
Stra = "المتغير في نهاية الدالة"
End Sub

— أنواع البيانات العائدة من الدوال

عند تعريف دالة يستحسن أن تذكر القيمة العائدة منها ، فمثلاً :

Function Sd () as String

الدالة السابقة تعيد قيمة من النوع String .

وإذا لم تحدد نوع البيانات العائدة من الدالة فإن أكسس سيعتبرها من النوع Varaint والأول أفضل وأكثر فاعلية .

إذا لم تعيد الدالة من النوع String نص فإنها تعيد "" سلسلة ذات طول صفري أما الدوال من نوع Integer أو من نوع Double فإنها تعيد صفر .

، تمرير النموذج كوسيطة

اسم الدالة (Me)

اسم الدالة (Form)

، استخدام عدد غير محدد من الوسائط

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

تحديد أن الوسائط اختيارية .

استخدام وسائط مع أنواع بيانات معرفة من قبل المستخدم .

استخدام وسائط الصفوف .

يمكن تحديد أن بعض وسائط قائمة الوسائط اختيارية بواسطة كتابة كلمة Optional قبل اسم الوسيطة . ويجب أن تكون الوسيطة الاختيارية في نهاية قائمة الوسائط .

— المصفوفات Arrays

يوجد نوعين من المصفوفات :

(الأول) مصفوفات محددة العناصر :

(1) مصفوفة ذات بعد :

(2) مصفوفة ذات بعدين :

(3) مصفوفة ذات ثلاثة أبعاد :

(الثاني) مصفوفات ديناميكية

تستعمل عندما لايعرف عدد عناصر المصفوفة ، ولذا يمكنك تغيير العدد أثناء التنفيذ .

للإعلان عن مصفوفة ديناميكية مثال :

Dim AnyArray () As Integer

ولإعادة حجز العدد المطلوب من العناصر :

Redim AnyArray (5, 8)

، مالم تستخدم الكلمة المحجوزة Preserve بعد كلمة ReDim فإن جميع القيم المخزنة في المصفوفة ستضيع في كل تنفيذ للتعيمة ReDim .

، يمكن تحديد عدد عناصر مصفوفة بواسطة متغيرات ، مثال :

ReDim AnyArray (Y, U)

● بعض الأمثلة على الإعلان بواسطة Dim

، متغيرين من النوع Variant

Dim AnyValue, MyValue

، متغير من النوع Integer

Dim Number As Integer

، الأول فقط من نوع Variant , الثاني من نوع Boolean , والثالث من نوع Date

Dim AnotherVar, Choice As Boolean, BirthDate As Date

، مصفوفة من نوع Variant ذات خمسين عنصراً

Dim DayArray(50)

، مصفوفة ذات بعدين من النوع Integers

Dim Matrix(3, 4) As Integer

، مصفوفة ثلاثية البعد من النوع Doubles

Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double

، مصفوفة من النوع Date تبدأ من 1 إلى 10

Dim BirthDay(1 To 10) As Date

، مصفوفة من النوع Variants

Dim MyArray()

— الثوابت

، ثوابت المستخدم :

عند استخدام قيمة معينة عدة مرات في البرنامج أو عند كون القيمة يصعب تذكرها أو أن القيمة ذات اسم غير واضح في مثل هذه الحالات السابقة استخدم الكلمة المحجوزة Const والتي تسمح بإعطاء أسماء معبرة تدعى الثوابت الرمزية .

بناء الجملة :

[Public | Private] Const constname [As type] = expression

حيث constname تعبر عن اسم الرمز وهذا الاسم يتبع قواعد تسمية المتغيرات .

أمثلة :

' Constants are Private by default.
Const MyVar = 459
' Declare Public constant. 
Public Const MyString = "HELP"
' Declare Private Integer constant.
Private Const MyInt As Integer = 5
' Declare multiple constants on same line.
Const MyStr = "Hello", MyDouble As Double = 3.4567

، ثوابت مضمنة :

وهي الثوابت المضمنة في أكسس مثل acNormal

وللجميع التحية .

#19

هذا موضوع مرتبط في الموقع الرئيس للفريق العربي :

http://arabteam.nicmatic.com/study/vb/Class/index.htm

وللجميع التحية

#20

أستاذي/ أبو حمود

بالراحة علينا شويه :D

لقد أغرقتنا بعلمك في هذا المجال.

الله يحفظ هذه الأنامل التي قامت بإعداد الموضوع .

ولك كل التوفيق الدائم بإذن الله.

وتقبل تحياتي.

ibnmusqat.gif

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…