مربع الحوار MsgBox نحتاجه بشكل كبير في المواضع التالية :
1- تخيير المستخدم بين إتمام عملية أو التوقف .
2- التنبيه على خطأ إجراء عمله المستخدم .
3- التنبيه على كيفية أداء عملية .
4- إظهار معلومات معينة بعد البحث عنها .
يمكن أن تقسم MsgBox الى قسمين :
1- لاتعيد قيمة
2- تعيد قيمة
النوع الأول في التنبيه على المستخدم مثل رسائل الخطأ وفي عرض بعض البيانات التي لانحتاج لقرار المستخدم بعد اطلاعه عليها والخلاصة في الرسائل التي لانحتاج أن نعرف على ماذا نقر المستخدم من زر (يفترض في هذه الحالة أن الرسالة بزر موافق فقط) .
النوع الثاني يستخدم عندما نرغب في معرفة رأي المستخدم في عمل أو إجراء ما كتحديث بيانات أو حذف سجلات أو طباعة تقرير بدلاً من معاينته أو إغلاق القاعدة أو غير ذلك مما يلزم منه معرفة رغبة المستخدم .
وتتأكد الرسالة بشدة وينصح بها عندما يكون العمل الذي نفذه المستخدم عرضه لتنفيذه خطأ من قبل المستخدم كحذف كل سجلات الجدول فمن الخطأ ترك هذا الأمر بدون التنبيه على المستخدم لأن النتيجة إذا عمل ذلك المستخدم كارثة على البيانات ويشمل ذلك كل استعلامات الفعل .
ويستحب أيضا إظهار معلومات عند طباعة تقرير مع إظهار الخيارات التي اختارها المستخدم في النموذج الذي نطبع منه مثال ذلك :
سوف تتم طباعة كل البيانات بين تاريخ / / وتاريخ / / .
لأن المستخدم قد يضع تاريخ خطأ أو يختار اسم موظف خطأ وهكذا .
قاعدة الرسالة كالتالي :
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
وبالعربي :
MsgBox(رسالة[, أزرار] [, عنوان] [, ملف التعليمات, رقم الموضوع في ملف التعليمات])
رسالة : نص بين فواصل مزدوجة " ، أقصى حد له من عدد الحروف 1024 ، يمكن أن يظهر النص في سطر واحد أو عدة سطور كالتالي :
في سطر واحد :
Msgbox "الفريق العربي للبرمجة ، عنوانه : http://arabteam.nicmatic.com "
في عدة سطور :
Msgbox "الفريق العربي للبرمجة " & VbCrLf & "عنوانه : http://arabteam.nicmatic.com "
هنا سيظهر النص في سطرين .
أزرار :
vbOKOnly : عرض زر موافق وبالأرقام لإظهار هذا الزر اكتب صفر .
vbOKCancel : عرض زر موافق و زر إلغاء الأمر وبالأرقام اكتب 1
vbAbortRetryIgnore : عرض زر تجاهل وزر إعادة المحاولة وزرإحباط وبالأرقام اكتب 2
vbYesNoCancel : عرض زر نعم ولا وإلغاء الأمر وبالأرقام اكتب 3
vbYesNo : عرض زر نعم لا وبالأرقام اكتب 4
vbRetryCancel : عرض زر إعادة المحاولة وزر إلغاء الأمر وبالأرقام اكتب 5
vbCritical : عرض الأيقونة :

وبالرقم 16
vbQuestion : عرض الأيقونة :

وبالرقم 32
vbExclamation : عرض الأيقونة :

وبالرقم 48
vbInformation : عرض الأيقونة :

