PDA

View Full Version : سوال: فانگشن



dimomid
یک شنبه 17 اردیبهشت 1391, 09:59 صبح
باسلام خدمت دوستان عزيز
من ميخواستم كدي را در فانگشن قرار بدم كه بعدا
هرجا كه لازم داشتم اونو فراخواني كنم.
ولي
1- طرز درست كردن فانگشن رو كلا فراموش كردم قبلا در كلاس خوندم ولي
بدليل كه در اين مورد اصلا كاري نكردم فراموش شده اگه ممكنه كمكم كنيد
2- طريقه فراخواني اون رو هم يادم بدين البته اگه امكان داره و كسي اين لطف رو ميكنه.
ممنونم

Mr'Jamshidy
یک شنبه 17 اردیبهشت 1391, 10:52 صبح
Private Sub Form_Load()
Dim tmp As String
'If you declare in Module call...
tmp = ASD("Test 1")
'If you declare in Form call...
tmp = Form1.ASD("Test 1")

MsgBox tmp
End Sub

Function ASD(Arg As String) As String
'.
'.
'.
'Put your code here
'.
'.
'.

'Return Value
ASD = "Sample Function " & Arg
End Function

dimomid
دوشنبه 18 اردیبهشت 1391, 20:09 عصر
جناب جمشیدی لطف کردین اما راستشو بگم من مبتدی هستم
و چیزی متوجه نشدم اگه ساده تر و بیشتر توضیح بدین ممنون میشم
مثلا فانگشن رو کجا درست کنم تو یه فرم مجزا یا تو همون فرم که کار میکنم
من میخوام یه فانگشن داشته باشم که تو برنامه ای که 30 یا 35 فرم داره در هرکجا
که نیاز داشتم اونو فراخوانی کنم
ممنون مشیم کمکم کنید.

ROSTAM2
دوشنبه 18 اردیبهشت 1391, 20:22 عصر
فانگشن :لبخند:

یه تابع نوع تعریف داره Public/Private که اگه تعریف نشه به صورت پیشفرض Public تعریف می شه برای وی بی که میشه در سطح پروژه ازش استفاده کرد - یک نام داره که با قوانین نامگذاری متغیر باید بخونه - ورودی داره هر چی دوس داری می تونی بهش ورودی بدی منتها اگه نیازی بهشون نداری خوب بهش ورودی نده - و یه نوع داده برگشتی داره برای مقدار برگشتی که اگه تعریف نشه object/variant میشه

در کل

[Public/Private] Function FuncName([[ByVal/ByRef] Argument1 [As String/Integer/Long/...],...]) [As String/Long/...]

'Statements

End Function

در ضمن فارسی اون می شه تابع (فانکشن)

محسن واژدی
دوشنبه 18 اردیبهشت 1391, 20:34 عصر
سلام علیکم
با اجازه دوستان بنده هم توضیحاتی را اضافه میکنم
همانطور که اطلاع دارید روال هایی هستند که با Sub شروع میشوند و روال هایی نیز با Function، فرق این دو در این است که اولی صرفا" فراخوانی میشود و مستقیما مقداری را برنمیگرداند اما در روال های از نوع دوم مقداری را نیز به عنوان نتیجه تابع برمیگردانند
شیوه ی نوشتن روال ها هم در اینترنت جستجو کنید به نتایج بسیار زیادی میرسید

چند نکته که میتواند مفید باشد:
- میتوانیم روال ها را عمومی یا خصوصی کنیم، یعنی اینکه مشخص کنیم یک روال صرفا" در همان مادول فرم را کد قابل دسترسی باشد یا اینکه در سایر بخش های برنامه نیز امکان دسترسی به آنها وجود داشته باشد؛ برای خصوصی کردن یک روال از Private و برای عمومی کردن آن نیز از Public در ابتدای روال استفاده میکنیم، نمونه زیر یک روال عمومی است:

Public Sub MyMsg()
MsgBox "Hi"
End Sub

- اگر یک روال عمومی در یک فرم قرار داشته باشد، برای صدا زدنش ابتدا نام فرم و سپس نام روال را مینویسیم، برای مثال اگر روال بالا در فرمی با نام Form1 قرار داشته باشد، برای اجرای آن دستور را به یکی از صورت های زیر مینویسیم:
Form1.MyMsg
یا
Call Form1.MyMsg
استفاده از Call اختیاری است

