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

مثال للإستفادة من Class Module وتضمين خصائص ووظائف ودوال له

بدأه koao في 2 فبراير 2010 · 17 رد · 1,756 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

هذا مثال بسيط لشرح جزء بسيط من إستخدامات الـ Class Module وما قد يحويه من خصائص ووظائف ودوال ومتغيرات

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

فلنبدأ بسم الله

إبدأ مشروع جديد ... ثم إفتح محرر الأكواد بالضغط على Alt + F11 معا ... ثم أنقر بزر الفأرة اليمين على منطقة فارغة من نافذة مستعرض المشروع التي في أعلى يسار نافذة محرر الأكواد ... ثم أشر على Insert وإختر من القائمة المنبثقة Class Module ... ستلاحظ أنه أنشأ كلاس بإسم Class1 غير إسمه إذا أردت بتحديده ثم ستظهر خصائصه في نافذة الخصائص تحت ومنها خاصية Name غيرها لما تريد .. وستلاحظ أيضا أنه فتح لك صفحة جديدة وفي أعلاها الكود التالي

Option Compare Database

غيره إلى التالي

Option Explicit

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

سنعرف الآن كائن من نوع تسمية في فضاء الأسماء (أعلى الكود تحت سطر الكود السابق ذكره) ليحمل التسمية التي سنسندها له لاحقا لنتلاعب بها

Private MLabel As Label

سنكتب الآن دالة على مستوى Public لنستطيع رؤيتها من مكان خارج الكلاس .. كما سترى عندما نكتب كود النموذج لاحقا ...

Public Sub ContainerLabel(CLabel As Label)
    Set MLabel = CLabel
    MLabel.Height = 232
    MLabel.FontSize = 8
End Sub

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

كما تعلمون أن شريط التقدم يبين للمستخدم أن البرنامج يقوم بتنفيذ كود وكل ما قام بجزئية يظهر له تقدم خطوة وهكذا حتى يكتمل شريط التقدم ليبين إنتهاء البرنامج من تنفيذ الكود .... ولكي يعلم شريط التقدم كمية العمليات التي سيقوم بها البرنامج ... لازم نبين له هذه الكمية ... فلنفرض أنك ستستخدم حلقة لتنفيذ كود وستستمر هذه الحلقة 1000 مرة .... فتحتاج أن تعطي هذه القيمة لشريط التقدم ... لذا نحن نحتاج أن نصنع خاصية جديدة وهي MaxValue ونستطيع أن نجعلها تأخذ قيمة أو تعطي قيمة أو كلاهما .... ولغة الـ VBA تسمح لنا بذلك بإستخدام العبارة ... Property Let أو Property Set للكتابة ... و Property Get للقراءة .. والفرق بين الأولى والثانية أن الأولى تعطي قيمة للخاصية (ByVal) والأخر تعطي قيمة مرجعية للخاصية (ByRef) ... وتستطيع البحث عن الفرق بينهما ... ولكننا سنستخدم Property Let للكتابة

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

Private MMax As Long

ثم نكتب كود إعطاء قيمة للخاصية كالتالي

Public Property Let MaxValue(MxValue As Long)
    MMax = MxValue
End Property

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

ثم نكتب كود قراءة قيمة الخاصية كالتالي

Public Property Get MaxValue() As Long
    MaxValue = MMax
End Property

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

ولزيادة فهمنا لموضوع الخصائص آثرت أن أضيف خاصية جديدة ... وهي خاصية لون الخط داخل شريط التقدم

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

Private FClr As Long

ثم نكتب كود إعطاء قيمة للخاصية كالتالي

Public Property Let ForeColor(FrColor As Long)
    FClr = FrColor
    MLabel.ForeColor = FrColor
End Property

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

ثم نكتب كود قراءة قيمة الخاصية كالتالي

Public Property Get ForeColor() As Long
    ForeColor = FClr
End Property

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

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

Public Sub Reset()
    StepQty = Round(MLabel.Width / 90, 0)
    Partial_Step = StepQty / MMax
    MLabel.Caption = ""
    MLabel.Parent.Repaint
End Sub

مع ما ذكرته سابقا جعلت الدالة تقوم بأشياء اخرى سنستخدمها لاحقا في الدالة التالية دالة Step .. فالكود في السطر الأول من الدالة مسؤول عن مهما كان عرض شريط التقدم فإنه سيملأ بمربعات التقدم .. والمربع هنا كما سنبين لاحقا هو رمز تراه عند ضغط Alt+8 وعرضه تقريبا 90 ... والدالة Round تعطي الرقم المقرب لرقم معاملها الأول وهو ناتج قسمة عرض شريط التقدم على 90 وتقربه لعدد خانات الرقم العشري المتمثل بالرقم الموجود في معاملها الثاني .. وبحكم أنه صفر فسينتج لنا رقم صحيح يمثل عدد المربعات أو الخطوات التي يستوعبها شريط التقدم

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

في السطر الثالث ... هذا الكود المسؤول عن تفريغ شريط التقدم من المربعات بجعل خاصية Caption لكائن التسمية يساوي لا شئ

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

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

Public Sub Step()
    Hold_Step = Hold_Step + Partial_Step
    If Hold_Step >= 1 Then
        For Pass_A_Step = 1 To Int(Hold_Step)
            MLabel.Caption = MLabel.Caption & Chr(8)
        Next Pass_A_Step
        Hold_Step = Hold_Step - (Pass_A_Step - 1)
    End If
    MLabel.Parent.Repaint
End Sub

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

الآن وبعد ما إنتهينا من كتابة كود الكلاس فدعونا نعرف كيف نستخدمه داخل نموذجنا

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

أولا نحتاج أن نعرف كائن ليمثل الكلاس كالتالي

