PDA

View Full Version : می خواهم توابع پیشرفته تری درست کنم. لطفاً راهنمایی کنید.



javad2000
یک شنبه 06 خرداد 1386, 22:19 عصر
سلام

من چند سوال در مورد ساخت تابع در VB.net دارم. (از نسخه 2005 استفاده می کنم).
الآن فقط 2 تاشو می پرسم که زیاد طولانی نشه:

1- چطور می تونم تابعی درست کنم، که داده های ورودی اون، بیش از 1 حالت داشته باشه؟ مثلاً یا باید سه متغیر از نوغ Integer و یا یک متغیر از نوع String به عنوان متغیر ورودی، به اون داده بشه؟ (اگه واضح نیست تا توضیح بدم)

2- چطور می تونم متغیر ورودی یک تابع رو طوری تنظیم کنم که موقع وارد کردن اون متغیر، گزینه های مختلفی در اختیارم قرار بگیره؟ (مثل زمانی که یک متغیر Boolean رو می خوام مقدار دهی کنم و به طور خودکار (Intellisense) مقادیر Trueو False به عنوان گزینه های موجود جلوم ظاهر میشه)

با تشکر

h_sadeghynejad
دوشنبه 07 خرداد 1386, 00:39 صبح
خسته نباشید
1) واسه این کار باید چند تابع هم نام اما با آرگومانهای مختلف یا آرگومان های هم نام اما با نوع های مختلف تعریف کنی در این صورت خود برنامه با توجه به ورودی ها تابع صحیح رو اجرا میکنه
2) واسه اینکار در صورتی که کارت فقط با Boolean حل میشه که وقتی آرگومان رو از نوع Boolean تعریف کنی خود به خود همینطوری جواب میده اما اگه بخوای که طوری بشه که واسه داده های دیگه مثلا برای روزهای هفته کار بکنه اول باید یه نوع Enum تعریف کنی که اعضای اون باید انواع داده ها باشن بعد آرگومان تابع رو از اون نوع تعریف کنی به این شکل



Enum Day
Sat = 1
San = 2
Mon = 3
Thu = 4
Wen = 5
Thur = 6
Fri = 7
End Enum

Private Function a(ByVal b As Day)
a = b
End Function

javad2000
دوشنبه 07 خرداد 1386, 12:33 عصر
صادقی نژاد عزیز دستت درد نکنه.
چقدر روشن و خوب توضیح دادید. امتحان کردم جواب داد. حالا یه سوال دیگه:

همونطور که می دونید اگه یک تابع به نام فرضی A رو تعریف کنم، هنگامی که دارم اون رو فراخوانی می کنم، به صورت خودکار پارامترهایی که باید بهش بدم جلوم ظاهر میشه. اگه بخوام در مورد هر کدوم از این پارامترها (یا در مورد خود تابع)، یک توضیح کوتاه هم ظاهر بشه چکار باید بکنم؟

eyes_shut_number1
دوشنبه 07 خرداد 1386, 14:13 عصر
سلام من که ندیدم بشه این چیزی که شما میگید وقتی اسم تابع رو مینویسی داخل یک تولتیپ(Tooltip) ارگمانهای ورودی اون و نوع خروجی رو که تابع برمیگردونرو میگه اگر هم از اورلود استفاده کرده باشید کنار تولتیپ فلش میزاره که بدونید آرگمان های دو تابع هم نام که دارید چیه
OverLoad
:تابع های هم نام با آرگمان های مختلف

ghafoori
دوشنبه 07 خرداد 1386, 14:37 عصر
دوست عزیز از این تگ ها استفاده کن


''' <summary>
'''
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

h_sadeghynejad
دوشنبه 07 خرداد 1386, 14:59 عصر
اول یه نگاهی به لینک پائین بنداز همه چیز دستگیرت میشه
http://www.codeproject.com/useritems/StringEnum.asp
متاسفانه الان کلاس دارم اگه مشکلی بود بگو برگشتم در خدمتم

CodeMasterX
دوشنبه 07 خرداد 1386, 15:11 عصر
دوست عزیز javad2000 پیشنهاد میکنم قبل از شروع کار با یک ابزار برنامه نویسی و تولید نرم افزار خوب اون ابزار رو یاد بگیرید.ببینید منظورم اینه:

