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

أسئلة بخصوص Sub

بدأه Xeon_1001 في 9 أبريل 2008 · 6 رد · 1,071 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني اريد ان أعرف :

1- الفرق بين Sub وبين Function ؟

2- والفرق بين :

Public Sub mysub(ByVal Variable)

وبين

Public Sub mysub(ByRef Variable)
#2

الفرق بسيط , هو أن Sub ينفذ أمرا دون أن يعيد قيمة ,

مثلا الأمر التالي يقوم بجمع الرقمين الممرين له , وعرضهما في رسالة

Public Sub Add(ByVal a As Integer, ByVal b As Integer)
	MsgBox a + b, vbInformation, "Add Sub"
End Sub

Private Sub Command1_Click()
	Call Add(5, 6)
End Sub

في البداية عرفنا المتغيرات التي ستمرر إلى الإجراء وهي A و B وكلاهما من النوع Integer

ثم وضعنا أمر إظهار ناتج الجمع في رسالة

في حدث Command1_Click نقوم باستدعاء الإجراء ونمرر له القيم الخاصة به

ملحوظة :

أحيانا تجد إجراءات مثل Command1_Click لا تحتاج إلى بارامترات فقط ينادى الغجراء من خلال الامر Call ويتم تنفيذ ما به من أوامر

ولكن في حدث Command1_Click إن كنت تتعامل مع مصفوفة من الازرار جميعها باسم Command1 فسيعدل Visual Basic الإجراء Command1_Click ليصبح

Command1_Click(Index as integer)

,ونتيجة الأمر السابق :

789380-408.jpg

اما الدالة :

Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
	Add = a + b
End Function

Private Sub Command1_Click()
Dim X As Integer
	X = Add(5, 6)

		MsgBox X, vbInformation, "Add Function"
End Sub

طبعا لاحظ بعد تعريف البارامترات وضعنا بعد الاقواس كلمة As Integer وهي نوع القيمة التي ستعيدها الدالة ككل

ثم وضعنا ناتج جمع A و B داخل دالة Add نفسها

وفي إجراء Command1_Click عرفنا متغير من نفس نوع القيمة التي تعيدها الدالة وهي هنا Integer

ثم وضعنا قيمة الدالة فيه

وبعد ذلك أظهرناه من خلال MsgBox

وإليك النتيجة

789380-409.jpg

أرجو أن أكون قد أوضحت الشرح

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#3

الأخ الكريم ، تحية طيبة وبعد ،

موضوع الـ Sub و الـ Function قد شرحة لك الأخ الكريم Ala2 VB ، أما بخصوص ByVal و ByRef فإليك الشرح ( ولو أن هناك شروحات كثيرة بالمنتدي تفيد بذلك )

الـ ByVal تمرر قيمة بإجراء أو غرض دون القدرة علي إرتجاع قيمة جديدة من خلال الباراميتر نفسة ، انظر المثال التالي :

 

Public Function Calc(ByVal N1 As Single, ByVal N2 As Single) As Single
	Calc = N1 + N2
End Function

Private Sub Command1_Click()
	Dim N1 As Single, N2 As Single
	N1 = 5
	N2 = 15
	MsgBox Calc(N1, N2)
End Sub

حيث تم إنشاء Function خفيف الهدف منه إرتجاع مجموع عددين ( كما شرح لك الأخ الكريم Ala2 VB ) ، ولكن ماذا لو كنا نرغب في تغيير قيم الباراميترات من داخل الـ Function وإرتجاعها بمتغير من خارج الـ Function ، أنظر المثال التالي :

 

Public Function Calc(ByRef N1 As Single, ByRef N2 As Single) As Single
	Calc = N1 + N2
	N1 = N1 ^ 2
	N2 = N2 ^ 2
End Function

Private Sub Command1_Click()
	Dim N1 As Single, N2 As Single
	N1 = 5
	N2 = 15
	MsgBox Calc(N1, N2)
	MsgBox N1
	MsgBox N2
End Sub

لاحظ أخي في الكود ، تم إرسال قيمة رقمية للمتغيرين كما يلي :

