PDA

View Full Version : حرفه ای: غیر قابل ویرایش کردن ، قسمت های مشخص در textbox



milad.biroonvand
دوشنبه 03 اسفند 1388, 16:01 عصر
سلام دوستان عزیز

من یک رشته به صورت زیر دارم :




Dim str AsString
str = "my name is milad biroonvand(( )) and you is my computer (( )) .he is a good (( )) boy"



حالا باید چکاری انجام دهیم ، تا فقط قسمت هایی که داخل دو پرانتز هستند قابل ویرایش (حذف و نوشتن) باشند و سایر قسمت ها قابل ویرایش نباشند ؟

amin_iman82
دوشنبه 03 اسفند 1388, 20:24 عصر
از برنامه نویسی با پشته باید استفاده کنی. (درس ساختمان داده)
شما داری چه برنامه ای درست میکنی ، سوالات خفنن :متفکر:

اگه مشکل حل نشد بگو تا بنویسم؟

milad.biroonvand
سه شنبه 04 اسفند 1388, 08:21 صبح
از برنامه نویسی با پشته باید استفاده کنی. (درس ساختمان داده)
شما داری چه برنامه ای درست میکنی ، سوالات خفنن :متفکر:

اگه مشکل حل نشد بگو تا بنویسم؟


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

milad.biroonvand
سه شنبه 04 اسفند 1388, 11:04 صبح
از برنامه نویسی با پشته باید استفاده کنی. (درس ساختمان داده)
شما داری چه برنامه ای درست میکنی ، سوالات خفنن :متفکر:

اگه مشکل حل نشد بگو تا بنویسم؟



برنامه نویسی با پشته هم نیازی نیست ، ما می تونیم از کد در رویداد keydown فثطذخط بنویسیم

ابتدا باید دو تابع زیر رو بنویسیم



Private Function OpenParanChecker(ByVal ObjTextbox As Object) As Boolean
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
If (InStrRev1(Txt.SelectionStart, Txt.Text, "((")) <> 0 Then
Return True
Else
Return False
End If
End Function
Private Function CloseParanChecker(ByVal ObjTextbox As Object) As Boolean
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
If (InStr(Txt.SelectionStart, Txt.Text, "))")) <> 0 Then
Return True
Else
Return False
End If
End Function



با کد های زیر می تونیم ، تشخیص بدیم که آیا متن در قسمت ، وسط دو پرانتز انتخاب شده است یا نه . اگر هر دو تابع نتیجه true را دادند ، یعنی اینکه متن وسط دو پرانتز انتخاب شده است .

milad.biroonvand
سه شنبه 04 اسفند 1388, 11:21 صبح
برنامه نویسی با پشته هم نیازی نیست ، ما می تونیم از کد در رویداد keydown فثطذخط بنویسیم

ابتدا باید دو تابع زیر رو بنویسیم



PrivateFunction OpenParanChecker(ByVal ObjTextbox AsObject) AsBoolean
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
If (InStrRev1(Txt.SelectionStart, Txt.Text, "((")) <> 0 Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction
PrivateFunction CloseParanChecker(ByVal ObjTextbox AsObject) AsBoolean
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
If (InStr(Txt.SelectionStart, Txt.Text, "))")) <> 0 Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction



با کد های زیر می تونیم ، تشخیص بدیم که آیا متن در قسمت ، وسط دو پرانتز انتخاب شده است یا نه . اگر هر دو تابع نتیجه true را دادند ، یعنی اینکه متن وسط دو پرانتز انتخاب شده است .


ولی با این روش باز هم مشکل پیدا می کنه .

milad.biroonvand
سه شنبه 04 اسفند 1388, 12:53 عصر
الگوریتم زیر رو نوشوتم ف میشه با اون تشخیص داد که آیا متن انتخاب شده درون دو پرانتز قرار گرفته یا نه ؟


تابع های پیمایش به چپ و راست

ما چهار تابع داریم .




PrivateFunction OpenParanCheckerLeft(ByVal ObjTextbox AsObject) AsInteger
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
'If (InStrRev1(Txt.SelectionStart, Txt.Text, "((")) <> 0 Then
' Return True
'Else
' Return False
'End If
Return InStrRev1(Txt.SelectionStart, Txt.Text, "((")
EndFunction
PrivateFunction CloseParanCheckerRight(ByVal ObjTextbox AsObject) AsInteger
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
'If (InStr(Txt.SelectionStart, Txt.Text, "))")) <> 0 Then
' Return True
'Else
' Return False
'End If
Return (InStr(Txt.SelectionStart, Txt.Text, "))"))
EndFunction
PrivateFunction OpenParanCheckerRight(ByVal ObjTextbox AsObject) AsInteger
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
'If (InStr(Txt.SelectionStart, Txt.Text, "((")) <> 0 Then
' Return True
'Else
' Return False
'End If
Return (InStr(Txt.SelectionStart, Txt.Text, "(("))
EndFunction
PrivateFunction CloseParanCheckerLeft(ByVal ObjTextbox AsObject) AsBoolean
Dim Txt As TextBox = DirectCast(ObjTextbox, TextBox)
If (InStrRev1(Txt.SelectionStart, Txt.Text, "))")) <> 0 Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction




