تعریف رویه های فرعی و تابعی - sub و function در ویژوال بیسیک

kemiaonline

Banned
تعریف رویه های فرعی و تابعی

سلام
بازم منم :) و اومدم مثل همیشه سوال بپرسم
خواهش میکنم که رویه های تابعی و فرعی روتضیح بدید
فقط جون هرکی که دوست دارید مثل کتاب ها حرف نزنید
اگه اونجوری حالیم میشد دیگه به شما زحمت نمیدادم
اونهایی که تو ویبی حرفه ای هستن که خیلی خوب حرف هاتونو میفهمن
یه جوری توضیح بدید که ادم های ناشی مثل من بفهمن چی میگین
ممنون خدانگهدار
 

saalek110

Well-Known Member
رویه های تابعی و فرعی چیه؟
در هر کتابی مترجم لغتی را به کار میبره.
من function و sub را می شناسم.
از منوی Tools گزینه Add Procedure را که بزنید می توانید ساب و فانکشن بسازید. البته دستی هم میشه نوشت کدهایش را.

حالا منظور شما همین دو تاست؟
 

kemiaonline

Banned
اره دقیقا"
من کتاب یه مولف دیونه رو خریدم حاظرم قسم بخورم به جون عزیزترین کسم که خودشم نفهمیده چی نوشته
ولی اره همون function وsub هست
ببینم ببینم من sub , function که بسازم به چه دردیم میخوره
اصلا" چیکار با اینها میکنن

خواهش میکنم بیشتر توضیح بده اصلا" نمیفهمم چی به چیه
 

farhad110

Member
سلام. استفاده از توابع و رويه هاي مختلف يكي از اصول مهندسي نرم افزار (به لحن ما: خوب برنامه نويسي) هست. در اين موارد شما به جاي استفاده از چند صد خط كدنويسي، مساله رو به مسائل كوچكتر تقسيم ميكنيد و هر كدوم رو با يك زير برنامه (تابع و روال) مي نويسيد. اجراي تمام توابع = حل مسائل كوچك = حل مساله بزرگ
مثلا شما ميتونيد در يك رويداد (كليك يك دكمه فرمان) دو عدد رو از ورودي بگيريد و جمع كنيد و حاصل رو نمايش بديد. اما روش اصولي اين هست كه:
- با استفاده از رويه اعداد رو از ورودي بگيريد
- اعداد رو به عنوان پارامترهاي تابع براي جمع شدن بفرستيد
- نتيجه اي رو كه تابع بر مي گردونه چاپ كنيد
مزيت:
استفاده از توابع در رويداد هاي مختلف (عدم تكرار كد نويسي)
استفاده از توابع پر كاربرد (مثلا تاريخ شمسي) در برنامه هاي آينده

فرق تابع و رويه:
رويه مقداري را به رويدادي كه آن را اجرا كرده باز نمي گرداند و فقط روي داده ها اعمالي انجام مي دهد
تابع هميشه مقداري را به عنوان نتيجه باز مي گرداند
 

saalek110

Well-Known Member
منم تکرار می کنم فرمایشان آقا فرهاد را:

نوشتن تابع یا ساب خوبیش اینه که ده خط کد را به عنوان تابع یا ساب تعریف می کنید و ده جا اون تابع را صدا می زنید. در تعداد خطوط برنامه صرفه جویی میشه. برنامه خواناتر میشه و دیگر فوائدی که شاید داشته باشه و الان به ذهنم نمی رسه.

فرق تابع و ساب هم همونه که آقا فرهاد گفت. یکی خروجی برنمی گردونه و یکی بر می گردونه.
تابع را مثل یک کارخانه در نظر بگیر که چند تا ورودی میگیره و روی آن عملیاتی انجام می دهد و خروجی می دهد.
در سی پلاس همه تابع است و ساب نداریم. اگر ساب بخواهیم تابع را از نوع void انتخاب می کنیم.

هر چیزی سئوال برانگیزه براتون بگید تا بحث بشه.
 

kemiaonline

Banned
سلام
ممنون خیلی خوب بود
اما سوال اینجاست
چه موقع از ساب استفاده میشه چه موقع از فانکشن
راستی منظور شما از تابع : فانکشن بود یا چیز دیگه
اگه بشه در باره ی روال ها و زیر روال ها هم یه تعریف کنید ممنون میشم
راستی خواهشن طریقه ی استفاده از ساب و فانکشن رو بگید
ممنون

