اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الردود الموصى بها

قام بنشر

أداة إنشاء مجموعات الخيارات المخصصة {سلسلة الأدوات المساعدة المخصصة}


من منا لم يواجه عند تصميم تطبيق ما لحالات تتوقف على إستجابة المستخدم لتوجيه سير العمل بإتجاه مختلف عن الآخر وأغلب هذه الحالات نستخدم فيها مربع الحوار MsgBox فنطلب منه مثلاً الرد بنعم أو لا أو موافق أو إلغاء الأمر .... إلخ

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

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

لكل ما سبق أقدم لكم اليوم أداة أعتبرها من الأدوات المثيرة للإعجاب وذلك لأنها رغم بساطتها إلا أنها تقدم خدمة لاغنى عنها بل وتوفر علينا الكثير من الوقت والجهد ولبساطتها لم أحتاج إلى كتابة أي تعليمات لشرح طريقة عملها فكل ماهو مطلوب هو تعبئة بعض مربعات النص فقط

03.jpg.770baef8da682092b7223efbb82eab2d.jpg

ويمكن مشاهدة النتيجة مباشرة

04.jpg.8bdcabc50cea09127f82f2732a9e4fc7.jpg

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

Untitled2.jpg.236e55c411ddcee18852ffc8d577a63f.jpg

وكما تعودنا ستجدون في المرفقات ملفي أكسس الأول بإسم القالب ويحتوي على نموذجين ووحدة نمطية والحقيقة أنك لست بحاجة إلا إلى نموذج واحد إلى جانب الوحدة النمطية في النسخ النهائية (وهما ماستجدونهما في النسخة التوضيحية) أما نموذج منشئ صيغة أمر الإستدعاء فلن تحتاجه إلا خلال التطوير

وهنا يجب علي أن أتقدم بألشكر للأخ العزيز @Foksh والذي دائماً ما يتحفنا بهدايا تقدم في ظاهرها وظائف رئيسية وفي باطنها تقدم وظائف أخرى فرعية أو مخفية لاتقل في أهميتها عن الوظيفة الأساسية التي تقدمها الأداة ومن ضمن هذه الهدايا المخفية كانت وظيفة تحويل أي تطبيق إلى وظيفة إضافية Add-in لذا فقد قمت بإستخدام الكود الخاص به لمنح إمكانية حفظ الأداة كوظيفة إضافية ليمكن للجميع الإستفادة من الإداة في جميع تطبيقات أكسس دون الحاجة إلى إستيراد نموذج منشئ صيغة أمر الإستدعاء

ملف أكسس الآخر فهو بإسم (النسخة التوضيحية) وستجدون فيه بعض الأمثلة لطريقة الإستفادة من الأداة (أحد الأمثلة أعتبره هدية بحد ذاته)

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

في الأخير أرجو أن تنال الأداة إعجابكم وأن تجدو فيها الفائدة في أعمالكم

وإذا كان لدى أي أحد أي إستفسار أو ملاحظة فلا يبخل علينا بها

تحياتي


 

  • Like 1
  • Thanks 1
  • Moosak pinned this topic
قام بنشر

شكرا لك أخي منتصر 🙂 

وهذه رائعة جديد من روائعك .. 👍

جربتها .. وما عندي أي ملاحظة .. عمل متقن ماشاء الله ..

وفقك الله وأحسن الله إليك .. في ميزان حسناتك .. 🌹

  • Like 1
قام بنشر
5 ساعات مضت, Moosak said:

شكرا لك أخي منتصر 🙂 

وهذه رائعة جديد من روائعك .. 👍

جربتها .. وما عندي أي ملاحظة .. عمل متقن ماشاء الله ..

وفقك الله وأحسن الله إليك .. في ميزان حسناتك .. 🌹

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

أتمنى أن تكون وجدت إستخداماتها ذات فائدة لإستخدامها ضمن تطبيقاتك

 

  • Like 1
قام بنشر
21 دقائق مضت, منتصر الانسي said:

أتمنى أن تكون وجدت إستخداماتها ذات فائدة لإستخدامها ضمن تطبيقاتك

