Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Сравнение текста в 2 полях

Автор: Fil75
Дата сообщения: 05.01.2006 20:29
Приветствую!
Очень интересно, возможно ли в VB сделать проверку текста на основе имеющегося. Напимер ребенок вводит слово в текстовое поле. Потом это поле сравнивается с другим полем (образец). Это естественно все ясно. Но вот надо сделать так чтобы ошибку в слове, неправильную букву, можно было или выделить красным цветом или подчеркнуть, т.е. как то выделить в том поле, куда ребенок вводит текст.

Помогите, можно ли так сделать?
Автор: dneprcomp
Дата сообщения: 06.01.2006 01:57
Fil75
В каком VB? Вообще, надо использовать компоненты-контролы с поддежкой rtf формата(как минимум). Тогда можно будет форматировать техт по-буквенно. В VB6 это RichTextBox. Смотри проперти начинающиеся с sel
Автор: Fil75
Дата сообщения: 07.01.2006 22:15
Да это по VB6. Я вот нашел как найти слово или букву в Rich TextBox :

Private Sub Command1_Click()
Dim lWhere, lPos As Long
Dim sTmp, sSearch As String

lPos = 1
'Задаем слово для поиска
sSearch = "А"
'ищем
Do While lPos < Len(Me.RichTextBox1.Text)
sTmp = Mid(Me.RichTextBox1.Text, lPos, Len(Me.RichTextBox1.Text))
lWhere = InStr(sTmp, sSearch)
lPos = lPos + lWhere

If lWhere Then 'если нашли
Me.RichTextBox1.SelStart = lPos - 2 'установить начало выделения
Me.RichTextBox1.SelLength = Len(sSearch) 'установить длину выделения
Me.RichTextBox1.SelColor = RGB(255, 0, 0) 'изменить цвет выделения на красный
Else
Exit Do
End If
Loop
End Sub

Надо как то теперь слова побуквенно сравнить и если не соответствие, то выделить букву красным цветом
Автор: dneprcomp
Дата сообщения: 09.01.2006 04:19
Fil75
А в чем вопрос? Что непонятно? Сравниваем по-буквенно то что в контроле и то что в переменной.
Что то мне этот цикл Do While не нравится. По моему, он вообще работать не будет. Сделаем немного по другому

Dim lWhere, lPos As Long
Dim sTmp, sSearch As String
Dim HowLong as Long

sTmp = RichTextBox1.Text
HowLong = Len(sTmp)
lPos = 1
sSearch = проверочное правильное слово
следующий if важен, если мы сравниваем слова
If HowLong <> Len(sSearch) Then
Exit Sub
end if

Do While lPos <= HowLong
if Mid(sTmp, lPos, 1) <> Mid(sSearch, lPos, 1) Then
RichTextBox1.SelStart = lPos-1
RichTextBox1.SelLength = 1
RichTextBox1.SelColor = RGB(255, 0, 0)
end if
lPos = lPos + 1
Loop
Автор: Troitsky
Дата сообщения: 09.01.2006 11:28
dneprcomp

Цитата:
Do While lPos <= HowLong
if Mid(sTmp, lPos, 1) <> Mid(sSearch, lPos, 1) Then
RichTextBox1.SelStart = lPos-1
RichTextBox1.SelLength = 1
RichTextBox1.SelColor = RGB(255, 0, 0)
end if
lPos = lPos + 1
Loop


Если такая проверка проводится непосредственно при вводе текста (по соответствующему событию), то кода будет побольше: нужно предусмотреть и возможность того, что пользователь поправиться захочет и следовательно изменение цвета верно записанных букв (в черный) тоже нужно.
Да и снятие выделения с последней расцвеченной буквы по окончанию цикла тоже будет не лишним:
RichTextBox1.SelStart = HowLong

Добавлено:

Цитата:
Dim lWhere, lPos As Long
Dim sTmp, sSearch As String
Dim HowLong as Long


И, на всякий случай
Цитата:
Многие разработчики, особенно программировавшие на других языках, пытаются объявлять несколько переменных в одной строке...
В Visual Basic определение типа данных в объявлении относится только к первой следующей перед ним переменной. Всем остальным переменным присваивается тип по умолчанию, то есть Variant...