وبالرقم 64
أي زر هو الافتراضي :
الزر الافتراضي هو الذي يكون عليه التركيز عند ظهور الرسالة :
vbDefaultButton1 : الزر الأول هو الافتراضي وبالرقم صفر
vbDefaultButton2 : الزر الثاني هو الافتراضي وبالرقم 256
vbDefaultButton3 : الزر الثالث هو الافتراضي وبالرقم 512
vbDefaultButton4 : الزر الرابع هو الافتراضي وبالرقم 768
ونعرف ترتيبه في نفس الكلمة ابتداء من اليسار ، مثال :
vbYesNoCancel
الزر الأول : نعم
الزر الثاني : لا
الزر الثالث : إلغاء الأمر
vbApplicationModal : جعل البرنامج لايستجيب ككل حتى يقوم بالإستجابة للرسالة بنقر أحد الأزرار وبالرقم صفر
vbSystemModal : جعل الرسالة ظاهرة أمامه ولو انتقل لتطبيق آخر مع السماح له بنقل التركيز لأي نافذة أو تطبيق مفتوح وبالرقم 4096
vbMsgBoxHelpButton : إضافة زر تعليمات لتشغيل ملف التعليمات وليس له قيمة راجعة ولكن عند النقر عليه يتم تشغيل ملف التعليمات المحدد في الجزء helpfile وبالرقم 16384
VbMsgBoxSetForeground : لم أعرف ما عمله .
vbMsgBoxRight : جعل محاذاة النص من اليمين إلى اليسار 524288
vbMsgBoxRtlReading : جعل الرسالة عربية الاتجاه وبالرقم 1048576
لوضع أكثر من زر استخدام علامة الجمع (+)
القيم العائدة من نقر الأزرار :
موافق : القيمة واحد
إلغاء الأمر : القيمة 2
إحباط : القيمة 3
إعادة المحاولة : القيمة 4
تجاهل : القيمة 5
نعم : القيمة 6
لا : القيمة 7
وبالثوابت :
موافق : vbok
إلغاء الأمر : vbcancel
إحباط : vbAbort
إعادة المحاولة : vbRetry
تجاهل : vbIgnore
نعم : vbyes
لا : vbno
وللتأكد من القيمة استخدم أحد الأساليب التالية :
If msgbox("رسالة",vbYesNo ,"عنوان")=vbyes Thenويمكن استبدال vbyes بـ 6
أو
Dim remsg As Integer
remsg = MsgBox("رسالة", vbOKCancel, "عنوان")
If remsg = vbOK Then MsgBox "لقد اختار موافق ."وهذه تفيد خاصة إذا استخدمت القيمة العائدة في أكثر من شرط في الكود .
أبسط شكل للرسالة هي :
Msgbox "رسالة"
سيظهر زر موافق في النسخ العربية وزر Ok في النسخة اللاتينية لأنه هذا الزر افتراضي حتى ولو لم تضعه .
تساوي الرسالة السابقة :
MsgBox "رسالة", vbOKOnly
إذا وضعت الأقواس بعد MsgBox وقد اخترت أزرار أو وضعت عنوان فسوف تظهر رسالة خطأ إذا لم تسند القيمة الراجعة الى متغير أو تضعها في عبارة شرطية كما سبق .
تشاهد أن ثلاثة أزرار تحمل الرقم صفر وهي : vbOKOnly و vbDefaultButton1 و vbApplicationModal وذلك لأنها قيم الرسالة الافتراضية فسواء كتبتها أم تركتها .
في الأكسس 97 كان يمكن جعل السطر الأول في الرسالة أسود عريض باستخدام @ ، ولكن لم يعد هذا متوفراً في الأكسس 2000 ويمكن التحايل على ذلك بالعبارة التالية :
Eval ("MsgBox('السطر الأول الأسود.@سطر عادي.@', 3, 'هنا اكتب العنوان')")غير مايلزم مع الانتباه إلى أن الرقم 3 يرمز الى الثابت vbYesNoCancel ولايسمح باستخدام النص بدلاً من الرقم هنا .
التحكم في العبارة الظاهرة على الأزرار
يمكن تغيير العبارات التي تظهر على الزر للتعبير عن شيء ما فبدلا من ظهور كلمة نعم تظهر اطبع أو بدلا من لا تظهر لاتطبع أو احذف أو اي كلمة تراها مناسبة للسياق أكثر من ثوابت الأكسس .
في الوحدة النمطية العامة اكتب التالي :
Public Ok, Cancel, ABORT
Public RETRY, IGNORE, YES, NO
Private m_hHook As Long
Private Const IDOK = 1
Private Const IDCANCEL = 2
Private Const IDABORT = 3
Private Const IDRETRY = 4
Private Const IDIGNORE = 5
Private Const IDYES = 6
Private Const IDNO = 7
Private Const WH_CBT = 5
Private Const GWL_HINSTANCE = (-6)
Private Const HCBT_ACTIVATE = 5
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _
(ByVal hDlg As Long, ByVal nIDDlgItem As Long, _
ByVal lpString As String) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Sub MessageBoxH(hwndThreadOwner As Long)
Dim hInstance As Long
Dim hThreadId As Long
hInstance = GetWindowLong(hwndThreadOwner, GWL_HINSTANCE)
hThreadId = GetCurrentThreadId()
m_hHook = SetWindowsHookEx(WH_CBT, AddressOf _
MsgBoxHookProc, hInstance, hThreadId)
End Sub
Private Function MsgBoxHookProc(ByVal uMsg As Long, ByVal _
wParam As Long, ByVal lParam As Long) As Long
If uMsg = HCBT_ACTIVATE Then
SetDlgItemText wParam, IDOK, Ok
SetDlgItemText wParam, IDCANCEL, Cancel
SetDlgItemText wParam, IDABORT, ABORT
SetDlgItemText wParam, IDRETRY, ABORT
SetDlgItemText wParam, IDIGNORE, ABORT
SetDlgItemText wParam, IDYES, YES
SetDlgItemText wParam, IDNO, YES
UnhookWindowsHookEx m_hHook
End If
MsgBoxHookProc = False
End Functionوفي حدث نقر زر أمر مثلا ضع :
Ok = "أطبع"
Cancel = "لا ماله داعي"
MessageBoxH Me.hwnd
If MsgBox("رسالة .......", vbOKCancel + vbMsgBoxRight + vbMsgBoxRtlReading, "عنوان") = vbOK Then
' ثم بقية الأمر .ملاحظات هامة :
1- أطول عبارة ممكن إظهارها على الزر هي مايقارب 22 حرف مثل بسم الله الرحمن الرحيم .
2- القيم العائدة من الرسالة حسب الزر الذي وضعت له العبارة ففي المثال السابق القيم العائدة هي VbOk أو vbOKCancel أو مايقابلها في الأرقام .
3- بقية الأزرار إذا رغبت في تغيير عباراتها كالتالي :
Ok
Cancel
ABORT
RETRY
IGNORE
YES
NO
ولكم تحياتي