متاسفانه این بحث بحث مهم و پیچیده ای هست و نیاز به شفاف سازی داره

طریقه ی استفاده از این دو فرمان رو بگید
راستی یه سوال دیگه هم برام پیش اومد

تا حالا ما کد ها رو اینجا نوشتیم
Private Sub Form_Load()
دستورات
End Sub
این ساب هست
اما میخوام بدونم ساب فقط به این کار محدود میشه ؟ یا کارهای دیگه ای رو هم انجام میده
دستور exit sub
چیکار میکنه ؟
همچنین میخواستم فرق بین private و public رو بدونم طرز استفقاده از اونها رو و
خلاصه هر چیزی که در باره ساب و فانکشن و public . private و هر چیز دیگه ای که هست و من نمیدونم

ممنون میشم
 

saalek110

Well-Known Member
چه موقع از ساب استفاده میشه چه موقع از فانکشن
ممنون

اولا من بدون مراجعه به منبعی جواب می دهم. شاید کامل نگم.

دوما خوبه دوستان دیگر هم جواب بدهند تا جواب کاملتری ساخته بشه.

سوما جواب شما:
بستگی داره که نیاز به خروجی داشته باشی یا نه.
مثلا تابع استفاده می کنی تا جمع دو عدد را برگرداند.
و ساب استفاده می کنی تا چیزی را نمایش دهد.
در اولی خروجی نیازه در دومی کار مورد نظر نیازه و خروجی نیاز نیست.

در ضمن منظور من از تابع همان فانکشن است.

اگه بشه در باره ی روال ها و زیر روال ها هم یه تعریف کنید ممنون میشم
ممنون

من فکر کنم این ها یکی هستند ولی هر کتاب و منبع اصطلاحی استفاده می کنه و این دو لغت بوجود آمده. و اصلا نمی دانم روال مساوی ساب میشه یا ((مجموع ساب و فانکشن)) .
ولی کلا همان تقسیم بندی ساب و فانکشن را شما داشته باشید. مهم استفاده است. اسمها مهم نیست.

اگر اشتباه گفتم دوستان لطفا تصحیح کنید.

راستی خواهشن طریقه ی استفاده از ساب و فانکشن رو بگید
ممنون

در تاپیک ((آموزش مصور ویژوال بیسیک)) تا حد مناسبی گفته شده. مطالعه کنید.

تا حالا ما کد ها رو اینجا نوشتیم
کد:
Private Sub Form_Load()
دستورات 
End Sub
این ساب هست
اما میخوام بدونم ساب فقط به این کار محدود میشه ؟ یا کارهای دیگه ای رو هم انجام میده

اینی که شما نوشتید رویداد فرم_لود است. یعنی وقتی فرم داره لود میشه. یعنی در زمان لود فرم چه کارهایی باید انجام بشه. خیلی چیزها را میشه اینجا تعیین کرد. کلا هر چیزی که می خواهید اول برنامه ست شده باشه.

دستور exit sub
چیکار میکنه ؟

این دستور مهم و مفیدی است.
کارش خروج از ساب است.

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

kemiaonline

Banned
بی رو در واسی بگم
دارم دیونه میشم
من تو کتاب خوندم که روال ها از طریق زیر روال ها خوانده میشوند
در حالی که هیچ تعریفی نه از روال کرده بود نه از زیر روال
شما که میگید این دو یکی هستند کلا" قاطی کردم
مهم نیست
اگه اشتباه نکرده باشم در ساب خروجی نیاز نیست
سوما جواب شما:
بستگی داره که نیاز به خروجی داشته باشی یا نه.
مثلا تابع استفاده می کنی تا جمع دو عدد را برگرداند.
و ساب استفاده می کنی تا چیزی را نمایش دهد.
در اولی خروجی نیازه در دومی کار مورد نظر نیازه و خروجی نیاز نیست.

اگه خروجی نیاز نیست پس به چه دردی میخوره وقتی نمایش داده نشود



جناب سالک
اگه وقتتون رو نمیگیرم میشه چند تا مثال کامل با سورس کد هاش نشون بدید
چون مطمئنم این بحث به درد تمام کسانی که وارد این انجمن میشند میخوره
و ارزششو داره که بیشتر از اینها روش کار بشه



طریقه ی استفاده از ساب و فانکشن رو بگید
همچنین private و public
 

saalek110

Well-Known Member
من تو کتاب خوندم که روال ها از طریق زیر روال ها خوانده میشوند
در حالی که هیچ تعریفی نه از روال کرده بود نه از زیر روال