نعم أخي منتصر ، في بالي عدة مواضع لاستخدام هذه الأداة في تطبيقاتي 🙂 ..

هي أقرب للرسائل الخاصة بحيث يمكنك تخصيص الأزرار بشكل أوسع بدل الأزرار المحددة [نعم - لا - إلغاء الأمر] ..

والأمثلة التي وضعتها أنت تفتح الكثير من الأفكار 😎👌

  • Like 1
قام بنشر

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

هل تعتقد أن عشرة خيارات كافية كحد أقصى أم تفضل لو كانت أكثر؟

وإذا كان كنت تفضل زيادتها فكم تقترح أن يكون؟

قام بنشر

بدايةً ، ما شاء الله على الأفكار الجميلات النيرات هذه أخي @منتصر الانسي  :clapping:

عمل جميل ومفيد جداً ما تقدمت به ، ودائماً تتحفني بأفكارك التي أعتبرها هي الكون خارج الصندوق .

خطر ببالي نقطة قد تكون ذات وضوح أكثر إن تمت . وهي :-

في القالب والذي سيعتبر كأداة Adds-in مدمج ، عند انشاء الأكواد ونسخها ، تنتج بهذا الشكل كمثال :-

Call OpenCustomOptions("خيارات المستخدم" _
                      , "الخيار الأول" _
                      , "الخيار الثاني" _
                      , "الخيار الثالث" _
                      , "الخيار الرابع")

والمستخدم العادي - مع احترامي للجميع طبعاً - قد يضطر للرجوع الى أمثلة كي يتعرف على آلية ربط الحدث مع كل خيار تم انشاؤه .
وهنا سيلاحظ أن الأحداث هي - كمثال مقتبس من ملفات المشروع  :-

    Select Case intResult
        Case Is = 1
            DoCmd.OpenForm "frm01"
        Case Is = 2
            DoCmd.OpenForm "frm02"
        Case Is = 3
            DoCmd.OpenForm "frm03"
        Case Is = 4
            DoCmd.OpenForm "frm04"
    End Select

 

فكانت فكرتي لك إن كانت ممكنة هي بإضافة التوضيح لكيفية الإستدعاء إلى الكود الذي يتم انشاؤه من الزر cmdCopy .

أرجوأن أكون قد وُفقت في توضيح الفكرة التي تدور في رأسي :jump: .

  • Like 1
قام بنشر
منذ ساعه, منتصر الانسي said:

هل تعتقد أن عشرة خيارات كافية كحد أقصى أم تفضل لو كانت أكثر؟

مبدئيا أراها كافية 🙂🖐

26 دقائق مضت, Foksh said:

كانت فكرتي لك إن كانت ممكنة هي بإضافة التوضيح لكيفية الإستدعاء إلى الكود الذي يتم انشاؤه من الزر cmdCopy .

فعلا أتفق مع هذا الرأي وقد خطر على بالي أيضا .. 🙂

ومن الأفكار التي خطرت في بالي أيضا هو تحويل الإجرائية OpenCustomOptions إلى دالة Function ترجع القيمة المختارة مباشرة هكذا مثلا :

Public Function OpenCustomOptions(ParamArray strOptions()) As Integer
Dim DocName As String, OpArg As Variant
Dim strCode As String

strCode = strOptions(0)
Dim i As Integer
For i = 1 To UBound(strOptions())
     If strOptions(i) <> vbNullString Then strCode = strCode & "," & strOptions(i)
Next i
          
OpArg = strCode
DocName = "frmCustomOptions"
DoCmd.OpenForm DocName, , , , , acDialog, OpArg

OpenCustomOptions = intResult

End Function

وبهذا يمكن إسناد القيمة الراجعة مباشرة إلى الكود أو إلى متغير (أراها أسهل هكذا .. حالها حال الدالة MSGBOx المدمجة)  :

Private Sub cmd01_Click()

Dim Result As Integer

Result = OpenCustomOptions("حدد النموذج الذي تريد فتحه" _
                      , "نموذج إدخال البيانات" _
                      , "نموذج تعديل البيانات" _
                      , "نموذج إستعراض البيانات" _
                      , "نموذج تحديد معايير تصفية التقارير")


