PDA

View Full Version : سوال: مشکل در مقدار برگشتی یک تابع



pooya1072
سه شنبه 09 اسفند 1390, 15:28 عصر
سلام
توی یک ماجول یک function تعریف کردم که مقدار برگشتی اون یک مقدار از نوع string است.در قسمتی از بدنه این تابع آرایه ای از نوع char تعریف شده که هر خونه از اون یک کارکتره.مثلاً :

Dim MyName(4) as char
MyName(0)="P"
MyName(1)="o"
MyName(2)="o"
MyName(3)="y"
MyName(4)="a"

از طرفی یک متغیر از نوع رشته دارم مثلاً به نام MyString . در انتهای برنامه و قبل از مشخص کردن مقدار برگشتی تابع طبق دستور زیر :

MyString=MyName
تمام آرایه MyName رو درون رشته MyString خالی می کنم و در آخر تابع همین MyString رو به برنامه اصلی می فرسته.
و حالا مشکل برنامه :
تا آخرین خط تابع در هنگام دیباگ مقدار MyString همون مقدار مورد نظره.ولی در فرم اصلی مقدار نمایش داده شده برابره با "" یعنی خالی.این در حالیه که اگر در تابع به جای آرایه یک رشته یا یک حرف رو توی MyString خالی کنم بدون مشکل نمایش داده می شه.
موندم مشکل چیه.کلافه شدم!!!!!!!!!!!!!!:گریه:

Hybrid
سه شنبه 09 اسفند 1390, 15:39 عصر
سلام ، از تابع cstr برای اینکار استفاده کن یعنی :


Function Getname() As String
Dim myChar(6) As Char
myChar(0) = "s"
myChar(1) = "i"
myChar(2) = "a"
myChar(3) = "v"
myChar(4) = "a"
myChar(5) = "s"
myChar(6) = "h"

Dim myNameComplete As String = CStr(myChar)

Return myNameComplete

End Function

** در داخل بدنه ی این تابع من اومدم آرایه ای از کارکتر ها رو ایجاد کردم سپس در یک خط ماقبل دستور Return اومدم اون آرایه رو از طریق تابع cstr ( Convert to string) به رشته تبدیل کردم سپس اونو از طریق دستور Return برگشت دادم.

موفق باشید./

pooya1072
سه شنبه 09 اسفند 1390, 16:01 عصر
مشکل حل نشد دوست عزیز
همونطوره.جهت بررسی بیشتر تابع رو می ذارم.یه نگاهی بندازید.قبلش بگم.توی یه فرم دوتا تکست باکس گذاشتم. Textbox1و Textbox2
توی رویداد Textbox1_TextChanged کد زیر رو نوشتم :


Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
TextBox2.Text = InsertSeperator(TextBox1.Text)
End Sub


حالا تابع من به شکل زیر تعریف شده :


Public Function InsertSeperator(ByVal StrPay As String) As String
Dim strBuffer As String
Dim NumOfPart As Integer
Dim Counter As Integer = 0
Dim strBCounter As Integer
If Len(StrPay) <= 3 Then
strBuffer = StrPay
Else
NumOfPart = Math.Ceiling(Len(StrPay) \ 3)
strBCounter = Len(StrPay) + NumOfPart
ReDim strB(strBCounter)
For i = Len(StrPay) - 1 To 0 Step -1
Counter = Counter + 1
If Counter Mod 4 <> 0 Then
strB(strBCounter) = StrPay(i)
strBCounter = strBCounter - 1
Else
strB(strBCounter) = ","
strBCounter = strBCounter - 1
i = i + 1
End If
Next
strBuffer = CStr(strB)
End If
InsertSeperator = strBuffer
End Function

Hybrid
سه شنبه 09 اسفند 1390, 16:06 عصر
سلام دوست عزیز ، دقیقا بگو این تابع میخواد چه کار کنه ، یک رشته میگیره و به Array تبدیل میکنه ؟؟؟ یا بر عکس ؟ اول مثال بالا میاد Array میگیره و به رشته تبدیل میکنه.

