الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال: مشكلة في البحث عن الكلمة

مغلق
بدأه maayah في 12 يوليو 2007 · 14 رد · 1,553 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

عندي مشكلة بسيطة في كود يقوم بالبحث عن

الكلمة واعتقد أن المشكلة سببها المتغيرات المعرفة

في البرنامج حاولت ان احلها لكن بدون فائدة .. والمشكلة

هي في انه يوجد نص داخل Richtextbox يحتوي النص

على كلمات visual visual visual visual ويوجد داخل

Textbox1 الكلمة visual وهي الكلمة التي أريد ان ابحث عنها

والمشكلة هي عند تظليل أي كلمة من النص بالفأرة مثلا اذا قمنا

بتظليل الكلمة الثانية من النص ثم اختيار البحث من الأسفل ثم الضغط على

الزر Find فأنه يقوم بالبحث من هذه الكلمة الى الأعلى الى نهاية

النص و عندما يصل نهاية النص يعود بالبحث بالعكس او باتجاه البحث الصحيح وهذا خطأ.

وليس شرط ان يقوم بهذا الخطأ فعند تظليل الكلمة الثالثة مثلا يقوم بخطأ ثاني.

فهل من الممكن عند تظليل النص من مكان معين بالفأرة والبحث للأسفل او الاعلى

أن يبحث بالتجاه الصحيح لكن عندما يصل نهاية النص يعطي رسالة انه لم يبقى نص يبحث عنه.

لقد قمت بأدراج الكود في ملف لتوضيح الخطأ مع العلم ان الكود لا يوجد خطأ

فيه عند استخدام الأزرار الموجودة في البرنامج لكن الخطأ عند تظليل كلمة

من النص والبحث في الكلمة.

مع شكري للجميع ...

SearchAllInOne.zip

#2

جرب هذه الدالة المعدلة وخبرنا بالنتيجة

Public Sub Search(ByVal Word As String, _
		Optional ByVal Reverse As Boolean = False, _
		Optional ByVal MatchCase As Boolean = True, _
		Optional ByVal ContinueFromCursorPosition As Boolean = True)

	If Revpos = -1 Then
		Revpos = Me.RichTextBox1.TextLength
	End If

	If ContinueFromCursorPosition = True Then
		Position = Me.RichTextBox1.SelectionStart
	End If

	If MatchCase = True Then
		If Reverse = False Then
			Position = Me.RichTextBox1.Text.IndexOf(Word, Position + 1)
		Else
			Position = Me.RichTextBox1.Text.LastIndexOf(Word, Revpos)
		End If
	Else
		If Reverse = False Then
			Position = Me.RichTextBox1.Text.ToUpper().IndexOf(Word.ToUpper, Position + 1)
		Else
			Position = Me.RichTextBox1.Text.ToUpper().LastIndexOf(Word.ToUpper, Revpos)
		End If
	End If

	If Position >= 0 Then
		Me.RichTextBox1.SelectionStart = Position
		Me.RichTextBox1.SelectionLength = Word.Length
		Me.RichTextBox1.Select()
		Me.RichTextBox1.ScrollToCaret()
		Revpos = Me.RichTextBox1.SelectionStart
	Else
		MsgBox("La chaine recherché n'exist pas dans la feuille . . !!", vbExclamation, "Resultat de recherche")
		Revpos = -1
	End If

End Sub

أعتقد أنها تفي بالغرض

تم تعديل هذه المشاركة بواسطة msas في 12 يوليو 2007 في 23:45

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

شكرا اخي على ردك لقد جربت كودك وقد قام بحل نصف

المشكلة بمعنى انه عند التظليل والبحث الى الأسفل

لا توجد مشكلة الكود صحيح اما عند البحث الى الأعلى

عند التظليل من كلمة معينة فأن البرنامج يبحث من البداية

وليس من عند الكلمة المظللة هل يوجد حل لهذه المشكلة

لتنتهي معاناتي مع هذا الكود.

ولقد ارفقت ملف بكودك المعدل.

SearchAllInOne_2.zip

#4

للرفع

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 26 يوليو 2007 في 21:27

#5

مجرد تعديل بسيط في الدالة

استبدل الكود في الدالة

If ContinueFromCursorPosition = True Then
		Position = Me.RichTextBox1.SelectionStart
	End If

بالكود

If ContinueFromCursorPosition = True Then
			Position = Me.RichTextBox1.SelectionStart
			Revpos = Me.RichTextBox1.SelectionStart
		End If

ولكن توجد ملاحظات على استخدامك للدالة أيضا

