منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مكتبة اكواد VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=185)
+--- الموضوع : ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional (/showthread.php?tid=50305)



ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - Mostchar - 15-09-24

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

(ByVal ParamArray Cont() As System.Windows.Forms.Control, Optional ByVal FldCont As System.Windows.Forms.Control = Nothing)


RE: ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - Taha Okla - 15-09-24

يا هلا :
- أولاًَ : يجب أن تراعي أن الــ(ParamArray) يجب أن يكون في آخر البارامترات لأي إجراء.
- ثانياً : يجب أن يكون عندك إختلاف بنوع البيانات بين البارام الأول و الـ (ParamArray)  إختلافاً جذرياً  :
        يعني مش تحط واحد int والثاني long    لأن في حال الارقام الصغيرة لن يميز المترجم بينهما ..
        بالتالي لن تحصل على نتيجة صحيحة وإن حصلت : فـ بـالصدفة لا أكثر.
- ثالثاً : لا يمكن الجمع بينهما فعلياً، ولكن فيك تكتب الاجراء الأساسي مرتين أو ثلاث مرات (مع اختلاف البارامترات).
وعندما تكتب البارام الاختياري مع البارام المصفوفي ، لا تكتبه كـ إختياري بـ كـ إجباري.  
فتكتب الاجراء : في كل مرة بـ بارامتر مختلف فيقوم المعالج بالتفريق بينهم من حيث نوع البيانات المدخلة.

- مثال عن إجراء فيك تستخدمه بأكثر من حالة :
كود :
   Sub TA(ByVal FldCont As Boolean, ByVal ParamArray Cont() As Integer)
       Dim S As Long = 0
       For Each X In Cont
           S += X
       Next

       MsgBox(FldCont.ToString & " - " & S.ToString)
   End Sub

   Sub TA(ByVal ParamArray Cont() As Integer)
       Dim S As Long = 0
       For Each X In Cont
           S += X
       Next

       MsgBox(S.ToString)
   End Sub

   Sub TA(ByVal FldCont As Boolean)
       MsgBox(FldCont.ToString)
   End Sub

لاحظ : أن للاجراء في الثلاث حالات نفس الاسم ولكن اختلفت نوعية وكمية البارامترات لكل واحد منها.
- وتستطيع مناداته بالكود التالي كمثال :
كود :
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       TA(1, 2, 3)
       TA(False, 1, 2, 3, 4)
       TA(True)
   End Sub

يعني نحن لما كتبنا البارام الاختياري مع البارام المصفوفي : ما كتبناه كـ أختياري بل كـ إجباري..  
ولكن تنوع الاجراءات - جعله يظهر كأحد الاختيارات (كـ إجراء كامل من مجموعة إختيارات وليس مدمج ووحيد)..

اختلفت المدخلات واختلفت المخرجات ..
بحسب ما يتم إدخاله سيعطيك نتيجة تناسبه وغير متداخلة مع غيرها ..


RE: ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - Mostchar - 15-09-24

(15-09-24, 04:34 PM)Taha Okla كتب : يا هلا :
- أولاًَ : يجب أن تراعي أن الــ(ParamArray) يجب أن يكون في آخر البارامترات لأي إجراء.
- ثانياً : يجب أن يكون عندك إختلاف بنوع البيانات بين البارام الأول و الـ (ParamArray)  إختلافاً جذرياً  :
        يعني مش تحط واحد int والثاني long    لأن في حال الارقام الصغيرة لن يميز المترجم بينهما ..
        بالتالي لن تحصل على نتيجة صحيحة وإن حصلت : فـ بـالصدفة لا أكثر.
- ثالثاً : لا يمكن الجمع بينهما فعلياً، ولكن فيك تكتب الاجراء الأساسي مرتين أو ثلاث مرات (مع اختلاف البارامترات).
وعندما تكتب البارام الاختياري مع البارام المصفوفي ، لا تكتبه كـ إختياري بـ كـ إجباري.  
فتكتب الاجراء : في كل مرة بـ بارامتر مختلف فيقوم المعالج بالتفريق بينهم من حيث نوع البيانات المدخلة.