pooya1072
سه شنبه 09 اسفند 1390, 16:10 عصر
این تابع یک رشته رو میگیره و سه تا سه بین اونا "," قرار میده.مثلاً 123456789 رو به صورت 123,456,789 نشون میده

Hybrid
سه شنبه 09 اسفند 1390, 16:54 عصر
اگه این تابع واسه تمرین نوشتی که هیچ ! اما اگه میخوای واقعا برای تکست باکس استفاده کنی راههای بهتری هم وجود داره ( مانند کنترل MaskedTextbox ).

از این تابع میتونین استفاده کنین ، در این تابع اومدم از کلاس StringBuilder استفاده کردم در حالت عادی این کلاس وجود نداره برای اینکار باید فضای نامی System.text رو در بالای CodeEditor وارد کنی.


Function insertSeparator(ByVal originalText As String) As String

Dim sb As New StringBuilder

If Len(originalText) <= 3 Then

Return originalText

Else

For i As Byte = 0 To originalText.Length - 1

If ((i <> 0) And (i Mod 3 = 0)) Then
sb.Append(",")
End If

sb.Append(originalText(i))

Next

Return sb.ToString()

End If

End Function

Sample ش :

فرید نجفلو
سه شنبه 09 اسفند 1390, 17:44 عصر
اینم یع تابع دیگه که اعداد با منفی هم مشکلی نداره

Public Function SeparateDigit(ByVal Digit As Double, Optional ByVal SeparateSign As String = ",") As String
Try
If Not IsNumeric(Digit) Then Return Digit
If Math.Abs(CDbl(Digit)) < 1000 Then
Return Digit
End If
Dim StrSeparate As String
Dim i As Long, J As Long
Dim LenStr As Long
Dim IsNegative As Boolean = Digit < 0
StrSeparate = ""
Digit = Math.Abs(CDbl(Digit))
LenStr = CStr(Digit).Length

J = (LenStr Mod 3)
For i = 1 To LenStr
StrSeparate = StrSeparate + Mid(CStr(Digit), i, 1)
If i Mod 3 = J And i < LenStr Then StrSeparate = StrSeparate & SeparateSign
Next i
If IsNegative Then StrSeparate = "-" & StrSeparate
Return StrSeparate
Catch ex As Exception
Return Digit
End Try
End Function

mgh64120
سه شنبه 09 اسفند 1390, 18:03 عصر
این تابع یک رشته رو میگیره و سه تا سه بین اونا "," قرار میده.مثلاً 123456789 رو به صورت 123,456,789 نشون میده

سلام دوست عزيز
چرا از تابع Format براي اينكار استفاده نميكنيد؟
اين كد رو درون رويداد TextChanged كنترل TextBox قرار بده.

TextBox1.Text=Format(CType("123456789", Double), "###,###,###,###,###")
SendKeys.Send("{End}")

موفق باشيد...

فرید نجفلو
سه شنبه 09 اسفند 1390, 18:37 عصر
سلام دوست عزيز
چرا از تابع Format براي اينكار استفاده نميكنيد؟
اين كد رو درون رويداد TextChanged كنترل TextBox قرار بده.

TextBox1.Text=Format(CType("123456789", Double), "###,###,###,###,###")
SendKeys.Send("{End}")

موفق باشيد...

دوست عزیز قصد ما فقط ارائه تابع نیست
اینکه بگیم وقتی یه تابع می نویسیم باید حساب شده باشه و دقیق
اگه تو کار به این سادگی همچین چیزی بنویسیم دیگه تو یه تابع پیچیده ...!!!

و البته کد صحیح در روش شما به صورت زیره:لبخندساده:

TextBox2.Text = FormatNumber(TextBox1.Text, 0)

sm4899
شنبه 13 اسفند 1390, 08:27 صبح
سلام
توی یک ماجول یک function تعریف کردم که مقدار برگشتی اون یک مقدار از نوع string است.در قسمتی از بدنه این تابع آرایه ای از نوع char تعریف شده که هر خونه از اون یک کارکتره.مثلاً :

Dim MyName(4) as char
MyName(0)="P"
MyName(1)="o"
MyName(2)="o"
MyName(3)="y"
MyName(4)="a"