N1 = 5

N2 = 15

وبعد ذلك قمت بضرب كل متغير في نفسة مرتين بإستخدام الأس من داخل الـ Function ، وبعد ذلك في حدث Click لزر الأمر قمت بعرض ناتج التغير لقيم الباراميترات المدخلة !!!

حاول تغير الإجراء من ByRef الي ByVal ستلاحظ أنه سيقوم بإرتجاع المتغيرين N1 و N2 بالقيمة القديمة ، وليست قيمة المضروب ( الأس )

شكراً

لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي

ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك

أنت وتصرفاتك

ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه

اشد آلام ... فصمتي أنا عنوان

عصر التكنولوجيا المعلوماتية(مدونتي الخاصة)

My FaceBook

#4

اخواني جزاكم الله خيراً على الشرح ....... :D عندي بعض الاستفسارات وارجو ان لا أكون اثقلت عليكم :S

اقتباس
هو أن Sub ينفذ أمرا دون أن يعيد قيمة

Public Sub Add(ByVal a As Integer, ByVal b As Integer)
	MsgBox a + b, vbInformation, "Add Sub"
End Sub

Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer
	Add = a + b
End Function

أخي انا مش فاهم هذه النقطه الاثنين بينفذوا عملية الجمع ويرجعوا قيمة ناتجة عن عمليه الجمع ...فكيف هنالك اختلاف بينهم ؟

أما بالنسبة لByval و ByRef اللي انا فهمتة ان الفرق بينهم هو Byval تستخدم عندما نريد إستخدام المتغيرات بقيمتها الحقيقية أما ByRef تستخدم عندما نريد إستخدام المتغيرات مع تغيير قيمتها ....فهل اللي انا فهمته صحيح ؟

#5
Public Sub Add(ByVal a As Integer, ByVal b As Integer)

Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer

هل أنت متاكد أنه لا يوجد فرق ؟

لاحظ أن هناك إضافة بعد أقواس الدالة وهي As Integer

صح ؟

طيب , جرب :

Private Sub Add(A, B As Integer)
		Add = A + B
End Sub

Private Sub Command1_Click()
	MsgBox Add(1, 2)
End Sub

هيظهر لك خطأ , وحتى لو كتبت Call بدل Msgbox سيظهرلك خطأ

لأنه احنا كتبنا Add = A + B

ثم طلبنا عرض قيمة الإجراء , والإجراء كما ذكرت ,,, لا يعود بقيمة فأظهر الرسالة

حسنا جرب :

Private Function Add(A, B As Integer) As Integer
		Add = A + B
End Function

Private Sub Command1_Click()
	MsgBox Add(1, 2)
End Sub

الناتج سيكون 3 , لأن احنا كتبنا Add = A + B

واستدعينا الدالة في إجراء Command1_Click

والدالة تعود بقيمة , إذا فهذا صحيح

وهكذا , أثبت نظريتي في أن " الإجراء لا يعود بقيمة , والدالة تعود بقيمة" حسب الشرح أعلاه

طيب , سؤاااااااااااااااال ؟؟؟

كيف أجعل الإجراء يعود بقيمة ؟؟؟

لا يمكنك !!!

ولكن يمكن وضع متغير توضع فيه قيمة الإجراء , مثلا :

Private Sub Add(A, B As Integer)
Dim c As Integer
		c = A + B

		MsgBox c
End Sub

Private Sub Command1_Click()
	Call Add(1, 2)
End Sub

ولا تنس , عند استدعاء إجراء نستعمل Call

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

بالنسبة للـByVal , ByRef

فقد شرحها أخي العزيز MMG

اقتباس
أما بالنسبة لByval و ByRef اللي انا فهمتة ان الفرق بينهم هو Byval تستخدم عندما نريد إستخدام المتغيرات بقيمتها الحقيقية أما ByRef تستخدم عندما نريد إستخدام المتغيرات مع تغيير قيمتها ....فهل اللي انا فهمته صحيح ؟

صحيح

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#6

:ty:

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