شريط التقدم Progress Bar

 

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

من أمثلة العمليات التي قد نرغب في لإظهار شريط تقدم للمستخدم فيها :

1- إلحاق السجلات بالجدول .

2- حذف سجلات من جدول إذا كانت السجلات كثيرة لأن ذات العدد القليل سيتم حذفها في اجزاء بسيطة من الثانية ولن يمكن ملاحظة الحذف .

3- عند عمل حساب أو تقرير ختامي ختامي .

4- عند أرشفة سجلات أو القيام بعمليات تحديث ضخمة .

في شريط المعلومات انظر الصورة :

شريط التقدم بالكود

باستخدام عنصر اكتف اكس انظر الصورة :

شريط التقدم بعنصر اكتف اكس

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

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

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

لإظهار شريط التقدم أثناء إجراء عملية ما يمكن ذلك بطريقتين :

(1) باستخدام  SysCmd .

(2) باستخدام عنصر تحكم ActiveX .

 

أولا : بالكود

بهذه الطريقة يتم استخدام SysCmd .

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

1- افتح نموذج جديد .

2- في حدث نقر زر أمر مثلا ضع :

Dim str As String
Dim i As Integer

 

SetOption "Confirm Action Queries", False

str = "تقدم عملية ..."

SysCmd acSysCmdInitMeter, str, 100
For I = 1 To 100
SysCmd acSysCmdUpdateMeter, I
DoCmd.RunSQL ("INSERT INTO جدول ( حقل ) SELECT 'أي عبارة' AS حقل;")
Next I
SysCmd acSysCmdRemoveMeter

 

 

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

تحت سطر DoCmd وقبل Next I في الكود السابق ضع :

Pause 0.03

 

وفي أسفل الوحدة النمطية الخاصة بالنموذج ضع الإجراء التالي :

Private Sub Pause(ByVal nSecond As Single)

Dim t0 As Single
t0 = Timer
Do While Timer - t0 < nSecond
Dim dummy As Integer

dummy = DoEvents()
If Timer < t0 Then
t0 = t0 - CLng(24) * CLng(60) * CLng(60)
End If
Loop

End Sub

 


 

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

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

 

س: ولكن ألا يؤخر ذلك في إنجاز العملية ما أقصده ألن يزيد ذلك في الوقت المفترض لإنجازها ؟

ج: هذا صحيح لأن الحلقة نفسها تكون بعد نهاية العملية فمن الطبيعي أننا سنضيف وقتاً آخر لوقت إنجاز العملية الأصلي .

 

س: أريد مثال على ذلك .

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

Dim str As String
Dim i As Integer

 

DoCmd.RunSQL ("DELETE جدول.* FROM جدول;")

str = "تقدم عملية الحذف ..."
SysCmd acSysCmdInitMeter, str, 100

For I = 1 To 100
SysCmd acSysCmdUpdateMeter, I
Pause 0.03
Next I
SysCmd acSysCmdSetStatus, "انتهت عملية الحذف ."

 


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

Private Sub Pause(ByVal nSecond As Single)

Dim t0 As Single
t0 = Timer
Do While Timer - t0 < nSecond
Dim dummy As Integer

dummy = DoEvents()
If Timer < t0 Then
t0 = t0 - CLng(24) * CLng(60) * CLng(60)
End If
Loop

End Sub

 

 

 

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

Dim str As String
Dim i As Integer
Dim عدد_سجلات_الجدول
عدد_سجلات_الجدول = DCount("تسلسل", "جدول")

DoCmd.RunSQL ("DELETE جدول.* FROM جدول;")

str = "تقدم عملية ..."
SysCmd acSysCmdInitMeter, str, عدد_سجلات_الجدول
For i = 1 To عدد_سجلات_الجدول
SysCmd acSysCmdUpdateMeter, i
Pause 0.03
Next i
SysCmd acSysCmdSetStatus, "انتهت العملية ."

SysCmd acSysCmdRemoveMeter

 

ثانياً : باستخدام عنصر تحكم اكتف اكس

[1] يتم في هذه الطريقة استخدام العنصر المسمى MSCOMCTL.OCX وقد تحتاج إلى تسجيل هذا العنصر إذا لم يكن مسجلاً .

يوجد هذا العنصر في المسار C:\Windows\System أو حسب مسار الوندوز عندك .

ولتسجيله انقر قائمة أدوات ثم عناصر تحكم اكتف اكس ثم تسجيل ثم اختر الكائن والموجود في مجلد System للوندوز مي أو مجلد System32 للوندوز اكس بي ثم موافق ثم إغلاق ، انظر الصورة :

تسجيل عنصر التحكم
 

[2] ولإدراج الكائن انقر قائمة إدراج ثم عنصر تحكم اكتف اكس ثم اختر الكائن المسمى :
Micosoft ProgressBa Control Version 6.0

