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

*كود* : توضيحات وفوائد في رسالة Msgbox

مغلق
بدأه ابوحمود في 8 فبراير 2002 · 2 رد · 6,674 مشاهدة · في قسم الأرشيف و المواضيع المميزه
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مربع الحوار 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 : عرض الأيقونة :

vbCritical.jpg

وبالرقم 16

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

vbQuestion.jpg

وبالرقم 32

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

vbExclamation.jpg

وبالرقم 48

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

vbInformation.jpg

وبالرقم 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

ولكم تحياتي

#2

موضوع مهم جدا ويحتاجه الجميع فعلا .

بارك الله فيك .

أشرف خليل

#3

فعلا انه موضوع مهم ولذالك استغرب عدم وضعه في ارشيف المنتدى

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

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