شما فرض کنید یه ListBox دارید و 4 تا آیتم بهش اضافه کردین.حالا میخواین یه آیتم جدید بهش اضافه کنید ولی اندیسش 2 باشه یعنی به عنوان آیتم دوم نمایش داده بشه.حالا چیکار میکنی ؟ میشه لیست رو پاک کرد و لیست جدید رو با آیتم های جدید پر کرد و یا روش های جایگزینی دیگه.ولی میشه آیتم جدید رو اضافه کرد و خاصیت اندیسش رو به 2 ست کرد.این یعنی اینکه اگه شما ابزاری که در دست دارین رو خوب و کامل بلد باشین و با قابلیت ها و امکاناتش آشنایی داشته باشین از کدنویسی اضافی و شخصی و به عبارتی دوباره کاری خلاص میشین.

javad2000
دوشنبه 07 خرداد 1386, 20:12 عصر
سلام
ضمن تشکر
نمیدونم من منظور شما رو درست متوجه نشدم یا شما منظور منو. اما توی پست های بالا، راه حل مورد نظرم رو نیافتم. جناب کدمستر هم که گفتند باید اول کار با ابزارها رو خوب یاد بگیری، نمی دونم منظورشون کدوم ابزار هست.

من میخوام تابع هایی که میسازم Tooltip هایی شبیه تصاویر زیر داشته باشه (اگه عکس ها لود نشدند، روی اونها راست کلیک کنید و Open in New Window را بزنید) :
http://imgplace.com/directory/dir3410/1180372147_7142.JPG (http://www.imgplace.com/getcode.php?img=directory/dir3410/1180372147_7142.JPG)

http://imgplace.com/directory/dir3410/1180372164_7023.JPG (http://www.imgplace.com/getcode.php?img=directory/dir3410/1180372164_7023.JPG)

برای این که اگر اون تابع رو داخل یه ماژول کردم و در اختیار دیگران گذاشتم و خواستند اون رو فراخوانی کنند بدونند هر پارامتر تابع چی هست و کلاً اون تابع به چه درد می خوره.

ghafoori
دوشنبه 07 خرداد 1386, 20:29 عصر
دوست عزیز من که گفتم چکار کنید توضیحات در مورد متد یا خصوصیت را در بین تگ <summary> قرار بدید و در مورد هر پارامتر هم پس از معرفی پارامتر توضیحات را داخل تک قرار دهید مانند مثال زیر


''' <summary>
''' تابع لود فرم
''' </summary>
''' <param name="sender">این پارمتر حاوی اشاره گری به فرم است</param>
''' <param name="e">این پارامتر حاوی بقیه اطلاعات رویداد است </param>
''' <remarks>رویداد لود</remarks>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

greenway
دوشنبه 07 خرداد 1386, 21:34 عصر
سلام
1- چطور می تونم تابعی درست کنم، که داده های ورودی اون، بیش از 1 حالت داشته باشه؟ مثلاً یا باید سه متغیر از نوغ Integer و یا یک متغیر از نوع String به عنوان متغیر ورودی، به اون داده بشه؟ (اگه واضح نیست تا توضیح بدم)
با تشکر

برای تحقیق در مورد این مبحث از کلمات کلیدی Polymorphism , Object Oriented استفاده کنید. البته سوال شما به صورت مستقیم توسط دوستان پاسخ داده شده است.

javad2000
سه شنبه 08 خرداد 1386, 02:33 صبح
غفوری جان
حالا افتاد. امتحان کردم 100% جواب میداد. دستت درد نکنه.
حالا یه سوال دیگه:

1- چطور میشه کاری کرد که مقدار دریافتی یا مقدار بازگشتی یک تابع، به صورت یک آرایه باشد؟ چیزی شبیه این کد (که البته کار نمی کنه) :



Function B() (A() as Integer) as Integer
B(1)=A(1)+1
B(2)=A(2)+2
End Function

ghafoori
سه شنبه 08 خرداد 1386, 06:36 صبح
b که اسم خود تابع است نمی شود به ان مقدار داد کد بالا را می توانی بشکل زیر بنویسی