1- یکی به دنبال )) از سمت چپ

2- یکی به دنبال )) از سمت راست

3- یکی به دنبال (( از سمت چپ

4- یکی بدنبال (( از سمت راست

و نحوه س استفاده از این تابع ها بصورت زیر هست .





Dim flag1 = False, flag2 AsBoolean = False
Dim PosOpen = 0, PosClose AsInteger = 0

'setp 1
PosClose = CloseParanCheckerLeft(TextBox1)
PosOpen = OpenParanCheckerLeft(TextBox1)
If PosOpen > PosClose Then
flag1 = True
Else
flag1 = False
EndIf
PosOpen = OpenParanCheckerRight(TextBox1)
PosClose = CloseParanCheckerRight(TextBox1)
If PosOpen > PosClose Then
flag2 = True
Else
flag2 = False
EndIf
If (flag1 = TrueAnd flag2 = True) Then
MessageBox.Show(" ", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
Else
MessageBox.Show(" ", "", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
EndIf




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

حالا باید کاری کنیم تا هنگامی که کلید delete زده می شه در textbox اگر وسط دو پرانتز نبود حذف نشه .

Hossis
سه شنبه 04 اسفند 1388, 13:01 عصر
چرا اين قدر به خودتون زحمت مي ديد
نيازي نيست از يک تکست باکس استفاده کنيد،‌از چند ليبل و چند تکست باکس استفاده کنيد ظاهر و استايل همه را مثل هم کنيد تا کاربر فکر کنه ليبل ، ادامه تکست باکس است، بعد براي قسمت پرانتز هم از تکست باکس استفاده کنيد
در هنگام ورود و خروج متن ، با استفاده از همين پرانتز، متن را بين تکست ها و ليبل ها تقسيم نموده و مجددا الصاق نماييد
فکر نکنم اين ايده مشکلي ايجاد کنه

Hossis
سه شنبه 04 اسفند 1388, 13:04 عصر
يک ايده ديگه هم دارم :
در رويداد KeyPress با استفاده از يک تايع تشخيص مي دهيم که SelectionStart يعني جائي که کرسر قرار داره، توي پرانتز هست يا نه؟؟ اگر توي پرانتز باشه، کد رو وارد کنه و گرنه وارد نکنه
اگه نيازه بگيد تا اين کد رو تست کنم و همين جا بفرستم

milad.biroonvand
سه شنبه 04 اسفند 1388, 13:48 عصر
يک ايده ديگه هم دارم :
در رويداد KeyPress با استفاده از يک تايع تشخيص مي دهيم که SelectionStart يعني جائي که کرسر قرار داره، توي پرانتز هست يا نه؟؟ اگر توي پرانتز باشه، کد رو وارد کنه و گرنه وارد نکنه
اگه نيازه بگيد تا اين کد رو تست کنم و همين جا بفرستم


سلام

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

milad.biroonvand
سه شنبه 04 اسفند 1388, 13:49 عصر
يک ايده ديگه هم دارم :
در رويداد KeyPress با استفاده از يک تايع تشخيص مي دهيم که SelectionStart يعني جائي که کرسر قرار داره، توي پرانتز هست يا نه؟؟ اگر توي پرانتز باشه، کد رو وارد کنه و گرنه وارد نکنه
اگه نيازه بگيد تا اين کد رو تست کنم و همين جا بفرستم


اگر کد بهتری داری ، اینجا بزار.

Hossis
سه شنبه 04 اسفند 1388, 15:05 عصر
اين هم الگوريتم!! من:قهقهه::گیج: که مشکل رو به کلي حل مي کنه :تشویق:(البته من با يک پرانتز ساختم شما مي تونيد دو پرانتزه کنيد)):متعجب:


Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim tx As TextBox = TextBox1
Dim str As String = tx.Text & "()"
Dim S1 As Integer = str.IndexOf("(", tx.SelectionStart)
Dim S2 As Integer = str.IndexOf(")", tx.SelectionStart)
If e.KeyChar = "(" Or e.KeyChar = ")" Then e.Handled = True
If S1 < S2 Then
e.Handled = True
End If
End Sub

milad.biroonvand
چهارشنبه 05 اسفند 1388, 08:15 صبح
ولی با این روش باز هم مشکل پیدا می کنه .


و این هم راه حل مشکلش که گفتم ؟




Dim flag1 = False, flag2 As Boolean = False
Dim PosOpen = 0, PosClose As Integer = 0

'setp 1
PosClose = CloseParanCheckerLeft(textbox1)
PosOpen = OpenParanCheckerLeft(textbox1)
If PosOpen > PosClose Then
flag1 = True
Else
flag1 = False
End If
PosOpen = OpenParanCheckerRight(textbox1)
PosClose = CloseParanCheckerRight(textbox1)
If (PosOpen > PosClose) Or (PosClose <> 0 And PosOpen = 0) Then
flag2 = True
Else
flag2 = False
End If
If (flag1 = True And flag2 = True) Then
MessageBox.Show(" ", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
Else
MessageBox.Show(" ", "", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
End If

milad.biroonvand
چهارشنبه 05 اسفند 1388, 08:24 صبح
اين هم الگوريتم!! من:قهقهه::گیج: که مشکل رو به کلي حل مي کنه :تشویق:(البته من با يک پرانتز ساختم شما مي تونيد دو پرانتزه کنيد)):متعجب:


PrivateSub TextBox1_KeyPress(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim tx As TextBox = TextBox1
Dim str AsString = tx.Text & "()"
Dim S1 AsInteger = str.IndexOf("(", tx.SelectionStart)
Dim S2 AsInteger = str.IndexOf(")", tx.SelectionStart)
If e.KeyChar = "("Or e.KeyChar = ")"Then e.Handled = True
If S1 < S2 Then
e.Handled = True
EndIf
EndSub



سلام ، دوست عزیز

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

milad.biroonvand
چهارشنبه 05 اسفند 1388, 08:42 صبح
سلام ، دوست عزیز

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


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




Dim tx As TextBox = textbox1
Dim str As String = tx.Text & "(())"
Dim S1 As Integer = str.IndexOf("((", tx.SelectionStart)
Dim S2 As Integer = str.IndexOf("))", tx.SelectionStart)
If e.KeyChar = "((" Or e.KeyChar = "))" Then e.Handled = True
If S1 < S2 Then
e.Handled = True
End If
Dim x = textbox1.Text.Substring(textbox1.SelectionStart - 1, 1)
If x = "(" And Asc(e.KeyChar) = 8 Then
e.Handled = True
End If




فقط یه مشکل دیگه پیش میاد ، موقعی که خارج از پرانتز ها کلید delete فشرده بشه ، باز هم متن پاک می کنه ، که اینکار نباید اتفاق بیفته ؟ این مشکل رو چطور باید حل کرد ؟

Alghoochi
چهارشنبه 05 اسفند 1388, 11:17 صبح
بهتر نیست از Regular Expression استفاده کنی؟

milad.biroonvand
چهارشنبه 05 اسفند 1388, 15:05 عصر
بهتر نیست از Regular Expression استفاده کنی؟

سلام دوست عزیز ، منظور شما عبارت منظمه که با اونا مثلا می تونی یک ایمیل رو چک کنی یا چیز دیگه ای ؟ اگه می شه یکم بیشتر توضیح بده .

Hossis
چهارشنبه 05 اسفند 1388, 21:53 عصر
مشکلی که گفتم ، اگر کد رو به اینصورت در بیاریم حل می شه ،




Dim tx As TextBox = textbox1
Dim str AsString = tx.Text & "(())"
Dim S1 AsInteger = str.IndexOf("((", tx.SelectionStart)
Dim S2 AsInteger = str.IndexOf("))", tx.SelectionStart)
If e.KeyChar = "(("Or e.KeyChar = "))"Then e.Handled = True
If S1 < S2 Then
e.Handled = True
EndIf
Dim x = textbox1.Text.Substring(textbox1.SelectionStart - 1, 1)
If x = "("And Asc(e.KeyChar) = 8 Then
e.Handled = True
EndIf




فقط یه مشکل دیگه پیش میاد ، موقعی که خارج از پرانتز ها کلید delete فشرده بشه ، باز هم متن پاک می کنه ، که اینکار نباید اتفاق بیفته ؟ این مشکل رو چطور باید حل کرد ؟
يک کم به کد دقت کنيد، مي تونيد حلش کنيد
به اين ترتيب که اين کد رو در رويداد KeyDown کپي کنيد و به جاي خطوطي که قرمز کردم، اول خط اين شرط رو اضافه کنيد

if e.keycode=key.delete then ...
دقيقا اين طور


Dim tx As TextBox = textbox1
Dim str AsString = tx.Text & "(())"
Dim S1 AsInteger = str.IndexOf("((", tx.SelectionStart)
Dim S2 AsInteger = str.IndexOf("))", tx.SelectionStart)

If S1 < S2 Then
if e.keycode =key.delete then e.Handled = True
EndIf

توجه:
رويداد KeyPress بايد به حال خودش باشد فقط اين کد رو به رويداد Keydown اضافه کنيد

Alghoochi
پنج شنبه 06 اسفند 1388, 15:59 عصر
سلام دوست عزیز ، منظور شما عبارت منظمه که با اونا مثلا می تونی یک ایمیل رو چک کنی یا چیز دیگه ای ؟ اگه می شه یکم بیشتر توضیح بده .
Regular Expression یعنی عبارات با معنا. تو همین سایت قبلا روش بحث شده بگردی پیدا می کنی.
این مطلبم یاد بگیری بد نیست

milad.biroonvand
پنج شنبه 06 اسفند 1388, 22:01 عصر
Regular Expression یعنی عبارات با معنا. تو همین سایت قبلا روش بحث شده بگردی پیدا می کنی.
این مطلبم یاد بگیری بد نیست


سلام

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

milad.biroonvand
پنج شنبه 06 اسفند 1388, 22:03 عصر
سلام

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

من با این عبارت قبلا در php با این روش کار کردم ولی تو وبی کار نکردم .