فراخواني توابع و روتين ها در ويژوال بيسيک

uu99

Member
انتقال داده ها در ویژوال بیسیک

در ادامه روند آموزش ویژوال بیسیک رسیدم به درس "انتقال داده ها"

یه روال بصورت زیر نوشتیم :

Private Sub EmployeeDisplay(strFirst As String, strLast As String)
Dim strEmp As String
strEmp = "my First Name is: " & strFirst & "And My Last Name is:" & _
strLast
EmployeeDisplay = strEmp
End Sub
حالا میخواهیم انتقال داده انجام بدیم :

Private Sub Command1_Click()
Call EmployeeDisplay("Bill", "Gates")
End Sub
روال EmployeeDisplay که نوشته شده چه کاری انجام میده و چه چیزهایی رو میشه ازش انتقال داد؟

با احضار روال EmployeeDisplay چه اتفاقی میفته ؟

دو رشته "Bill" و "Gates" که به عنوان آرگومان بعد از احضار روال وارد شدند ، کجا ذخیره میشن ؟

روند "انتقال داده" در این ماجرا به چه صورتی انجام میشه ، من متوجه نمیشم .



با تشکر فراوان
20ge1pi.gif

 

the_king

مدیرکل انجمن
اول ببینیم این بابا چیکار می کنه :
کد:
Private Sub EmployeeDisplay(strFirst As String, strLast As String)
Dim strEmp As String
strEmp = "my First Name is: " & strFirst & "And My Last Name is:" & _
strLast
EmployeeDisplay = strEmp
End Sub
ما دو پارامتر ورودی داریم ولی روتین خروجی نداره چون با Sub تعریف شده و نه Function. پس تابع نیست
و متغیری به نام EmployeeDisplay هم نداریم که بخواهیم چیزی داخل قرار بدیم.
به همین دلیل این سطر در تابع اشتباه است :
کد:
EmployeeDisplay = strEmp

حالا فعلا به این اشتباه گیر نمی دیم، ببینیم در بقیه اش چه اتفاقی می افته.
در متغیر strEmp دو پارامتر ورودی با هم ترکیب می شوند به طوری که اگه اسم آقای بیل گیتز را بهش بدیم
تبدیل میشه به :
کد:
my First Name is: BillAnd My Last Name is:Gates
الان اشکال دوم که یک اشکال تکنیکی است معلوم شد، بین اسم کوچیک و عبارت And فاصله ای در نظر نگرفته ایم
و شده BillAnd. پس بهتره توی عبارتی که با And شروع میشه یک کاراکتر فاصله اضافه کنیم. یکی هم بین دونقطه و
Gates.

بعد چی میشه؟ متغیر ترکیب شده strEmp رو می ریزه توی خروجی تابع (که البته باید اصلاح بشه چون الان تابع نیست)

اما ما برای اصلاح کردن این روتین اونو به تابع تبدیل می کنیم، یعنی اولا که Sub باید تبدیل بشه به Function.
ثانیا که چون ما دو رشته را با هم ترکیب می کنیم، خروجی باید از نوع String باشه.
ثالثا متغیر strEmp یک متغیر واسطه است و میشه حذفش کرد، چون کمک خاصی نمیکنه و می تونیم انتقال به خروجی
را یکسره و مستقیم کنیم :

کد:
Private Function EmployeeDisplay(strFirst As String, strLast As String) As String
    EmployeeDisplay = "my First Name is: " & strFirst & " And My Last Name is: " & strLast
End Function

خب حالا ببینیم این فراخوانی تابع در دکمه Command1 چیکار می کنه :
کد:
Private Sub Command1_Click()
Call EmployeeDisplay("Bill", "Gates")
End Sub

از نظر دستوری کاملا درسته و دو پارامتر ورودی Bill و Gates را ارسال می کنه و ترکیب شده اش را تحویل می گیره،
ولی خروجی تحویل گرفته شده را چیکار می کنه؟ هیچی می ریزه دور چون از خروجی تابع استفاده ای نشده.
پس اگه اجرا بشه، نه چیزی نمایش داده می شه و نه چیزی تغییر می کنه.
حالا چطور اصلاحش کنیم؟
راه های مختلفی وجود داره، مثلا با یک پنجره MessageBox خروجی تابع رو نشون بدیم :

کد:
Private Sub Command1_Click()
    MsgBox EmployeeDisplay("a", "b")
End Sub

یا اینکه قرارش بدیم داخل یک لیبل مثلا Label1 :
کد:
Private Sub Command1_Click()
    Label1.Caption = EmployeeDisplay("a", "b")
End Sub
 

uu99

Member
جناب علی سعید ممنونم بابت توضیحات کامل و جامع شما .
7xcuu83.gif



با توجه به اینکه فرق تابع و روتین در این هست که تابع همیشه مقداری رو برمیگردونه ولی روتین مقداری برنمیگردونه ، آیا استفاده از روتین برای "انتقال داده ها"کار منطقی هست یا نه ؟

استفاده از "انتقال داده" چه مزیتی داره ؟

مثال :


Public Sub ProcByref(ByRef intArg1 As Integer, ByRef strArg2 As String)
intArg1 = 20
strArg2 = "Gates"
End Sub​
Private Sub Command1_Click()
Dim intRet As Integer
Dim strRet As String
intRet = 10
strRet = "Bill"
Call ProcByref(intRet, strRet)
Me.Print intRet
Me.Print strRet
End Sub


مثال بالا بدون هیچ خطایی کار میکنه ولی من نمیدونم در چه مواردی بهتره از "انتقال داده" استفاده کنم!:neutral:







با تشکر فراوان
20ge1pi.gif

 

the_king

مدیرکل انجمن
یک موقعی تابع بیشتر از یک خروجی داره، مثلا جواب معادله درجه دوم ممکنه دو جواب باشه، پس واسه این روتین
بهتره از پارامتر ارجاعی استفاده کنیم یعنی Byref.

اما اگه فقط یک خروجی داریم بهتره که از Function استفاده بشه که کد واضح تری داره و استفاده از تابع هم انعطافش
بیشتر میشه.

اما یک حالت دیگر هم هست که ارجاع با آدرس ByRef کاربرد داره، زمانی که پارامتر ورودی بزرگتر از یک واحده
مثلا String که ممکنه طولانی باشه، اما اگه به عنوان مثال یک پارامتر ورودی Integer یا Double قرار نیست که
تغییری بکنه، بهتره با ByVal باشه که هم امنیت داده اصلی بیشتر باشه و هم سرعت اجرا بالاتر باشه.
برعکس در داده هایی که حجیم هستند، مثلا String ها بهتره که با Byref ارسال بشوند حتی اگه قرار نیست تغییر کنند.
 

uu99

Member
سلام

این Syntax Error اشک منو درآورده
4py3f5t.gif


هر کاری میکنم دستور زیر اجرا نمیشه فقط ارور میده
97.gif


Private Sub Command1_Click()
MsgBox ("You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error")
End Sub
 

the_king

مدیرکل انجمن
در مورد کاربرد پارانتر دقت کنید، وقتی شما یک تابعی مثل MsgBox را بدون استفاده از مقدار بازگشتی آن استفاده می کنید
باید به شکل یک روتین Sub فراخوانی بشه یعنی با فرمان Call و یا بدون استفاده از پارانتر :

کد:
MsgBox "You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error"

Call MsgBox("You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error")

پارانتر هایی که شما در دور پارامتر ها گذاشته اید، اونها را به یک پارامتر تبدیل کرده که خطا محسوب می شه.
 

جدیدترین ارسال ها

بالا