واضح آرشیو وب فارسی:سایت ریسک: فراخواني توابع و روتين ها در ويژوال بيسيک uu99 28 بهمن 1386, 02:27در ادامه روند آموزش ویژوال بیسیک رسیدم به درس "انتقال داده ها" یه روال بصورت زیر نوشتیم : 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 Command 1_Click() Call EmployeeDisplay("Bill", "Gates") End Subروال EmployeeDisplay که نوشته شده چه کاری انجام میده و چه چیزهایی رو میشه ازش انتقال داد؟ با احضار روال EmployeeDisplay چه اتفاقی میفته ؟ دو رشته "Bill" و "Gates" که به عنوان آرگومان بعد از احضار روال وارد شدند ، کجا ذخیره میشن ؟ روند "انتقال داده" در این ماجرا به چه صورتی انجام میشه ، من متوجه نمیشم . با تشکر فراوان the_king 28 بهمن 1386, 04:08اول ببینیم این بابا چیکار می کنه : 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 خب حالا ببینیم این فراخوانی تابع در دکمه Command 1 چیکار می کنه : Private Sub Command 1_Click() Call EmployeeDisplay("Bill", "Gates") End Sub از نظر دستوری کاملا درسته و دو پارامتر ورودی Bill و Gates را ارسال می کنه و ترکیب شده اش را تحویل می گیره، ولی خروجی تحویل گرفته شده را چیکار می کنه؟ هیچی می ریزه دور چون از خروجی تابع استفاده ای نشده. پس اگه اجرا بشه، نه چیزی نمایش داده می شه و نه چیزی تغییر می کنه. حالا چطور اصلاحش کنیم؟ راه های مختلفی وجود داره، مثلا با یک پنجره MessageBox خروجی تابع رو نشون بدیم : Private Sub Command 1_Click() MsgBox EmployeeDisplay("a", "b") End Sub یا اینکه قرارش بدیم داخل یک لیبل مثلا Label1 : Private Sub Command 1_Click() Label1.Caption = EmployeeDisplay("a", "b") End Sub uu99 28 بهمن 1386, 20:59جناب علی سعید ممنونم بابت توضیحات کامل و جامع شما . با توجه به اینکه فرق تابع و روتین در این هست که تابع همیشه مقداری رو برمیگردونه ولی روتین مقداری برنمیگردونه ، آیا استفاده از روتین برای "انتقال داده ها"کار منطقی هست یا نه ؟ استفاده از "انتقال داده" چه مزیتی داره ؟ مثال : Public Sub ProcByref(ByRef intArg1 As Integer, ByRef strArg2 As String) intArg1 = 20 strArg2 = "Gates" End Sub Private Sub Command 1_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: با تشکر فراوان the_king 28 بهمن 1386, 23:37یک موقعی تابع بیشتر از یک خروجی داره، مثلا جواب معادله درجه دوم ممکنه دو جواب باشه، پس واسه این روتین بهتره از پارامتر ارجاعی استفاده کنیم یعنی Byref. اما اگه فقط یک خروجی داریم بهتره که از Function استفاده بشه که کد واضح تری داره و استفاده از تابع هم انعطافش بیشتر میشه. اما یک حالت دیگر هم هست که ارجاع با آدرس ByRef کاربرد داره، زمانی که پارامتر ورودی بزرگتر از یک واحده مثلا String که ممکنه طولانی باشه، اما اگه به عنوان مثال یک پارامتر ورودی Integer یا Double قرار نیست که تغییری بکنه، بهتره با ByVal باشه که هم امنیت داده اصلی بیشتر باشه و هم سرعت اجرا بالاتر باشه. برعکس در داده هایی که حجیم هستند، مثلا String ها بهتره که با Byref ارسال بشوند حتی اگه قرار نیست تغییر کنند. uu99 29 بهمن 1386, 00:29سلام این Syntax Error اشک منو درآورده هر کاری میکنم دستور زیر اجرا نمیشه فقط ارور میده Private Sub Command 1_Click() MsgBox ("You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error") End Sub the_king 29 بهمن 1386, 02:21در مورد کاربرد پارانتر دقت کنید، وقتی شما یک تابعی مثل MsgBox را بدون استفاده از مقدار بازگشتی آن استفاده می کنید باید به شکل یک روتین Sub فراخوانی بشه یعنی با فرمان Call و یا بدون استفاده از پارانتر : MsgBox "You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error" Call MsgBox("You Must Enter a Valid Number", vbOKCancel + vbCritical, "Error") پارانتر هایی که شما در دور پارامتر ها گذاشته اید، اونها را به یک پارامتر تبدیل کرده که خطا محسوب می شه.
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 2275]