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

شكرا للأستاذ حارث تعليمي هذه المعلومات

مغلق
بدأه أبو هادي في 16 ديسمبر 2002 · 8 رد · 995 مشاهدة · في مراجعة المواضيع
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد تعلمت من حارث استخدام الباريمترز الإختياري باستخدام الـ optional argument عندما لفت انتباهي أحد أكواده من موضوع ملخص لتقويم أم القرى .

كذلك استخدام ByVal و ByRef وقد كنت أحتاجها كثيرا ولم أنتبه لوجودها حيث كنت استخدمها في الباسكال وهي Var وهي هنا تساوي الـ ByRef أما لو أهملت في الباسكال فهي تفترضها ByVal وهنا أحب أن أنوه أنها أكثر أمانا في الباسكال من البيسك حيث الإفتراضي في البيسك هي الـ ByRef .

آمل من الأخ حارث تفضلا وليس أمرا أن يقوم بشرح هذه الـ arguments لمن يريد التعرف عليه بشكل أكبر وأشمل وخصوصا أنا لا أجيد عملية الشح كالأستاذ حارث .

تحياتي

#2

أولا أشكرك أبو هادي على طرح هذا الموضوع وعلى تشجيعك

ثانيا : ربما كان من الأفضل والأيسر أن أقتبس مما جاء في كتاب برمجة أكسس 2002 يورك برس مع كثير من التصرف للتوضيح

سواء كنت تكتب روتين فرعي - Sub - أو وظيفة - Function - فغالبا ما تحتاج إلى تمرير وسائط لهما ، وهي تلك العوامل التي يتم إرسالها إلى الوظيفة أو الروتين الفرعي حتى يتم تقييمها أو تعديلها عن طريق سطور الشفرة في الوظيفة أو الروتين الفرعي ، أي أنها هي البيانات التي يتم نقلها بين أقواس مستديرة في الروتين الفرعي أوالوظيفة .

كما في العبارات التالية :

function MyTest(A as String,B as Integer) as boolean
sub DoTest(A as variant,B as Integer)

فهنا B , A هما عاملان أو وسيطان يتم تمريرهما للوظيفة MyTest أو الروتين الفرعي DoTest

إذا فهمنا المراد بالوسائط فإن Access VBA يمكنك من أن تضع قبل الوسائط المعرفات التالية :

ByVal

ByRef

Optional

وشرحها فيما يلي

أولا :

ByVal

يسبق معرف ByVal كل الوسائط التي لا نرغب في تغيير قيمتها خارج الروتين الفرعي أو الوظيفة ، بحيث حتى لو تم تغيير قيمة الوسيطة في سطور الروتين الفرعي أو الوظيفة فإنها ستعود كما كانت بعد انتهاء آخر سطر منه .

لماذا نستخدم ByVal : نستخدمها عندما نرغب في التأكد من أن الوسائط لن يمكن تغييرها بشكل دائم ، فقد نرغب في تغيير وسائط ByVal داخل الروتين الغرعي أو الوظيفة ، ولكن نريد أن تكون هذه التغييرات مؤقته ، بمعنى أننا لا نرغب في الاحتفاظ بهذه التغييرات بعد انتهائه .

ولتوضيح ذلك طبق المثال التالي:

Sub TestByVal(ByVal A as integer)
A=5
Msgbox A
' الرسالة هنا هي 5
end sub

Sub Test0
dim A as integer
A= 10 
call TestByVal(A)
Msgbox A
' الرسالة هنا هي 10  وهي قيمة  الوسيطة قبل استدعاء الروتين الفرعي
' TeatByVal
End Sub

ثانيا

ByRef

يسبق معرف ByRef كل الوسائط التي نرغب في تغيير قيمتها بواسطة الروتين الفرعي أو الوظيفة .

لماذا نستخدم ByRef : نستخدمها عندما نرغب في التنبيه إلى أن الوسيطة سوف يتم تغييرها.

ومن هنا فإن نفس المثال السابق لو جعلت بدلا من

Sub TestByVal(ByVal A as integer)

السطر التالي

Sub TestByRef(ByRef A as integer)

فسوف تجد أن الرسالتين كلاهما 5

ثالثا :

Optional

يوفر معرف Optional بعض المرونة في الروتين الفرعي أو الوظيفة ، ذلك أن وسيطة Optional هي وسيطة لها قيمة افتراضية ، ومن ثم لا يجب على مستخدم الروتين الفرعي أو الوظيفة تمرير قيمتها إلا إذا كان يرغب في تغيير القيمة الافتراضية