- اما اگر بخواهیم روال در سطح برنامه بی واسطه در دسترس باشد آنرا در یک مادول کد قرار میدهیم، برای نمونه اگر روال بالا را در یک مادول کد قرار دهیم، برای صدا زدنش کافیست نام آنرا وارد کنیم، مانند زیر:
MyMsg
یا
Call MyMsg

-------------------------------
اگر روال ما تابعی باشد که آنرا در یک مادول کد قرار داده ایم، مانند نمونه زیر:
Public Function Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

این تابع دو مقدار را گرفته و باهم جمع کرده و نتیجه را برمیگرداند، مقادیر ارسالی در دو آرگومان های Num1,Num2 قرار میدهیم،
برای نمونه اگر بخواهیم دو مقدار 4 و 1 را به این تابع ارسال و نتیحه را در یک Label1 نمایش دهیم، دستور را بصورت زیر مینویسیم

Label1=Sum(4,1)

در یک تابع برای برگرداندن نتیجه ابتدا نام تابع را نوشته و مساوی میزنیم سپس نتیجه را بعد از آن مینویسیم مانند تابع بالا:
Public Function Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

موفق باشید

Mr'Jamshidy
دوشنبه 18 اردیبهشت 1391, 21:05 عصر
سلام علیکم
با اجازه دوستان بنده هم توضیحاتی را اضافه میکنم
همانطور که اطلاع دارید روال هایی هستند که با Sub شروع میشوند و روال هایی نیز با Function، فرق این دو در این است که اولی صرفا" فراخوانی میشود و مستقیما مقداری را برنمیگرداند اما در روال های از نوع دوم مقداری را نیز به عنوان نتیجه تابع برمیگردانند
شیوه ی نوشتن روال ها هم در اینترنت جستجو کنید به نتایج بسیار زیادی میرسید

چند نکته که میتواند مفید باشد:
- میتوانیم روال ها را عمومی یا خصوصی کنیم، یعنی اینکه مشخص کنیم یک روال صرفا" در همان مادول فرم را کد قابل دسترسی باشد یا اینکه در سایر بخش های برنامه نیز امکان دسترسی به آنها وجود داشته باشد؛ برای خصوصی کردن یک روال از Private و برای عمومی کردن آن نیز از Public در ابتدای روال استفاده میکنیم، نمونه زیر یک روال عمومی است:

Public Sub MyMsg()
MsgBox "Hi"
End Sub

- اگر یک روال عمومی در یک فرم قرار داشته باشد، برای صدا زدنش ابتدا نام فرم و سپس نام روال را مینویسیم، برای مثال اگر روال بالا در فرمی با نام Form1 قرار داشته باشد، برای اجرای آن دستور را به یکی از صورت های زیر مینویسیم:
Form1.MyMsg
یا
Call Form1.MyMsg
استفاده از Call اختیاری است

- اما اگر بخواهیم روال در سطح برنامه بی واسطه در دسترس باشد آنرا در یک مادول کد قرار میدهیم، برای نمونه اگر روال بالا را در یک مادول کد قرار دهیم، برای صدا زدنش کافیست نام آنرا وارد کنیم، مانند زیر:
MyMsg
یا
Call MyMsg

-------------------------------
اگر روال ما تابعی باشد که آنرا در یک مادول کد قرار داده ایم، مانند نمونه زیر:
Public Sub Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

این تابع دو مقدار را گرفته و باهم جمع کرده و نتیجه را برمیگرداند، مقادیر ارسالی در دو آرگومان های Num1,Num2 قرار میدهیم،
برای نمونه اگر بخواهیم دو مقدار 4 و 1 را به این تابع ارسال و نتیحه را در یک Label1 نمایش دهیم، دستور را بصورت زیر مینویسیم

Label1=Sum(4,1)

در یک تابع برای برگرداندن نتیجه ابتدا نام تابع را نوشته و مساوی میزنیم سپس نتیجه را بعد از آن مینویسیم مانند تابع بالا:
Public Sub Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

موفق باشید