متن کتاب را اگر بیشتر تایپ کنید بهتر میشه جواب داد.
با شرحی بیشتری که دادید من جواب زیر را می دهم:

در ویژوال بیسیک شما رویدادگرا کار می کنید. یعنی هر تکه کد میره داخل یک رویداد.
مثلا چند خط کد وقتی یک باتون کلیک شد اجرا میشه
و چند خط کد وقتی فرم لود میشه
و چند خط کد موقع خروج برنامه
و الی آخر

یعنی شما کد آزاد ندارید.
یعنی هر تکه کدی داخل یک رویداد است.
و هر رویداد هم یک روال است از جهتی.
و هر ساب یا فانکشنی هم که ساخته باشد از درون این روال ها صدا زده می شود.

فکر کنم منظور کتاب شما این بوده.
حالا اگر بیشتر تایپ کنید از کتاب بهتر میشه نظر داد.

اگه اشتباه نکرده باشم در ساب خروجی نیاز نیست
سوما جواب شما:
بستگی داره که نیاز به خروجی داشته باشی یا نه.
مثلا تابع استفاده می کنی تا جمع دو عدد را برگرداند.
و ساب استفاده می کنی تا چیزی را نمایش دهد.
در اولی خروجی نیازه در دومی کار مورد نظر نیازه و خروجی نیاز نیست.

اگه خروجی نیاز نیست پس به چه دردی میخوره وقتی نمایش داده نشود

شما منظور من را درست متوجه نشدید.
وقتی ساب می سازیم که نیازی به خروجی نیست. مثلا محاسبه ریاضی نیست که جواب برگردانده شود. یک کاری است که نیازی به گزارش نیست. چون مطمئنیم کارش را درست انجام می دهد. مثلا می خواهیم تمام تکست باکس های روی فرم پاک شود. در اینجا یک ساب می سازیم و کدهایی درونش می نویسیم تا کار لازم را انجام دهد. دیگه نیازی به خروجی نیست که ساب خروجی برگرداند بگه من پاک کردم همه را . چون می دانیم از پسش برمی آید. ولی مثلا اگر قراره بره از هارد چند تا فایل را پاک کنه خوبه فانکشن بسازیم تا بیاد بگه نتونستم پاک کنم همه را یا توانستم همه را پاک کنم.
 

saalek110

Well-Known Member
یه سوال دیگر
اگر فرمان ها به شکل زیر بنویسیم چی ؟
کد:
Private Sub Form_Load()
End Sub
دستورات

همان طور که گفتم تمام کدها را ما داخل رویداد می نویسیم. نمی شود بیرون رویداد نوشت.
خطای زیر را دریافت می کنیم:

rkdmkp.gif
 

kemiaonline

Banned
من با اجازه ی جناب سالک و اقا فرهاد میخوام نتیجه ای رو که گرفتم بنویسم
اگه اشتباه بود خواهشن بهم بگید و اصلاح کنید
1-روال و زیر رول و پروسیجر و... همه به یک معنا میباشند
2- private یعنی محلی و کد هایی که در زیر این عنوان نوشته شود در همان محل نوشته شده اجرا میگردد
3-public یعنی عمومی و کدهایی که در زیر نوشته شود در تمام پروژه قابیل استفاده هست
مثلا" ماغیری که در اینجا تعریف شود در تمام پروژه تعریف شده است
چندیدن مورد دیگه هم هست اگه تا اینجا درست نوشتم تا ادامه بدم
 

saalek110

Well-Known Member
روال و زیر رول و پروسیجر و... همه به یک معنا میباشند
در کتابها و منابع مختلف اصطلاحات مختلفی به کار می رود ولی من فقط ساب و فانکشن را می شناسم.
========================

2- private یعنی محلی و کد هایی که در زیر این عنوان نوشته شود در همان محل نوشته شده اجرا میگردد
3-public یعنی عمومی و کدهایی که در زیر نوشته شود در تمام پروژه قابیل استفاده هست

پروژه ای بسازید. و یک فرم علاوه بر فرم 1 به آن بیافزایید.

در فرم یک یک باتون هم اضافه کنید.

در فرم یک کد زیر را درج کنید.
کد:
Private Sub Command1_Click()
a1
a2
Form2.a1
End Sub

Public Sub a1()
Print "form1 a1"
End Sub

