دليل استخدام إجراءات VBAppAss.dll

للمبرمجين بلغة Visual Basic 6.0


الدالة UserAuthorized

تحديد ما إذا كانت مجموعة صلاحيات مستخدم تتضمن صلاحية معينة.


الصيغة:

Function UserAuthorized(Authorities As Long, Authority As Long, _
  Optional ShowNonAuthorizedMsg As Boolean = False, _
  Optional NonAuthorizedMsg As String = "", _
  Optional MsgFlags As VbMsgBoxStyle = vbOKOnly Or vbCritical _
    Or vbMsgBoxRight Or vbMsgBoxRtlReading) As Boolean


الصنف:
TUserInterface.


الوسائط (Parameters):

Authorities عدد صحيح طويل (Long) يمثل مجموعة الصلاحيات.
Authority الرقم الذي يمثل الصلاحية التي نريد الكشف عن وجودها ضمن الصلاحيات. هذا الرقم يجب أن يكون بين 1 و 32.
ShowNonAuthorizedMsg بارامتر اختيار يحدد ما إذا سيتم عرض رسالة عند عدم وجود الصلاحية ضمن الصلاحيات.
NonAuthorizedMsg بارامتر اختيار يحدد نص الرسالة التي سيتم عرضها عند عدم وجود الصلاحية ضمن الصلاحيات (إذا كانت قيمة البارامتر ShowNonAuthorizedMsg هي True).
MsgFlags بارامتر اختيار يحدد مواصفات رسالة عدم وجود الصلاحية.

الشرح:
هذه الدالة مفيدة جداً في معالجة صلاحيات المستخدمين إذا كان برنامجك يتضمن تسجيل مجموعة من المستخدمين مع تحديد مجموعة من الصلاحيات لكل منهم على حدة.
من خلال تجربتي وجدت أن أفضل طريقة لمعالجة الصلاحيات، و خاصة تخزينها في قاعدة بيانات، هي بتمثيلها بعدد صحيح بحيث تتم معاملته كقناع من البتات (Bitmask). لتوضيح الفكرة سنفترض أن مجموعة الصلاحيات ممثلة ببايت (Byte) واحدة. سيكون التمثيل الثنائي للبايت كالتالي:

رقم البت12345678
قوة البت1248163264128

ملاحظة: في الواقع، غالباً ما يتم ترقيم البتات ابتداءً من الصفر، لكننا هنا بدأنا الترقيم بالواحد لأن الدالة UserAuthorized هكذا تتعامل معها.

الفكرة هنا أن أي صلاحية واحدة منفردة (لوحدها) تمثلها بت واحدة، أي تكون قيمة تلك البت 1 و باقي البتات صفر، و بالتالي فإن قيمة الصلاحية هي قوة البت المقابلة لها. مثلاً البت رقم 4 (التي تمثل الصلاحية رقم 4) قوتها هي 8، و البت رقم 7 (التي تمثل الصلاحية رقم 7) قوتها هي 64.
بهذا الشكل يصبح من الواضح أنه في حالة وجود أكثر من بت واحدة قيمتها واحد (1) فذلك يعني وجود أكثر من صلاحية، و تصبح قيمة مجموع الصلاحيات هي مجموع قوى البتات التي قيمها 1.
مثلاً، إذا كانت مجموع الصلاحيات ممثلة بالعدد 37 فإن شكله الثنائي سيكون هكذا:

رقم البت12345678
قوة البت1248163264128
قيمة البت10100100

حيث:

مجموع قوى البتات التي قيمها 1 = 1 + 4 + 32 = 37 = مجموع الصلاحيات.

و كما نلاحظ فإن ذلك يعني أن المستخدم لديه الصلاحيات رقم 1 و 3 و 6 (نفس أرقام البتات المقابلة).

إن هذا الشرح طبقناه على بايت واحدة (8 صلاحيات) للتبسيط و التوضيح، لكن الدالة UserAuthorized تستطيع التعامل مع 32 صلاحية (بنفس الطريقة)، حيث نلاحظ أن البارامتر Authorities (الذي يمثل مجموع الصلاحيات) هو من النوع Long (أي 4 بايتات × 8 بتات = 32 بت).

ما الفائدة من ذلك؟
إن هذا يسهل كثيراً حفظ صلاحيات المستخدمين مع أسمائهم في قاعدة البيانات في حقل واحد (من النوع الصحيح الطويل - Long) بدلاً من استخدام حقل من النوع المنطقي (True / False) لكل صلاحية على حدة. تصور كيف سيكون حجم السجل إذا كانت لديك 15 أو 20 صلاحية في البرنامج!! بالطبع سيكون لديك 15 أو 20 حقلاً من النوع المنطقي - ياللهول!!!
و فوق ذلك، إذا اضطررت إلى زيادة عدد الصلاحيات في برنامجك فإنك لن تغير في برنامجك فقط، بل ستكون مضطراً أيضاً إلى تعديل قاعدة البيانات - هل تشعر بالإرهاق؟!

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