عندما تضع قيمة البارامتر الرابع للدالة False كما في الكود

Search(TextBox1.Text, True, False)

فانت تخبر الدالة أن تقوم بالبحث منذ البداية وليس من مكان المشيرة يجب أن يكون سطر الكود السابق كما يلي كي يتابع البحث من مكان المشيرة

Search(TextBox1.Text, True)

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

السلام عليكم ورحمة الله وبركاته

يوجد خطأ في برنامجي فعندما ابحث عن الكلمة

مثلا visual في نص يحتوي الكلمات التالية

visual visual visual Visual فعند البحث

يقوم بالقفز عن أول كلمة ويبحث عن بقية الكلمات

بشكل صحيح مع أن الكلمة الأولى تكون من ضمن

البحث. او مثلا عند وضع مؤشر الفأرة عند الكلمة الأولى

visual قبل الحرف v والبحث فأنه يتجاهل الكلمة الأولى visual

التي تكون ضمن البحث.

مع شكري للجميع ...

SearchAllInOne.zip

#7

لا يوجد حل

#8

السلام عليكم و رحمة الله و بركاته

(h) شوف مجرد متغير من نوع Boolean يحل المشكلة و برنامج يصبح بعد التعديل كالتالي :

Public Class Form1
	Dim Position As Integer = -1
	Dim Revpos As Integer = -1
	Dim B As Boolean
	Public Sub SearchMatchCase(ByVal Word As String, Optional ByVal Reverse As Boolean = False, Optional ByVal ContinueFromCursorPosition As Boolean = True)
		On Error Resume Next
		If Revpos = -1 Then
			Revpos = Me.RichTextBox1.TextLength
		End If

		If ContinueFromCursorPosition = True Then
			Position = Me.RichTextBox1.SelectionStart
			Revpos = Me.RichTextBox1.SelectionStart
		End If

		If Reverse = False Then
			Position = Me.RichTextBox1.Text.IndexOf(Word, Position + 1)
		Else
			Position = Me.RichTextBox1.Text.LastIndexOf(Word, Revpos)
		End If

		If Position >= 0 Then
			Me.RichTextBox1.SelectionStart = Position
			Me.RichTextBox1.SelectionLength = Word.Length
			Me.RichTextBox1.Select()
			Me.RichTextBox1.ScrollToCaret()
			Revpos = Me.RichTextBox1.SelectionStart
		Else
			MsgBox("La chaine recherché n'exist pas dans la feuille . . !!", vbExclamation, "Resultat de recherche")
			Revpos = -1
		End If

	End Sub

	Public Sub Search(ByVal Word As String, _
			Optional ByVal Reverse As Boolean = False, _
			Optional ByVal MatchCase As Boolean = True, _
			Optional ByVal ContinueFromCursorPosition As Boolean = True)
		On Error Resume Next
		If Revpos = -1 Then
			Revpos = Me.RichTextBox1.TextLength
		End If

		If ContinueFromCursorPosition = True Then
			Position = Me.RichTextBox1.SelectionStart
			Revpos = Me.RichTextBox1.SelectionStart
		End If

		If MatchCase = True Then
			If Reverse = False Then
				Position = Me.RichTextBox1.Text.IndexOf(Word, Position + 1)
			Else
				Position = Me.RichTextBox1.Text.LastIndexOf(Word, Revpos)
			End If
		Else
			If Reverse = False Then
				If B = False Then
					Position = Me.RichTextBox1.Text.ToUpper().IndexOf(Word.ToUpper, Position)
					b = True
				Else
					Position = Me.RichTextBox1.Text.ToUpper().IndexOf(Word.ToUpper, Position + 1)
				End If
			Else
				Position = Me.RichTextBox1.Text.ToUpper().LastIndexOf(Word.ToUpper, Revpos)
			End If
			End If

		If Position >= 0 Then
			Me.RichTextBox1.SelectionStart = Position
			Me.RichTextBox1.SelectionLength = Word.Length
			Me.RichTextBox1.Select()
			Me.RichTextBox1.ScrollToCaret()
			Revpos = Me.RichTextBox1.SelectionStart
		Else

			Me.RichTextBox1.Select()
			MsgBox("La chaine recherché n'exist pas dans la feuille . . !!", vbExclamation, "Resultat de recherche")
			Revpos = -1
		End If

	End Sub


	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		If RadioButton1.Checked = True AndAlso CheckBox1.Checked = False Then
			Search(TextBox1.Text, True, False)
		End If

		If RadioButton2.Checked = True AndAlso CheckBox1.Checked = False Then
			Search(TextBox1.Text, False, False)
		End If

		If RadioButton1.Checked = True AndAlso CheckBox1.Checked = True Then
			SearchMatchCase(TextBox1.Text, True)
			Me.RichTextBox1.Select()
		End If

		If RadioButton2.Checked = True AndAlso CheckBox1.Checked = True Then
			SearchMatchCase(TextBox1.Text, False)
			Me.RichTextBox1.Select()
		End If
	End Sub

	Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
		Me.RichTextBox1.Select()
	End Sub

	Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
		Me.RichTextBox1.Select()
	End Sub

	Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
		Me.RichTextBox1.Select()
	End Sub

