السلام عليكم ورحمة الله وبركاته
هذا مثال بسيط لشرح جزء بسيط من إستخدامات الـ 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 ستلاحظ أنه ظهرت قائمة بالخصائص والدوال والوظائف التي يتضمنها الكلاس كالصورة التالية
الآن تستطيع تعطي قيم للخصائص وتقرأ قيمها وتنفذ دوال ووظائف الكلاس بكل سهوله
وستجد في المرفق مثال وبه الكود التالي لتتمكن من الفهم مع التطبيق
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 ' نجعل قيمته لا شئ لتحريره من الذاكرة'هذا ولا تنسوننا من صالح دعائكم
والحمدلله رب العالمين أولا وآخرا