'سنستخدم قيمة المتغير الذي سيحتفظ برقم الخيار المطلوب

Select Case Result
    Case Is = 1
        DoCmd.OpenForm "frm01"
    Case Is = 2
        DoCmd.OpenForm "frm02"
    Case Is = 3
        DoCmd.OpenForm "frm03"
    Case Is = 4
        DoCmd.OpenForm "frm04"
End Select

End Sub

ولكن انتبهت لاحقا أن النموذج يرجع قيمتين intResult و strResult .. فتراجعت عن الإفصاح عن الفكرة 😅

قام بنشر

أولاً شكراً لكم على التفاعل وعلى المقترحات التي قدمتموها وبالفعل هذه المقترحات في محلها وقد فكرت فيها شخصياً ولكن إسمحوا لي توضيح فكرتي في سبب عدم العمل بها

57 دقائق مضت, Foksh said:

والمستخدم العادي - مع احترامي للجميع طبعاً - قد يضطر للرجوع الى أمثلة كي يتعرف على آلية ربط الحدث مع كل خيار تم انشاؤه .

سبب عدم إضافة هذه الأسطر كان بسبب إختلاف الصيغة بإختلاف الإجراء الذي سيتم بناءً على الخيار المحدد فمن خلال الأمثلة سنجد أنه مرة ظهر بالشكل الذي ذكرته في ردك وفي مكان آخر ظهر بهذا الشكل

Call OpenCustomOptions("إختر الإدارة المطلوبة" _
                      , "الإدارة العامة" _
                      , "البحث والتطوير" _
                      , "الخدمات العامة" _
                      , "العمليات" _
                      , "المالية" _
                      , "المبيعات والتسويق" _
                      , "المشتريات" _
                      , "الموارد البشرية" _
                      , "تكنولوجيا المعلومات")
            
DoCmd.OpenForm "frmEmployees", , , "EmpDepartment='" & strResult & "'"

لاحظ أننا إكتفينا بأخذ القيمة النصية ووضعناها كمعيار تصفية مباشرة بدون إستخدام عبارة Select Case بالإضافة إلى ذلك في الحالات التي سيكون فيها خيارين فقط فقد يكون من الأفضل إستخدام عبارة IF بدلاً عن Select Case

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

وكما تفضلت وذكرت في كلامك فإن تفضيلي عدم إضافة أسطر خاصة بعبارة Select Case حتى لا يظن المستخدم العادي بأنها إلزامية ويجب أن تكون بتلك الصيغة 

الحقيقة لا أخفيكم بأنه في البداية كان يتم إنشاء صيغة الكود لتكون بهذا الشكل

Call OpenCustomOptions("حدد أحد الخيارات التالية" _
                      ,"الخيار الأول" _
                      ,"الخيار الثاني" _
                      ,"الخيار الثالث")

'intResult يمكن الحصول على رقم الخيار المحدد من خلال المتغير العام
'strResult ويمكن الحصول على نص الخيار المحدد من خلال المتغير العام
'يمكنك إستخدام أحدهما أو كلاهما

بحيث تظهر هذه الثلاثة أسطر بعد صيغة الأمر وتراجعت عنها حتى لا يبقيها المستخدم العادي وكأنها جزء من الكود (يمكنكم الإطلاع على كود الحدث SetCode خلف النموذج frmCustomOptionsBuilder وستجدون أني قمت بتعليق الأسطر الثلاثة)

بعد هذا التوضيح هل تعتقدون أن وجهة نظري كانت في محلها أم أني بالغت في الحذر ؟ فلو رأيتم أنه من الأفضل إضافة الأسطر الخاصة بعبارة Select Case فلا توجد مشكلة سأقوم بإضافتها فرأيكم سيكون هو الأفضل بالتأكيد

55 دقائق مضت, Moosak said:

ومن الأفكار التي خطرت في بالي أيضا هو تحويل الإجرائية OpenCustomOptions إلى دالة Function ترجع القيمة المختارة مباشرة هكذا مثلا :

وأنا كذلك كنت بصدد الرد ولكن بعد قرائتي لآخر سطر في ردك تراجعت عن الفكرة :biggrin:

 

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
×
×
  • اضف...

Important Information