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

ByRef .......ByVal

مغلق
بدأه mohamed_k78 في 12 مارس 2005 · 5 رد · 1,252 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

الى الأخوة والأخوات في الله

أرجو الإجابة على سؤال حيرني كثيرااا وحاولت الإطلاع علية لكني فعلا لم أفهم.....حاولت ولكني لم أنجح.....الســـــــــــــــؤال

سؤالي عن أرسال القيم بطريق ByRef .......ByVal .... عند أطلاعي على هذا الموضوع كل ما فهمتة هو طريقة تخزين القيم في الذاكرة بالنسبة لل ByRef تخزن في منطقة أسمها ى manged Heap وكل متغير يشير لقيمها يسمى مؤشر لنفس القيمة أما بالنسبة لل ByVa فكل متغير يشير لنفس القيمة يستقل في الذاكرة بهذة القيمة الجديدة ....هذا كل ما فهمتة .....عند أستخدمها في الفيجوال دوت نت واجهتني المشاكل التالية....

1-عند كتابتها وجدت أن البرنامج يضع تحتها خط أى تحت الجملة كلها وكانت الطريقة x(ByRef | ByVal Y as date)

2-عدم فهمي ماذا تفعل أذا أستخدمت الطريقتين وفيما يحتم على أستخدامها ...أعتقد لو فهمتها سوف أقرر في أى موضع يمكن أستخدام أي من الطريقتين......ولماذا أكرر نوع البيانات من جديد ...مثل

X (ByRef | ByVal Y AS Date )as Date

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

السلام عليكم ورحمة الله

#2

وعليكم السلام ورحمة الله وبركاته

بالنسبه لسؤالك الأول ,, فما أدري أنت كاتب الكود صح وعلى قواعد اللغة أو في إختلاف

المهم هذي طريقة كتابة الدوال أو الإجرائات مع المعاملات:

Function FunctionName(ByVal ArgumentName as String)
Msgbox(ArgumentName) 'مثاال 
End Function

FunctionName = اسم الداله ( تستطيع كتابة أي اسم يحلو لك)

ArgumentName = اسم المعامل ( تستطيع كتابة أي اسم يحلو لك)

as String = نوع البيانات التي سوف يحفظها المعامل ( وهي هنا نص)

وتستطيع كتابة أكثر من معامل هكذا

Function Exemple(ByVal a as Integer,ByVal b as Integer)
'هنا الكووود
End Function

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

-----------------------------------

أما السؤال الثاني فسأذكر لك بعض الشيء

1 - استخدام الـ ByRef بدل الـ ByVal إذا أضطريت أن توفر على الذاكرة وتسرع من أداء برمنامجك)

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

وفي بعض الأحيان لا تستطيع استخدام الـ ByVal نهائيا وذلك إذا صار المعامل من نوع ( ما أدري وش أسميها ) لكن مثال نوع Form , لأنه سيأخذ مساحه أكبر على الذاكرة.

2 - ممكن تستخدم الـByRef إذا أردت إعادة قيمة أو عده قيم من الدالة إلى الإجراء أو الدالة المُستدعي لها.

إذا تبي مثال على ما سبق فأنا حاضر

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

3 - في الغالب سوف تستخدم طريقه التمرير ByVal إذا كان المعامل يحمل قيمه صغيره مثلا ( رقم , نص بسيط , تاريخ )

وهي الخيار الإفتراضي للغة ( يعني لو ماتكتب طريقة التمرير حيكون ByVal افتراضيا )

وآسف على الإطااااله لكن تحملني ما اعرف اشرح بإختصار :rolleyes:

تحياتي محسن,,

تم تعديل هذه المشاركة بواسطة Mohsen-F في 13 مارس 2005 في 20:00

#3

شكرا لك أخى Mohsen-F وياريت المثال ....ولا تأسف على الإطالة فهذا ما أردت أخي لأن التفصيل يفيد كثيرا ويساعد على الفهم....شكرا لك أخي ومتظر المثال

#4

حسننا أخوي سأذكر المثال ,, وقد يكون غبيا .. لكن أهم شي تتضح الفكرة

لنفترض أنك تريد دالة تقوم بإستقبال عددين ثم ترجع لك قيمتين: الأولى ناتج جمع العددين والثانيه ناتج ضرب العددين

هذا هو كود الدالة

    Function Exemple(ByVal N1 As Integer, ByVal N2 As Integer, ByRef X As Integer) As Integer
        X = N1 * N2
        Return N1 + N2
    End Function

تقوم الدالة بأستقبال ثلاث قيم .. القيمة الأولى N1 للعدد الأول

والقيمة الثانية N2 للعدد الثاني

ثم نقوم بضرب العددين ووضع حاصل الضرب في المعامل X

وفي آخر الدالة نقوم بإعادة قيمة حاصل جمع العددين ( بطريقه Return )

وللمثال استخدم هذا الإجراء لإستدعاء الدالة السابقة:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'كود لحدث النقر لزر اسمه Button1
        Dim A, B, C As Integer
        A = InputBox("أدخل العدد الأول")
        B = InputBox("أدخل العدد الثاني")
        MsgBox("حاصل الجمع هو  " & Exemple(A, B, C))
        MsgBox("حاصل الضرب هو   " & C)
    End Sub

أولا عرفنا ثلاث متغيرات:

الأول A وسوف يحمل العدد الأول الذي سوف يدخله المستخدم بواسطه الـ InputBox

الثاني B وسوف يحمل العدد الثاني الذي سوف يدخله المستخدم بواسطه الـ InputBox

الثالث C وسوف يحتفظ بقيمه حاصل ضرب العددين ( طبعا ذلك بتأثير الدالة )

الآن سوف نقوم بإستدعاء الدالة بواسطه MsgBox مع تمرير المتغيرات السابقة للدالة.

بالطبع سوف تعرض لنا الرسالة حاصل جمع العددين ( المتغيرين A و B ) وهي القيمة المعادة من الدالة

تذكر هذا الكود:

Return N1 + N2

والآن قد حصلنا على قيمة ثانية مٌعادة من الدالة وهي حاصل ضرب العددين ,,

وذلك كالتالي:

1 - في الدالة عرفنا المعامل X على طريقه الـ ByRef

2 - عند استعداء الدالة وضعنا المتغير C مكان المعامل X

3 - لتقوم الدالة بوضع قيمة حاصل ضرب العددين في المعامل X الذي بنفسه سوف يؤثر على المتغير C

ثم نقوم بعرض المتغير C والذي بنفسه يحمل حاصل الضرب ... وذلك بواسطه الـ MsgBox

       MsgBox("حاصل الضرب هو   " & C)

وفي النهاية نكون قد استقبلنا قيمتين من الدالة.. الأولى حاصل الجمع ( بالطريقه الأصلية Return )

والثانية حاصل الضرب .. ( وذلك اعتمادا على طريقة التمرير ByRef )

وشكرااااااا

تم تعديل هذه المشاركة بواسطة Mohsen-F في 15 مارس 2005 في 18:48

#5

شكرا لك أخى Mohsen-F على هذا المثال الجامع المانع ...وأسف على التأخر وذلك لآسباب قهرية لم أتمكن من الدخول وأشكرك للمرة الثانية على أهتمامك....أخي محسن لي سؤال أخير هل تظل قيمة المتغير المعرف ب ByRef حتى لو غيرتة بينما أستطيع تغير قيمة المتغير المعرف ب ByVal دون التأثير على البرنامج....معذرة الموضوع فعلا معقد بالنسبة لي جدااااا

#6

أخي المعذره لم أفهم ما تقصده

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

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