Private Sub a2()
Print "form1 a2"
End Sub
و در فرم 2 کد زیر را درج کنید:
کد:
Public Sub a1()
MsgBox ("form2 a1")
End Sub


Private Sub a2()
MsgBox ("form2 a2")
End Sub
وقتی داشتیم می نوشتیم form2 و یک نقطه گذاشتیم تصویر زیر را داشتیم:

2ch5g78.gif

یعنی به ساب a1 از فرم 2 دسترسی داریم ولی به ساب a2 از فرم 2 دسترسی نداریم. چون اولی پابلیک و دومی پریویت است.
نتیجه گیری من این است که ساب های پابلیک را از فرم دیگه میشه صدا کرد ولی پریویت را نمیشه.
ولی چه پابلیک و چه پریویت را میشه از داخل همان فرم صدا زد. (همان طور که در کد بالا می بینید که a1 از فرم 1 و a2 از فرم 1 در رویداد کلیک باتون صدا زده شده که دومی پریویت بوده)
 

saalek110

Well-Known Member
مثلا" متغیری که در اینجا تعریف شود در تمام پروژه تعریف شده است
متغیرها دو نوعند(البته از نظر محل دسترسی)
محلی
عمومی

هر متغیری که داخل ساب یا فانکشن تعریف شود محلی است و فقط در همان ساب یا فانکشن به رسمیت شناخته می شود.
متغیر عمومی بالای کدها بعد option explicit تعریف می شود.

اما متغیرهای عمومی هم مثل ساب و فانکشن می توانند پابلیک یا پریویت باشند. که باز اگر پابلیک بود در فرم دیگر قابل استفاده و اگر پریویت بود در فرم دیگر قابل استفاده نیست.

===============
برای تمرین متغیر عمومی در فرمهای یک و دو از کد زیر استفاده کنید:
کد:
Option Explicit
Dim form1_a1 As Integer

Private Sub Command1_Click()
form1_a1 = 4
Print form1_a1

      Form2.form2_a1 = 5
      Print Form2.form2_a1
      
      ' //// form2.form2_a2 = 66 /// gheyre ghabele ghabol

End Sub
کد:
Option Explicit
Public form2_a1 As Integer
Dim form2_a2 As Integer

2rqejwg.gif

در شکل بالا می بینیم که دسترسی به متغیر form2_a1 وجود دارد ولی به متغیر form2_a2 وجود ندارد.
 

kemiaonline

Banned
سلام
میخواستم ببینم میشه که اصلا" از کدهای ساب و فانکشن استفاده نکرد و چند صد خط فرمان به جاشون نوشت
در لقع همه ی کد ها رو در داخل
private sub namekontrol
دستورات
end sub
میخواستم ببینم میشه همه ی فرمان ها رو در اونجا نوشت
سوال دومم اینه که
ایت مقدار بازگشتی که از تابع میگیرن یعنی چی ؟ میشه با چند تا مثال توضیح بدید؟
 

saalek110

Well-Known Member
استفاده کردن از ساب و فانکشن با صلاح دید شماست. و اجباری نیست.
ولی فرض کنید در رویداد کلیک 10 باتون صد خط کد تکراری دارید. و ده بار در این ده رویداد تکرار میشه. اگر شما بیایید یک ساب یا فانکشن بسازید و اون صد خط کد را در آن قرار دهید. برنامه شما حجمش یک دهم میشه. ولی باز هم اگر اصرار دارید که از ساب و فانکشن استفاده نکنید باز به جز افزایش حجم برنامه مشکلی پیش نمی آید.

سئوال 2 :
در مورد اینکه مقدار بازگشتی چیه و مثالش می توانید به آموزشهای موجود در تالار مراجعه کنید.
این پست را ببینید:
http://www.majidonline.com/forum/showpost.php?p=259410&postcount=87

بعد دیدن پست بالا به مثال ساده ای که من از خودم ساختم توجه کنید.
روی فرم 3 تکست باکس و یک باتون اضافه کنید و کد زیر:
کد:
Option Explicit
Private Sub Command1_Click()
Dim s As Integer
s = mysum(Text1.Text, Text2.Text)
Text3.Text = s
End Sub

Public Function mysum(x As Integer, y As Integer) As Integer
mysum = x + y
End Function
یک نوع ماشین حساب ساده است. در تکست 1 و تکست 2 شما دو عدد می دهید و با زدن باتون حاصل جمع را در تکست 3 خواهید داشت.
یک function هم استفاده شده تا طرز استفاده اش را ببینید.
 

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

بالا