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

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

قام بنشر

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


أقدم لكم اليوم أداة جميلة وهي أداة تقوم بنفس الوظيفة التي يقوم بها أحد عناصر تحكم ActiveX وهو عنصر التحكم SpinButton ولكنها تتميز عنه في أنها تضيف إمكانية القيام بنفس العمل ولكن عن طريق لوحة المفاتيح وأيضا التحقق من صحة البيانات

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

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

أرجو أن تنال الأداة إعجابكم وفي إنتظار أي أسئلة أو ملاحظات

تحياتي


 

  • Like 2
قام بنشر

ماشاء الله عليك أخي منتصر .. شعلة من النشاط :clapping:
وضحت كل شي بالتفصيل الممل :biggrin:👌

حتى الأمثلة التي أوردتها راااائعة ومن الواقع العملي ..👍:yes:

عمل رائع وجهد مشكور .. في ميزان حسناتك يارب ..:rol:🤲

 

فقط مما لاحظت على السريع (مع علمي بأن الأداة قابلة للتخصيص والتعديل بكل سهولة :biggrin:🖐️) :

* في المثال 1 والمثال 2 : لو كتبت القيمة بيدي ثم ضغطت على أزرار الكيبورد لا يتعرف على القيمة الجديدة بل على آخر قيمة كانت محفوظة  .. إلا إذا فقد مربع النص التركيز ثم عاد إليه ..


image.png.82dff985fcbca014ad49d569d3b41b97.png

* في المثال 3 : عند استخدام مفاتيح الكيبورد أو الأزرار بالنسبة للمثال الثاني (الذي يقفز 10% مع كل ضغطة ) القيمة تقف عند 90% وتقف ولا تصل إلى 100% ..

image.png.bc4754cc3d51365ebc96eb64a818fe38.png

ولك مني كل التحيات الطيبات المباركات ..🌹

قام بنشر

يا عيني يا عيني :clapping:

ما هذا الجمال ، والإبداع أخي منتصر :jump:

بارك الله فيك على هذه المشاركة الجميلة فعلاً والتي يحتاجها الكثير فعلاً ..

 

تعقيباً على كلام أخي موسى ، والذي لا ينقص من روعة العمل شيئاً ، لاحظت ما يلي يما يتعلق بالنقطة الثانية :-

  • استخدام تعريف المتغير Private lngStep As Single في بداية النموذج الفرعي sbfSpinButtons . حيث أن نوع البيانات Single ( وحتى Double ) يعتمد على نظام الفاصلة العائمة الثنائي . وهنا الكسور العشرية التي تبدو بسيطة مثل 0.1 أو 0.05 لا يمكن تمثيلها بشكل دقيق تماماً بالنظام الثنائي ؛ فيتم تخزينها بقيمة تقريبية تزيد قليلاً عن القيمة الأصلية .
  • ثم يأتي شرط فحص الحد الأقصى في الدالة Up ، حيث varMaxValue = 1 ، في الجملة :-
    If (ctlTxtBox.Value + lngStep) <= varMaxValue Then

    وفرضاً ، الشرط يختبر هل 1.00000001490116 <= 1 ؟؟؟ والنتيجة قطعاً هي لا = False . بالتالي يرفض الكود الزيادة :yes: ، ويتجمد الرقم عند 90% (0.9) .
    ونفس الأمر يتكرر مع خطوة 5% بعد 20 نقرة حيث يتجاوز المجموع الرقم 1 بجزء متناهي الصغر ، فيتوقف عند 95% . ونفس المشكلة تحدث أيضاً عند النزول Down . عندما يصل إلى 10% ثم ينقص 0.1 ، يصبح الناتج تقريباً -0.0000000149 ( أقل من الصفر ) ، فيتوقف عند 10% ولا يصل إلى 0% .

 

