اخواني اريد ان أعرف :
1- الفرق بين Sub وبين Function ؟
2- والفرق بين :
Public Sub mysub(ByVal Variable)
وبين
Public Sub mysub(ByRef Variable)
اخواني اريد ان أعرف :
1- الفرق بين Sub وبين Function ؟
2- والفرق بين :
Public Sub mysub(ByVal Variable)
وبين
Public Sub mysub(ByRef Variable)
الفرق بسيط , هو أن 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)
,ونتيجة الأمر السابق :

اما الدالة :
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
وإليك النتيجة

أرجو أن أكون قد أوضحت الشرح
اقتباس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
الأخ الكريم ، تحية طيبة وبعد ،
موضوع الـ 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 بالقيمة القديمة ، وليست قيمة المضروب ( الأس )
شكراً
لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي
ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك
أنت وتصرفاتك
ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه
اشد آلام ... فصمتي أنا عنوان
اخواني جزاكم الله خيراً على الشرح ....... :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 تستخدم عندما نريد إستخدام المتغيرات مع تغيير قيمتها ....فهل اللي انا فهمته صحيح ؟
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
:ty:
العفو , أي خدمة يا باشا :lol:
اقتباس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