Dim koao As New koaoProgressBar

الآن أكتب koao ثم نقطة أو Dot ستلاحظ أنه ظهرت قائمة بالخصائص والدوال والوظائف التي يتضمنها الكلاس كالصورة التالية

post-43910-12651406420297_thumb.gif

الآن تستطيع تعطي قيم للخصائص وتقرأ قيمها وتنفذ دوال ووظائف الكلاس بكل سهوله

وستجد في المرفق مثال وبه الكود التالي لتتمكن من الفهم مع التطبيق

Dim y, f As Long
    Dim koao As New koaoProgressBar   '  عرفنا كائن ليمثل الكلاس'

    koao.ContainerLabel koaoPB  '  هنا إستخدمنا الدالة الخاصة بتحديد التسمية الحاوية والتي ستستخدم كشريط تقدم'
    koao.MaxValue = 1000  '  هنا أعطينا قيمة لخاصية أعلى قيمة لشريط التقدم'
    '   في الأسفل أعطينا قيمة لخاصية لون الخط لشريط التقدم على حسب إختيار المستخدم من مربعات خيار الألوان الموجود على النموذج'
    koao.ForeColor = Switch(GBox = 1, vbRed, GBox = 2, vbBlue, GBox = 3, vbGreen, GBox = 4, RGB(0, 0, 0))
    koao.Reset   '   هنا إستخدمنا دالة تفريغ شريط التقدم'
    GBoxL.ForeColor = koao.ForeColor   '   هنا قرأنا قيمة خاصية لون الخط لشريط التقدم وأسندناها لتسمية موجودة على النموذج'
    For y = 0 To koao.MaxValue  '  هنا قرأنا قيمة خاصية أعلى قيمة لشريط التقدم وإستخدمناها كالحد الأعلى للحلقة'
        For f = 0 To 100000
'   الحلقة الداخلية هذه هي لتشبيه عملية تنفيذ كود يأخذ وقت'        
        Next f
        koao.Step   '   هنا إستخدمنا دالة أمر شريط التقدم أن يخطو خطوة جزئية' 
    Next y

    Set koao = Nothing   '   نجعل قيمته لا شئ لتحريره من الذاكرة'

هذا ولا تنسوننا من صالح دعائكم

والحمدلله رب العالمين أولا وآخرا

koaoProgressBar.zip

تم تعديل هذه المشاركة بواسطة koao في 3 فبراير 2010 في 00:06

1

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#2

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

بارك الله فيك أخي koao

ورزقك الله الجنة ، مشكور جداً على العمل الرائع

بوركت يداك

post-12787-12741339659298.jpg

ومامن يد إلا يد الله فوقها *** وما من ظالم إلا سيبلى بأظلم

تفضل أخي الكريم | موسوعة الحميدي الذهبية | بأجزائها الثلاثة مع هدية الموسوعة .

#3

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

وأياك أخي hamidymom وشاكر لك دعمك ودعواتك

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

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#4

الاخ الفاضل / koao

جزاك الله كل خير ويعطيك الف عافيه

شرح جميل شخصيا تم الاستفادة منه

#5

مثال رائع اخى

جزاك الله خيرا

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#6

مثل جميل شكرا لك

#7

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

أخي الكريم koao مثال أكثر من رائع فبارك الله في علملك وعملك وجزيت كل خير ...

(`'•.¸(` '•. ¸ * ¸.•'´)¸.•'´)

«´¨`.¸ أبو رهـــــــف ¸.´¨`»

(¸. •'´(¸.•'´ * `'•.¸)`'•.¸ )

¸.•’’ ’’

( `•.¸

`•.¸

#8

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

إخواني الكرام .... أبو شادي ...... Lara M .... mrnooo2000 .... أبو رهف

شرفتوا موضوعي بمروركم الكريم ... وأشكر دعمكم وتحفيزكم بكلماتكم الجميلة ودعواتكم

فجزاكم الله خيرا

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#9

مثال رائع جدا ويستحق الإشادة به وجدارة

كما أن طريقة الشرح رائعة وجميلة

بوركت أخي الكريم koao وجزاك الله الجنة

وإلى الأمام دائما بما يفيد هذا الصرح العظيم (منتديات الفريق العربي للبرمجة)

أبو محمد

#10

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

أخي الكريم أبو محمد .... زدت موضوعي روعة بمرورك الكريم

وكلماتك لهي وسام شرف أعتز به .. فلك الشكر والإمتنان

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#11

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

بارك الله فيك اخي الكريم

#12

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

وإياك أخي sx1 ... وشاكر لك مرورك الكريم

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#13

جزاك الله عنا خيرا

بس انا لي طلب

انا بجد مش عارف انطق اسمك

ممكن تكتبه بالعربى

#14

تسلم ايدك ... مثال رائع

تحياتى

#15

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

أخي الكريم yassin123 ... هذا لأنه إسم معرف ... وقد يكون أي شئ ..عموما أتشرف بمعرفتك يالغالي ... أخوك خالد

وأشكر مرورك الكريم

أخي الكريم migo702000 ... شرفت موضوعي بمرورك الكريم

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#16

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

مشكور أخي العزيز واستاذي خالد باشا على هذه الهدايا الجميلة ..+1

جزاك الله كل خير .... ورحم الله والديك ..

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

تم تعديل هذه المشاركة بواسطة moh samer ali في 7 فبراير 2010 في 18:14

27169617.gif
#17

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

وإياك أخي الكريم moh samer ali ... وشاكر لك الزيادة ... وأكبر زيادة هي تشريفك لموضوعي

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#18

جزاك الله خير على المثال الرائع

والشرح الجميل

تمنياتى لك وللجميع بالتوفيق

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

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

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

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

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