وإذا لم تجده فقد تجد الاصدار الخامس وليس السادس .
انظر الصورة التالية :

إدراج عنصر تحكم اكتف اكس

بعد ذلك سيظهر هذا العنصر على شكل مستطيل فارغ قم بتعديل ابعاده كما تحب .

 

[3] الآن لإظهار شريط التقدم له ضع في حدث نقر زر أمر مثلا الكود التالي مع ملاحظة أن اسمع العنصر في الكود هو ProgressBar2  :

Dim i As Integer
' إخفاء رسائل التأكيد عند تشغيل استعلام الالحاق
SetOption "Confirm Action Queries", False

For i = i To 100
DoCmd.RunSQL ("INSERT INTO جدول ( حقل ) SELECT 'أي عبارة' AS حقل;")
ProgressBar2 = i
Next i

 


لايحتاج هذا العنصر إلى فترة إيقاف مثل السابق  .

 

[4] والآن إليك بعض خصائص هذا الكائن :

(1) خاصية MAX : وهي من أهم الخصائص له حيث تحدد الحد الأقصى له ، ففي مثالنا السابق جعلنا الحد الاقصى للعنصر 100 ، وهي القيمة الافتراضية للعنصر عند إدراجه ، ولكن إذا كان عدد العناصر أكبر أو أقل فيجب أن نغير هذه الخاصية إما من صفحة الخصائص في صفحة التبويب غير ذلك أو بالكود كالتالي :

ProgressBar2.Max= رقم

 

(2) Min : القيمة الابتدائية للعنصر ، اتركها على القيمة الافتراضية صفر .

 

(3) MousePointer : لاختيار شكل الماوس أُثناء مروره على العنصر قبل بدء تشغيله .

 

(4) MouseIcon : لم أجد لها تأثيراً .

 

(5) BorderStyle : لم أجد لها تأثيراً واضحاً سوى تغير حجم المربعات أثناء أثناء التنفيذ .

 

(6) Appearance : لها خيارين إما 1-cc3d وهو يشبه خاصية تأثير خاص غاطس لبعض كائنات الأكسس كمربعات النصوص والخيار الثاني هو 0-ccFlat وهو يشبه خاصية غير مفصل .

 

(7) Orientation : وهي اتجاه العنصر إما أفقي القيمة صفر أو عمودي القيمة واحد .

 

(8) Scrolling : وهي إما Standard Scrolling وهي أن تظهر خطوط بيضاء أثناء تقدم المؤشر أو Smooth Scrolling بدون ظهور لها .

 

يوجد لهذا العنصر عدة أحداث وهي :

1- عند التحديث

2- عند الإدخال

3- عند الخروج

4- عند التركيز

5- عند فقدان التركيز

 

[5] لإظهار معلومات أثناء تنفيذ العملية ، مثال ذلك إذا أردنا أن نظهر معلومات معينة في مربع تسمية اسمه تسمية5 أثناء التنفيذ نستخدم الكود التالي تحت السطر ProgressBar2 = i كالتالي :

If ProgressBar2 = 100 Then
تسمية5.Caption = "معلومات"
Me.Repaint
End If

 

 

[6] لوضع نموذج مخصص يمكن استدعاؤه من أي نموذج أو حتى تقرير :

(1) أنشئ نموذج جديد .

(2) اجعل الخواص التاليه له إلى لا :

(3) اجعل نمط الحدود بلا .

(4) اجعل خاصية منبثق إلى نعم وخاصية مشروط إلى نعم .

(5) في حدث عند الفتح له ضع الكود التالي :

If Me.OpenArgs <> "" Then
Me.TimerInterval = 1000
Else
Cancel = -1
End If

 

(6) في حدث عند عداد الوقت ضع :

ProgressBar2.Max = Me.OpenArgs
For I = I To Me.OpenArgs
ProgressBar2 = I
Pause 0.02
Next I
Me.TimerInterval = 0
DoCmd.Close acForm, Me.Name

 

(7) وفي آخر الوحدة النمطية ضع :

Private Sub Pause(ByVal nSecond As Single)

Dim t0 As Single
t0 = Timer
Do While Timer - t0 < nSecond
Dim dummy As Integer

dummy = DoEvents()
' If we cross midnight, back up one day
If Timer < t0 Then
t0 = t0 - CLng(24) * CLng(60) * CLng(60)
End If
Loop

End Sub

 

 

(8) وعند فتح هذا النموذج فقط مرر له رقم مثل :

DoCmd.OpenForm "اسم النموذج",,,,,,100

 

 

ملاحظة : الأمثلة المرفقة لاتشمل كل ماتم التكلم عنه هنا .
 

مثال بالأكسس 97

كل الملفات مضغوطة

تحتاج إلى برنامج فك الضغط

انقر هنا لتحميل الملف

مثال بالأكسس 2000