- مثال عن إجراء فيك تستخدمه بأكثر من حالة :
كود :
   Sub TA(ByVal FldCont As Boolean, ByVal ParamArray Cont() As Integer)
       Dim S As Long = 0
       For Each X In Cont
           S += X
       Next

       MsgBox(FldCont.ToString & " - " & S.ToString)
   End Sub

   Sub TA(ByVal ParamArray Cont() As Integer)
       Dim S As Long = 0
       For Each X In Cont
           S += X
       Next

       MsgBox(S.ToString)
   End Sub

   Sub TA(ByVal FldCont As Boolean)
       MsgBox(FldCont.ToString)
   End Sub

لاحظ : أن للاجراء في الثلاث حالات نفس الاسم ولكن اختلفت نوعية وكمية البارامترات لكل واحد منها.
- وتستطيع مناداته بالكود التالي كمثال :
كود :
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       TA(1, 2, 3)
       TA(False, 1, 2, 3, 4)
       TA(True)
   End Sub

يعني نحن لما كتبنا البارام الاختياري مع البارام المصفوفي : ما كتبناه كـ أختياري بل كـ إجباري..  
ولكن تنوع الاجراءات - جعله يظهر كأحد الاختيارات (كـ إجراء كامل من مجموعة إختيارات وليس مدمج ووحيد)..

اختلفت المدخلات واختلفت المخرجات ..
بحسب ما يتم إدخاله سيعطيك نتيجة تناسبه وغير متداخلة مع غيرها ..

جاري التجربة والتصحيح أخي المحترم والكريم أخي طه -- ولكن قبل البحث والتجربة أود أن أشكرك على عناء الرد الكريم من حضرتك

واضح ان حضرتك اخي طه لم تفهم قصدي من السؤال , فانا لم اقصد الجمع بين البارميترين كعملية حسابيه كجمع و طرح وخلافة ,, لم اقصد هذا ولكن اقصد ان الباراميترين من نوع اساسي والثاني من نوع اختياري في براكتس واحد كما وضحت بمثال , واعيد كتابته في التالي:-

(ByVal ParamArray Cont() As System.Windows.Forms.Control, Optional ByVal FldCont As System.Windows.Forms.Control = Nothing)
وعلشان اكون واضح اكثر فانا بعرف مجموعة كونترول من على الفورم, وبعرف كونترول واحد اختياري , بس للاسف ببعطيني ايرور وخط أزرق اسفل تعريف الباراميتر الاختياري


RE: ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - Taha Okla - 15-09-24

واضح أنك لم تقرأ ما كتبت وسارعت للتجريب ..
أنا لم أذكر شيئاً عن العمليات الجمع والطرح في كلامي..
وما جاء في المثال من جمع جاء على سبيل المثال (تطبيقا على بارام المصفوفي كمثال سريع)..

بينما ما أقصده كان ضمن الشرح وليس ضمن المثال العملي...

لتفهم أكثر راجع أكثر في شروحات (OOP) ستستوعب ما كنت أقصده..


RE: ُError نتيجة الجمع بين الراميتر من نوع Array مع بارميتر من نوع Optional - Mostchar - 15-09-24

(15-09-24, 07:19 PM)Taha Okla كتب : واضح أنك لم تقرأ ما كتبت وسارعت للتجريب ..
أنا لم أذكر شيئاً عن العمليات الجمع والطرح في كلامي..
وما جاء في المثال من جمع جاء على سبيل المثال (تطبيقا على بارام المصفوفي كمثال سريع)..

بينما ما أقصده كان ضمن الشرح  وليس ضمن المثال العملي...

لتفهم أكثر راجع أكثر في شروحات (OOP) ستستوعب ما كنت أقصده..

 Object oriented programming  اوكيه .. التحية لك والتقدير