Я понимаю, что это происходит непроизвольно (сам грешен), но лучше вовремя поправиться, чтобы в дальнейшем избежать путанницы
Автор: dneprcomp
Дата сообщения: 09.01.2006 20:01
Troitsky
Логику позже можно накрутить какую угодно. Пусть сам думает Кстати, по ТЗ проверка в конце и всего сразу.
Цитата:
Напимер ребенок вводит слово в текстовое поле. Потом это поле сравнивается с другим полем (образец).
Так что не вводите новых сущностей А переменные объявлять надо корректно, согласен. Вот там где мои новые добавлены, там правильно. А там где в несколько в строку, это скопированные из предыдущего поста. А вообще, ты прав. Пусть учится правильно писать. Я бы и тип использовал бы intreger, а не long. Но может быть ну очень длинные техты надо сравнивать?

Добавлено:

Цитата:
Да и снятие выделения с последней расцвеченной буквы по окончанию цикла тоже будет не лишним:
RichTextBox1.SelStart = HowLong

А вот этого не понял. Если буква правильная, то снимать нечего. А если нет, то тем более.
Автор: Troitsky
Дата сообщения: 09.01.2006 21:56
dneprcomp

Цитата:
А вот этого не понял. Если буква правильная, то снимать нечего. А если нет, то тем более.

Просто в случае неправильной буквы после выполнения этого кода
Код: RichTextBox1.SelStart = lPos-1
RichTextBox1.SelLength = 1
RichTextBox1.SelColor = RGB(255, 0, 0)
Автор: Fil75
Дата сообщения: 09.01.2006 22:13
Спасибо за помощь! Щас попробую этот код!
Я тут пробовал 2 слова побуквенно сравнивать. Кинул 2 текстовых поля на форму - сравнивает нормально. А вот RichTextBox - ерунду мне выдает. Свойства некоторые в RichTextBox пробовал отключать, все равно фигня вышла!

Private Sub Command1_Click()
If T1.Text = T2.Text Then Exit Sub ' если слова равны то вылетаем

Dim i As Integer
Dim ii As Integer
Dim m As String
Dim m2 As String


ii = Len(T1.Text)

For i = 1 To ii Step 1

m = Mid(T1, i, 1)
m1 = Mid(T2, i, 1)

If m <> m1 Then
'например можно мессагебокс или
' или label1.Caption ="Ошибка"
End if

Next i

T1 and T2 - это текстовые поля или RichTextBoxы


End Sub

Добавлено:
Спасибо, код работает. На свой последний вопрос сам и отвечаю. Если через переменные работать как в предыдущем, любезно представленном примере то все работает, а я напрямую через контрол делал т.е на прямую с RichTexBox.Text юзал. Если присвоить переменной значение RichTexBox.Text - то все окей.
Автор: dneprcomp
Дата сообщения: 09.01.2006 22:45
Troitsky
Правильно подметил, нужно снимать выделение. Я ведь код без проверки на экране писал
Fil75
Ты бы все же писал, как проявляется ошибка

Цитата:
m = Mid(T1.Text, i, 1)
m1 = Mid(.Text, i, 1)



Добавлено:
А что бедная програма должна делать, если длина слов разная?
Автор: Fil75
Дата сообщения: 11.01.2006 00:39


Ошибка такая получалась. Если делать побуквенную проверку в свойстве Text. проще говоря в контроле , то у RichTextBox получалась просто гиганская длина len(RichTextBox.Text) - за сотню количество символов переваливало. Хотя я вносил для теста слово из 7-8 букв. А когда через переменную - то длина текста правильная получалась.

Добавлено:
А что бедная програма должна делать, если длина слов разная?

Между прочим удобно - окрашивается часть слова или все слово. Например если сделать программку тест для ребенка вводить иностранные слова. ввел другое слово - оно покраснело. Мне это и надо. И буквы краснеют и часть слова.

Спасибо за помощь

Страницы: 1

Предыдущая тема: Загрузка изображений в Делфи


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.