Dim a() As Integer = {1, 2, 3}
Function sum(ByVal b() As Integer) As Integer()
Dim d(), c As Integer
d = New Integer(b.Length) {}
For c = 0 To b.Length - 1
d(c) = b(c) + 1
Next
Return d
End Function

eyes_shut_number1
سه شنبه 08 خرداد 1386, 09:14 صبح
جواد جان به این نکته پیشه پا افتاده توجه بکن که حجم کد هاتو کو میکنه .اگه شما بخواین یک پارامتر آرایه ای رو برای تابع بفرستید لازم نیست که مقدار برگشتی داشته باشه.چون آرایه ها آشاره گر دارن منظور همون ByRefrence هستش. پس تغییرات توی خودشون ذخیره میشه به مثال پایین توجه کن. در اینجا به جای تابع از رویه استفاده شده ولی وقتی به لود فرم برمیگرده به تمامی آرایه مقدار 2 اضافه شده
Sub Load_Form1 (...)
Dim D() As Integer= Nothing
FUNC(d)

End Sub
_________________________________________
Public Sub FUNC(ByVal d() A Integre)
For i As integer= o to d.longlength -1
d(i) + = 2
End Sub

javad2000
سه شنبه 08 خرداد 1386, 15:28 عصر
که اسم خود تابع است نمی شود به ان مقدار داد کد بالا را می توانی بشکل زیر بنویسی
کد:
Dim a() As Integer = {1, 2, 3} Function sum(ByVal b() As Integer) As Integer() Dim d(), c As Integer d = New Integer(b.Length) {} For c = 0 To b.Length - 1 d(c) = b(c) + 1 Next Return d End Function

http://www.barnamenevis.org/forum/images/statusicon/user_offline.gif http://www.barnamenevis.org/forum/images/buttons/report.gif (http://www.barnamenevis.org/forum/report.php?p=345843) http://www.barnamenevis.org/forum/images/buttons/post_thanks.gif (http://www.barnamenevis.org/forum/showthread.php?do=post_thanks_add&p=345843)


سلام
امتحان کردم جواب داد. متشکرم.



جواد جان به این نکته پیشه پا افتاده توجه بکن که حجم کد هاتو کو میکنه .اگه شما بخواین یک پارامتر آرایه ای رو برای تابع بفرستید لازم نیست که مقدار برگشتی داشته باشه.چون آرایه ها آشاره گر دارن منظور همون ByRefrence هستش. پس تغییرات توی خودشون ذخیره میشه به مثال پایین توجه کن. در اینجا به جای تابع از رویه استفاده شده ولی وقتی به لود فرم برمیگرده به تمامی آرایه مقدار 2 اضافه شده
کد:
Sub Load_Form1 (...)Dim D() As Integer= NothingFUNC(d)End Sub_________________________________________Public Sub FUNC(ByVal d() A Integre)For i As integer= o to d.longlength -1 d(i) + = 2End Sub


اگر درست متوجه شده باشم منظور شما فرستادن یک متغیر به صورت Byref به تابع یا روال است. البته این کار هم امکان پذیر است، اما به نظرم استفاده از یک تابع آرایه ای، خوانا تر از فرستادن آرایه به صورت Byref خواهد بود.

با سپاس

eyes_shut_number1
سه شنبه 08 خرداد 1386, 22:11 عصر
بله درسته ولی با ریفرنس خوبیهای زیادی داره
و اگر توابع و متغییر هات رو دقیق نام گذاری کنی نه تنها به مشکلی بر نمیخوری
بلکه حجم کد ها کمتر و خوانایی برنامت بیشتر میشه
صلاح کار خود خسروان دانند:بامزه:

eyes_shut_number1
سه شنبه 08 خرداد 1386, 22:56 عصر
در ضمن جواد جان میدونم که میدونی
ولی منم یه بار دیگه میگم که :
از آرایه به عنوان آرگمان فقط با BYVAL فقط در آخرین آرگمان و فقط یک دونه
یعنی شما نمیتونید بیشتر از 1 آرایه آرگمان داشته باشید
پس به نظر میاد Byref بهتره