و البته ببخشید اما یک اشتباه کوچکی پیش اومده که من اسلاحش میکنم

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



Public Sub Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

این تابع دو مقدار را گرفته و باهم جمع کرده و نتیجه را برمیگرداند، مقادیر ارسالی در دو آرگومان های Num1,Num2 قرار میدهیم،
برای نمونه اگر بخواهیم دو مقدار 4 و 1 را به این تابع ارسال و نتیحه را در یک Label1 نمایش دهیم، دستور را بصورت زیر مینویسیم

Label1=Sum(4,1)

در یک تابع برای برگرداندن نتیجه ابتدا نام تابع را نوشته و مساوی میزنیم سپس نتیجه را بعد از آن مینویسیم مانند تابع بالا:
Public Sub Sum(Num1, Num2)
Sum = Num1 + Num2
End Sub

روال هایی که با Sub شروع میشوند کلا مقدار بازگشتی به روشی استاندارد ندارن و برای داشتن مقدار بازگشتی حتما باید بجای Sub در مثال بالا از کلمه Function استفاده بشه

یعنی مثال بالا باید به این صورت تغییر داده بشه

Public Function Sum(Num1, Num2)
Sum = Num1 + Num2
End Function

dimomid
چهارشنبه 03 خرداد 1391, 21:13 عصر
بازم سلام خدمت دوستان خوبم که محبت کردن و منو راهنمایی کردن حالا یه سوال دارم که امیدوارم
راهنماییم کنید

من در یک برنامه مثلا دبیرخانه چندین فرم دارم که این کد رو داخل تکست باکس هر کدومش میزارم تا اولا فقط حروف رو بگیره بعدشم فارسی تایپ کنه
[Private Sub Text2_KeyPress(KeyAscii As Integer)
On Error Resume Next
If KeyAscii = 104 Then KeyAscii = -57
If KeyAscii = 72 Then KeyAscii = -62
If KeyAscii = 102 Then KeyAscii = -56
If KeyAscii = 113 Then KeyAscii = -42
If KeyAscii = 119 Then KeyAscii = -43
If KeyAscii = 101 Then KeyAscii = -53
If KeyAscii = 114 Then KeyAscii = -34
If KeyAscii = 121 Then KeyAscii = -37
If KeyAscii = 117 Then KeyAscii = -38
If KeyAscii = 111 Then KeyAscii = -50
If KeyAscii = 112 Then KeyAscii = -51
If KeyAscii = 105 Then KeyAscii = -27
If KeyAscii = 116 Then KeyAscii = -35
If KeyAscii = 91 Then KeyAscii = -52
If KeyAscii = 93 Then KeyAscii = -115
If KeyAscii = 92 Then KeyAscii = -114
If KeyAscii = 96 Then KeyAscii = -127
If KeyAscii = 97 Then KeyAscii = -44
If KeyAscii = 115 Then KeyAscii = -45
If KeyAscii = 100 Then KeyAscii = -19
If KeyAscii = 103 Then KeyAscii = -31
If KeyAscii = 106 Then KeyAscii = -54
If KeyAscii = 107 Then KeyAscii = -28
If KeyAscii = 108 Then KeyAscii = -29
If KeyAscii = 59 Then KeyAscii = -33
If KeyAscii = 39 Then KeyAscii = -112
If KeyAscii = 122 Then KeyAscii = -39
If KeyAscii = 120 Then KeyAscii = -40
If KeyAscii = 99 Then KeyAscii = -46
If KeyAscii = 118 Then KeyAscii = -47
If KeyAscii = 98 Then KeyAscii = -48
If KeyAscii = 110 Then KeyAscii = -49
If KeyAscii = 109 Then KeyAscii = -63
If KeyAscii = 44 Then KeyAscii = -26
If KeyAscii = 63 Then KeyAscii = 191
If KeyAscii = 77 Then KeyAscii = -58
If KeyAscii = 48 Then KeyAscii = 16
If KeyAscii = 49 Then KeyAscii = 17
If KeyAscii = 50 Then KeyAscii = 18
If KeyAscii = 51 Then KeyAscii = 19
If KeyAscii = 52 Then KeyAscii = 20
If KeyAscii = 53 Then KeyAscii = 21
If KeyAscii = 54 Then KeyAscii = 22
If KeyAscii = 55 Then KeyAscii = 23
If KeyAscii = 56 Then KeyAscii = 24
If KeyAscii = 57 Then KeyAscii = 25
If KeyAscii = 58 Then KeyAscii = 26
End Sub]