از طرفی یک متغیر از نوع رشته دارم مثلاً به نام MyString . در انتهای برنامه و قبل از مشخص کردن مقدار برگشتی تابع طبق دستور زیر :

MyString=MyName
تمام آرایه MyName رو درون رشته MyString خالی می کنم و در آخر تابع همین MyString رو به برنامه اصلی می فرسته.
و حالا مشکل برنامه :
تا آخرین خط تابع در هنگام دیباگ مقدار MyString همون مقدار مورد نظره.ولی در فرم اصلی مقدار نمایش داده شده برابره با "" یعنی خالی.این در حالیه که اگر در تابع به جای آرایه یک رشته یا یک حرف رو توی MyString خالی کنم بدون مشکل نمایش داده می شه.
موندم مشکل چیه.کلافه شدم!!!!!!!!!!!!!!:گریه:
یا سلام - ارایه رو 4 عنصری تعریف مینی و به 5 تا مقدار میدی خوب مقدار5 یعنی myvhar(4) میشه پوچ

Hybrid
شنبه 13 اسفند 1390, 09:30 صبح
یا سلام - ارایه رو 4 عنصری تعریف مینی و به 5 تا مقدار میدی خوب مقدار5 یعنی myvhar(4) میشه پوچ

سلام دوست عزیز ، اندیس آرایه از صفر شروع میشه!!

موفق باشید./

sm4899
یک شنبه 14 اسفند 1390, 12:54 عصر
با سلام - بله اندیس ارایه از صفر شروع میشه - وقتی طول راایه رو 4 تعریف کنی عنصر آخر میشه 3

Hybrid
یک شنبه 14 اسفند 1390, 13:37 عصر
با سلام - بله اندیس ارایه از صفر شروع میشه - وقتی طول راایه رو 4 تعریف کنی عنصر آخر میشه 3

دوست عزیز ، تاپیک داره منحرف میشه در هر حال تعداد عناصر آرایه یکی بیشتر از شماره ای هست که داخل پرانتز مینویسن به این عکس دقت کن :

http://img4up.com/up2/14272108406957350145.jpg

واسه مطمئن شدن کد زیر رو داخل رویداد کلیک باتن هم بنویس و امتحان کن :


Dim a(3) As String
a(0) = "siavash"
a(1) = "yahya"
a(2) = "yaser"
a(3) = "omid"

MessageBox.Show("a(3) =" & a(3))

*** طوری که شما میگین باید a(3) برابر empty باشه و هیچ مقداری رو نشون نده.

موفق باشید./

sm4899
دوشنبه 15 اسفند 1390, 08:28 صبح
سلام - بله اشتباه از من بود - متشکر

barnamenevisforme
دوشنبه 15 اسفند 1390, 09:11 صبح
سلام
یه سوال بی ربط این وسط میپرسم.
چرا توی هر ارسالی که کد نوشته شده من اون کد رو نمیتونم مشاهده کنم و فقط یه scrollbar میبینم و توی اونم چیزی نیست؟

Hybrid
دوشنبه 15 اسفند 1390, 09:23 صبح
سلام
یه سوال بی ربط این وسط میپرسم.
چرا توی هر ارسالی که کد نوشته شده من اون کد رو نمیتونم مشاهده کنم و فقط یه scrollbar میبینم و توی اونم چیزی نیست؟

سلام من با IE همین مشکل رو داشتم ، ولی وقتی که مرورگرم رو به firefox تغییر دادم مشکل حل شد. در صورت امکان با مرورگر های دیگه هم امتحان کنین تا مشکل حل بشه

barnamenevisforme
دوشنبه 15 اسفند 1390, 09:55 صبح
از اقای pooya1072 (http://barnamenevis.org/member.php?80134-pooya1072) عذر میخوام که وسط بحثشون پریدم.اینکه من نمیتونم تاپیک ایجاد کنم هم مربوط به موضوع IE ؟

Hybrid
دوشنبه 15 اسفند 1390, 10:47 صبح
از اقای pooya1072 (http://barnamenevis.org/member.php?80134-pooya1072) عذر میخوام که وسط بحثشون پریدم.اینکه من نمیتونم تاپیک ایجاد کنم هم مربوط به موضوع IE ؟

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