لذا ، خطر ببالي ومن باب التجربة ما يلي ، على الدالتين Up و Down ، مع تغيير نوع المتغير طبعاً ليصبح الضع كالتالي :-

  1. نوع المتغير في تعريفه من Single إلى Double .
  2. الدالتين تصبحان :-
    Private Sub Up()
        Dim curVal As Variant
        Dim stpVal As Variant
        Dim nextVal As Variant
        
        stpVal = CDec(lngStep)
        
        If Not ctlTxtBox Is Nothing Then
            ' الوضع الأول: مع مربع النص
            If IsNumeric(ctlTxtBox.Value) Then
                curVal = CDec(ctlTxtBox.Value)
                nextVal = curVal + stpVal
                
                If Not IsEmpty(varMaxValue) Then
                    If nextVal <= CDec(varMaxValue) Then
                        ctlTxtBox.Value = CDbl(nextVal)
                    ElseIf curVal < CDec(varMaxValue) Then
                        ' إذا تجاوزت الخطوة الحد الأقصى وكان الرقم أقل منه (مثل 99% مع خطوة 3%) نضبطه على 100%
                        ctlTxtBox.Value = varMaxValue
                    End If
                Else
                    ctlTxtBox.Value = CDbl(nextVal)
                End If
            End If
        Else
            ' الوضع الثاني: مع متغير وحدث
            curVal = CDec(dblValue)
            nextVal = curVal + stpVal
            
            If Not IsEmpty(varMaxValue) Then
                If nextVal <= CDec(varMaxValue) Then
                    dblValue = CDbl(nextVal)
                ElseIf curVal < CDec(varMaxValue) Then
                    dblValue = CDbl(varMaxValue)
                Else
                    Exit Sub
                End If
            Else
                dblValue = CDbl(nextVal)
            End If
            RaiseEvent ValueChanged(dblValue)
        End If
    End Sub
    
    Private Sub Down()
        Dim curVal As Variant
        Dim stpVal As Variant
        Dim nextVal As Variant
        
        stpVal = CDec(lngStep)
        
        If Not ctlTxtBox Is Nothing Then
            ' الوضع الأول: مع مربع النص
            If IsNumeric(ctlTxtBox.Value) Then
                curVal = CDec(ctlTxtBox.Value)
                nextVal = curVal - stpVal
                
                If Not IsEmpty(varMinValue) Then
                    If nextVal >= CDec(varMinValue) Then
                        ctlTxtBox.Value = CDbl(nextVal)
                    ElseIf curVal > CDec(varMinValue) Then
                        ' إذا نزلت الخطوة عن الحد الأدنى وكان الرقم أكبر منه نضبطه على 0%
                        ctlTxtBox.Value = varMinValue
                    End If
                Else
                    ctlTxtBox.Value = CDbl(nextVal)
                End If
            End If
        Else
            ' الوضع الثاني: مع متغير وحدث
            curVal = CDec(dblValue)
            nextVal = curVal - stpVal
            
            If Not IsEmpty(varMinValue) Then
                If nextVal >= CDec(varMinValue) Then
                    dblValue = CDbl(nextVal)
                ElseIf curVal > CDec(varMinValue) Then
                    dblValue = CDbl(varMinValue)
                Else
                    Exit Sub
                End If
            Else
                dblValue = CDbl(nextVal)
            End If
            RaiseEvent ValueChanged(dblValue)
        End If
    End Sub

 

  • Like 1
قام بنشر

في البداية أشكركما على كلامكما المحفز الذي يدفعني لتقديم أفضل مايمكنني تقديمه

أولاً فيما يخص ملاحظات الأخ @Moosak 

9 ساعات مضت, Moosak said:

* في المثال 1 والمثال 2 : لو كتبت القيمة بيدي ثم ضغطت على أزرار الكيبورد لا يتعرف على القيمة الجديدة بل على آخر قيمة كانت محفوظة  .. إلا إذا فقد مربع النص التركيز ثم عاد إليه ..

الوضع يختلف بين المثال 1 و المثال 2 ففي المثال 1 ولأنه يتم التعامل مع قيمة مربع النص بواسطة الأداة فقد قمت بتعديل الكود لتجاوز هذه المشكلة (إن شاء الله تكون ضبطت 😅)

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

أما الملاحظة الثانية

9 ساعات مضت, Moosak said:

* في المثال 3 : عند استخدام مفاتيح الكيبورد أو الأزرار بالنسبة للمثال الثاني (الذي يقفز 10% مع كل ضغطة ) القيمة تقف عند 90% وتقف ولا تصل إلى 100% ..

فالحقيقة أن ما حصل معي هو العكس فالمثال الأول كان يصل الى 99٪ فقط والثاني كان يصل الى 100٪ 😚 (لم أنتبه لهذا الخطأ إلا بعد ملاحظتك :wub:)

ولكن والحمدلله فقد قام الأخ @Foksh مشكورآ بتوضيح سبب المشكلة لا بل وجاء بالحل ايضا وهذا ليس مستغربا منه فله جزيل الشكر

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

أرجو تجربة النسخة الجديدة وإبداء أي ملاحظات أخرى مع خالص تحياتي لكم

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

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

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

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

سجل حساب جديد

تسجيل دخول

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

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

Important Information