وينبغي التنبيه إلى أنه عند استحدام معرفات Optional فإنه يجب أن تكون هذه المعرفات في آخر وسائط الروتين الفرعي أو الوظيفة .

مثال عملي لمعرف Optional :

لنفرض أنك تريد أن تعمل وظيفة تضيف ضريبة المبيعات إلى القيمة الإجمالية، وكانت أغلب مبيعاتك في ولاية رقم 9 ، والضرائب في هذه الولاية هي 5 % ، لكن أحيانا تكون المبيعات في خارج هذه الولاية ، وتكون الضريبة مختلفة ، لذا تكون الوظيفة بالشكل التالي

Function CalculateTotalSale(ByVal InSaleAmount as Double , Optional TaxPercent as Double = .05) As Double
CalculateTotalSale = InSaleAmount * (1 + TaxPercent)
End Function

لذا فإنك أذا أردت حساب القيمة الإجمالية مضافا إليها ضريبة المبيعات ، لا تحتاج إلى تمرير قيمة الضريبة كل مرة ، وإنما تحتاجها فقط إذا كانت المبيعات خارج الولاية

أي أنه إذا كانت المبيعات داخل الولاية يكفي أن تستدعي الوظيفة بالشكل التالي

Sub Test1
Dim SaleAmount  As Double , TotalSale As Double 
 SaleAmount  = 100
TotalSale = CalculateTotalSale(SaleAmount )
MsgBox TotalSale  
End sub

أما إذا كانت المبيعات خارج هذه الولاية في ولاية ضريبة مبيعاتها هي 8% فإن الوظيفة تستدعى بالشكل التالي

Sub Test2
Dim SaleAmount  As Double , TotalSale As Double , Dim AnotherTax as Double 
 SaleAmount  = 100
AnotherTax  = .08
TotalSale  = CalculateTotalSale(SaleAmount , AnotherTax )
MsgBox TotalSale 
End sub

هذا ما استطعت توضيحه حول هذا الموضوع وبرفقه مثال للتوضيح أكثر

http://mypage.ayna.com/harith77/ByValByRef.zip

#3

رائع رائع أستاذ حارث هكذا يكون البحر الزاخر وهكذا يتدفق النهر الجاري

ما أحوجنا في المنتدى إلى مثل هذا الطرح المتميز العميق

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

أخي حارث سر في هذا الدرب ودعنا نكفك الأشياء الأخرى

#4

ما شاء الله عليك يا أخ حارث 0

بعد كل فترة تظهر لنا بشيء جديد0

وأشكر الأخ ابو هادي الذي أثار هذا الموضوع0

والله انني أحاول بكل طاقتي أن استفيد من هذا العطاء والتميز والمباريات تحلوا عندما يشترك فيها النجوم 0

اسأل الله لك التوفيق في الدارين0

#5

أمر لا بد أن أقوله لأستاذنا أبو هادي

دوما تحرص على الإفادة والفائدة وتحرص على ما يثري هذا المنتدى وأعضاءه وتعطي أكثر بكثير مما تأخذ

ورغم أن مثل هذه الفائدة ليست بالكبيرة ، إلا أنك تشير إليها وترفع معنوياتنا وتشجعنا (مع تحفظي على قولك أنا لا أجيد عملية الشرح كحارث فمشاركاتك وعطائك ينفي هذا)

فجزاك الله خيرا ، وألهمنا دعوة لك بظهر الغيب مستجابة .

#6

هكذا يكون الاحتراف ... وهكذا يتجلى الابداع والروعة

كل الشكر للاستاذين العزيزين

أبو هادي لطرحه هذا الموضوع

وحارث الذي أبدع في الشرح والعطاء

#7

السلام عليكم

الله يوفقكم

" وما توفيقى إلا بالله عليه توكلت وإليه أنيب "
-------------------------------------------------
قل : " لا حول ولا قوة إلا بالله "
-------------------------------------------------

#8

للرفع

ليستفيد منه كل من قرأه وادعوا الله أن يرد لنا الأستاذ حارث وأمثاله ممن فقدهم هذا المنتدى

#9

أخي فهد

أنت:'( نفسك نفتقدك كثيراً :'(:'(

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

بحراً من الكرم والعطاء

أخوك رضا عقيل(f)(f)

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

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