Public Const AUTH_ADD_STUDENT = 1&
Public Const AUTH_EDIT_STUDENT = 2&
Public Const AUTH_DEL_STUDENT = 3&
Public Const AUTH_SHOW_REPORT = 4&
Public Const AUTH_PRINT_REPORT = 5&
Public Const AUTH_EDIT_MARKS = 6&
Public Const AUTH_MOVE_NEXT_CLASS = 7&
.
.
.

للأسف! لا تحتوي Visual Basic على نوع بيانات للأعداد الصحيحة بأكثر من 4 بايت (32 صلاحية)، لكن يمكنك التحايل على ذلك باستعمال متغيرين (و بالتالي حقلين من النوع Long في قاعدة البيانات) لتمثيل الصلاحيات، و سيكون بإمكانك مراقبة 64 صلاحية. انظر قسم الاستخدام أدناه للتوضيح.

توضيح البارامترات
إذا كانت قيمة البارامتر ShowNonAuthorizedMsg هي True و كان البارامتر NonAuthorizedMsg عبارة عن نص فارغ (Empty string) فإن الدالة - في حالة عدم وجود الصلاحية - تعرض رسالة افتراضية هي: "عفواً... ليس من صلاحياتك إنجاز هذه المهمة."
البارامتر MsgFlags لا يفيدك في الحصول على رد من المستخدم رغم أنه يمكنك استعماله لتغيير مظهر الرسالة المعروضة. مثلاً يمكنك استعماله لإظهار الرسالة بأزرار "نعم" و "لا" أو "إلغاء الأمر" و "إعادة المحاولة"، لكن ذلك لا يفيد في شيء. لقد تم توفير هذا البارامتر لسببين: أولاً لتتمكن من تغيير رمز الرسالة (الافتراضي علامة الخطأ)، و ثانياً لتتمكن من تغيير مظهر الرسالة ليكون من-اليسار-إلى-اليمين إذا كانت واجهة تطبيقك بالإنجليزية (الافتراضي من-اليمين-إلى-اليسار).


الاستخدام:

Const AUTH_ADD_CUST = 1
Const AUTH_DEL_CUST = 2

Dim ObjUI As New TUserInterface
Dim UserAuths As Long  ' نفرض أن هذا المتغير يمثل مجموعة الصلاحيات

If ObjUI.UserAuthorized(UserAuths, AUTH_ADD_CUST) Then
  .
  .
  .
Else
  MsgBox "المعذرة، ليس مسموحاً لك بتسجيل زبائن جدد."
End If


للتعامل مع أكثر من 32 صلاحية قم بحفظ مجموعة الصلاحيات الثانية (من 33 إلى 64) في متغير ثانٍ من النوع Long (مثلاً: UserAuths2)، ثم قم بإنشاء الدالة التالية و استخدمها بدلاً من الدالة UserAuthorized (يمكنك أن تسميها أي اسم غير الاسم المقترح هنا!):

Public Function UserAuthorized64(ByVal Authority As Long) As Boolean
  If Authority > 32 Then
    ' Convert value of Authority from
    ' range (33-64) to range (1-32):
    Authority = (Authority Mod 33) + 1
    ' Call UserAuthorized using UserAuths2:
    UserAuthorized64 = ObjUI.UserAuthorized(UserAuths2, Authority)
  Else
    ' Call UserAuthorized using UserAuths:
    UserAuthorized64 = ObjUI.UserAuthorized(UserAuths, Authority)
  End If
End Function

لكن في هذه الحالة ستحتاج أيضاً لإنشاء روتين إضافة صلاحية و روتين إزالة صلاحية. للتسهيل عليك سأكتبهما لك هنا:

Public Sub AddAuthority64(ByVal Authority As Long) As Boolean
  If Authority > 32 Then
    Authority = (Authority Mod 33) + 1
    ObjUI.AddAuthority UserAuths2, Authority
  Else
    ObjUI.AddAuthority UserAuths, Authority
  End If
End Sub

Public Sub RemoveAuthority64(ByVal Authority As Long) As Boolean
  If Authority > 32 Then
    Authority = (Authority Mod 33) + 1
    ObjUI.RemoveAuthority UserAuths2, Authority
  Else
    ObjUI.RemoveAuthority UserAuths, Authority
  End If
End Sub

و يمكنك بالطبع إنشاء روتين لإضافة كافة الصلاحيات و آخر لإزالة كافة الصلاحيات:

Public Sub AddAllAuthorities64() As Boolean
    ObjUI.AddAllAuthorities UserAuths
    ObjUI.AddAllAuthorities UserAuths2
End Sub

Public Sub RemoveAllAuthorities64() As Boolean
    ObjUI.RemoveAllAuthorities UserAuths
    ObjUI.RemoveAllAuthorities UserAuths2
End Sub


انظر أيضاً:
الروتين AddAuthority.
الروتين AddAllAuthorities.
الروتين RemoveAuthority.
الروتين RemoveAllAuthorities.


بداية الصفحة