سوالم اینجاست
آیا میشه من این کدهارو داخل یه فانکشن بزارم
و فقط در تکست باکس به جای نوشتن این همه کد اونو فرا بخوانم
یعنی در فرم هایی که شاید 20 تا 30 فرم بشه و هر کدومشم چند تکست باکس
داره از یه خط کد فانکشن استفاده کنم؟؟
اگر امکانش هست و این مسئله امکان پذیره لطفا
برام نوع نوشتن صحیحش رو مرحمت کنید
البته قبلا از لطفتون سپاسگزارم.

just4froum
چهارشنبه 03 خرداد 1391, 21:29 عصر
بفرمایید باید درست باشه :

'In Module
Public Function TextKeyPress(KeyAscii As Integer) As Integer
On Error Resume Next
If KeyAscii = 104 Then TextKeyPress = -57
If KeyAscii = 72 Then TextKeyPress = -62
If KeyAscii = 102 Then TextKeyPress = -56
If KeyAscii = 113 Then TextKeyPress = -42
If KeyAscii = 119 Then TextKeyPress = -43
If KeyAscii = 101 Then TextKeyPress = -53
If KeyAscii = 114 Then TextKeyPress = -34
If KeyAscii = 121 Then TextKeyPress = -37
If KeyAscii = 117 Then TextKeyPress = -38
If KeyAscii = 111 Then TextKeyPress = -50
If KeyAscii = 112 Then TextKeyPress = -51
If KeyAscii = 105 Then TextKeyPress = -27
If KeyAscii = 116 Then TextKeyPress = -35
If KeyAscii = 91 Then TextKeyPress = -52
If KeyAscii = 93 Then TextKeyPress = -115
If KeyAscii = 92 Then TextKeyPress = -114
If KeyAscii = 96 Then TextKeyPress = -127
If KeyAscii = 97 Then TextKeyPress = -44
If KeyAscii = 115 Then TextKeyPress = -45
If KeyAscii = 100 Then TextKeyPress = -19
If KeyAscii = 103 Then TextKeyPress = -31
If KeyAscii = 106 Then TextKeyPress = -54
If KeyAscii = 107 Then TextKeyPress = -28
If KeyAscii = 108 Then TextKeyPress = -29
If KeyAscii = 59 Then TextKeyPress = -33
If KeyAscii = 39 Then TextKeyPress = -112
If KeyAscii = 122 Then TextKeyPress = -39
If KeyAscii = 120 Then TextKeyPress = -40
If KeyAscii = 99 Then TextKeyPress = -46
If KeyAscii = 118 Then TextKeyPress = -47
If KeyAscii = 98 Then TextKeyPress = -48
If KeyAscii = 110 Then TextKeyPress = -49
If KeyAscii = 109 Then TextKeyPress = -63
If KeyAscii = 44 Then TextKeyPress = -26
If KeyAscii = 63 Then TextKeyPress = 191
If KeyAscii = 77 Then TextKeyPress = -58
If KeyAscii = 48 Then TextKeyPress = 16
If KeyAscii = 49 Then TextKeyPress = 17
If KeyAscii = 50 Then TextKeyPress = 18
If KeyAscii = 51 Then TextKeyPress = 19
If KeyAscii = 52 Then TextKeyPress = 20
If KeyAscii = 53 Then TextKeyPress = 21
If KeyAscii = 54 Then TextKeyPress = 22
If KeyAscii = 55 Then TextKeyPress = 23
If KeyAscii = 56 Then TextKeyPress = 24
If KeyAscii = 57 Then TextKeyPress = 25
If KeyAscii = 58 Then TextKeyPress = 26
End Function

'In Form
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = TextKeyPress(KeyAscii)
End Sub

just4froum
چهارشنبه 03 خرداد 1391, 21:31 عصر
اینو یادم رفت بگم :

فقط حواستون باشه که قسمت اول توی یک Module بنویسید که برای همه ی فرم ها جواب بده.