End Class

و المثال تراه في المرفقات .

;) مع خالص تحياتي ...

SearchAllInOne.rar

i1044214_21.JPG

#9

شكرا اخي على ردك لقد قمت بحل نصف المشكلة حيث

عند البحث بالطريقة العادية كل شيء تمام لكن عندما البحث

باستخدام Match Case عندما أضع اشارة الصح أمام checkbox

وعند البحث تظهر نفس المشكلة بسبب عدم تعديل الكود في التعريف

التالي SearchMatchCase لقد حاولت تعديل الكود لكن دون فائدة

هل يوجد حل لهذه المشكلة.

مع شكري على ردك.

#10

لا يوجد حل لأخر مشكلة عندي

#11

السلام عليكم و رحمة الله و بركاته

آسف على تأخري .

بالنسبة لحل نصف المشكلة الاخر قد توصلت اليه أخيرا و الحمد لله .

المثال في المرفقات .

;) و لكم خالص تحياتي ،،،

SearchAllInOne.rar

i1044214_21.JPG

#12

شكرا اخي على ردك لقد حللت المشكلة

لكن بدون رسالة توضيحية.

عندما أبحث بالخيار Match Case وأختار البحث الى

الأعلى Up عندما يصل الى اخر كلمة لا يعطي رسالة

أنه انتهى من البحث أما عند اختيار Match Case والبحث

الى الأسفل Down عندما يصل الى اخر كلمة فأنه يعطي

رسالة أنه انتهى البحث.

مع شكري ...

#13

لا يوجد حل

#14

لا يوجدددد حل يا شباب

#15

السلام عليكم و رحمة الله و بركاته

maayah كتب:
لا يوجدددد حل يا شباب

نعم يوجد حل .

لقد قمت باصلاح دالة البحث

و أرجو أن يكون الكود التالي يفي بالغرض :

Public Sub SearchMatchCase(ByVal Word As String, Optional ByVal Reverse As Boolean = False, Optional ByVal ContinueFromCursorPosition As Boolean = True)
		On Error Resume Next
		If Me.RichTextBox1.SelectionStart = 0 And Revpos <> -1 Then Revpos = -1
		If Reverse = False Then
			If B = False Then
				Position = InStr(Me.RichTextBox1.SelectionStart + 1, Me.RichTextBox1.Text, Word, CompareMethod.Binary)
				B = True
			Else
				Position = InStr(Me.RichTextBox1.SelectionStart + 2, Me.RichTextBox1.Text, Word, CompareMethod.Binary)
			End If
			If Position = 0 Then MsgBox("Not Find", MsgBoxStyle.Exclamation) : Exit Sub
		Else
		If B = False Then
			Position = InStrRev(Me.RichTextBox1.Text, Word, Me.RichTextBox1.SelectionStart - 1, CompareMethod.Binary)
			B = True
		Else
			Position = InStrRev(Me.RichTextBox1.Text, Word, Me.RichTextBox1.SelectionStart, CompareMethod.Binary)
		End If
			If Position = 0 Then MsgBox("Not Find", MsgBoxStyle.Exclamation) : Exit Sub
		End If
		If RichTextBox1.SelectionStart = 0 And Position = 1 AndAlso Me.RichTextBox1.SelectionLength > 0 Then MsgBox("Not Find", MsgBoxStyle.Exclamation)
			If Position >= 1 Then
				Me.RichTextBox1.SelectionStart = Position - 1
				Me.RichTextBox1.SelectionLength = Word.Length
				Me.RichTextBox1.Select()
				Me.RichTextBox1.ScrollToCaret()
				Revpos = Me.RichTextBox1.SelectionStart
			Else
				Me.RichTextBox1.Select()
				MsgBox("La chaine recherché n'exist pas dans la feuille . . !!", vbExclamation, "Resultat de recherche")
				Revpos = -1
			End If
	End Sub

;) مع خالص تحياتي ،،،

SearchAllInOne.rar

i1044214_21.JPG

هذا الموضوع مغلق.

مواضيع مشابهة