Плеяда вопросов

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Плеяда вопросов

Сообщение Роман-вб » 21.04.2006 (Пт) 13:31

1. Как поменять шрифт в RichTextBox'е. Пишу так:

Код: Выделить всё
richTxt.Font.Name = "Courier New"


-- ошибка.
2. Как установить фокус (или что писать вместо SetFocus)?
3. Что писать вместо richTxt.SelStart, .SelLength?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 21.04.2006 (Пт) 14:54

Ладно, может попробовать так.
1. rtb.Font = New Font("Terminal", rtb.Font.Size, rtb.Font.Style)
2. rtb.Focus
3. rtb.SelectionStart, rtb.SelectionLength
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 21.04.2006 (Пт) 16:06

Спасибо. И ещё такой вопрос.
Как мне перейти к началу RichTextBox'а, т.е. поставить курсор на начало? Пишу так:
Код: Выделить всё
richTxt.SelectionStart = 0
richTxt.SelectionLength = 0
,
но премещение курсора происходит только после кратковременого (секунд 5) зависания.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 21.04.2006 (Пт) 16:53

Метод перемещения курсора в начало контрола у тебя правильный, а зависет видимо по каким-то другим причинам
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 21.04.2006 (Пт) 18:12

Вот такая подпрограммка:
Код: Выделить всё
Private Sub ZarezervirSlova(ByVal richTxt As RichTextBox)
        Dim s As Integer = 1 'Объявляем переменную s для работы с числами
        Dim i As Integer
        For i = 0 To richTxt.Text.Length
            If InStr(s, richTxt.Text, "Sub") <> 0 Then 'Сверяется 2 значения
                richTxt.Focus() 'На RichTxt ставим курсор
                richTxt.SelectionStart = InStr(s, richTxt.Text, "Sub") - 1 'Устанавливаем курсор перед нужным словом
                richTxt.SelectionLength = Len("Sub")
                richTxt.SelectionColor = Color.Blue
                s = InStr(s, richTxt.Text, "Sub") + Len("Sub") ' Изменяем переменную на позицию курсора
            Else ' Если в тексте больше нет искомого слова, то переходим кверху.
                richTxt.SelectionStart = 0
                richTxt.SelectionLength = 0
            End If
        Next i
    End Sub


Может где чево криво?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 21.04.2006 (Пт) 18:21

Код: Выделить всё
InStr(s, richTxt.Text, "Sub")


Это у тебя выполняется 3 раза. стоит сделать один вызов и запомнить позицию


Код: Выделить всё
Len("Sub")


Вычисляешь длину константы - стоит вычислить один раз и присвоить значение константе (вернее переменной только для чтения)


Это все с беглого просмотра

/*И зачем тебе переменная s? Искать начинаешь всяко с 1*/ проглядел, переменная используется
Последний раз редактировалось Viper 22.04.2006 (Сб) 6:23, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 21.04.2006 (Пт) 18:36

!Viper! писал(а):
Код: Выделить всё
InStr(s, richTxt.Text, "Sub")


Это у тебя выполняется 3 раза. стоит сделать один вызов и запомнить позицию


Код: Выделить всё
Len("Sub")


Вычисляешь длину константы - стоит вычислить один раз и присвоить значение константе (вернее переменной только для чтения)


Это все с беглого просмотра

И зачем тебе переменная s? Искать начинаешь всяко с 1


Погоди, откуда 3 раза?

А длину строковой константы вычисляю так, для общего случая. Потом я переделаю.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 21.04.2006 (Пт) 18:38

Роман-вб писал(а):
Код: Выделить всё
...
If InStr(s, richTxt.Text, "Sub") <> 0
...
richTxt.SelectionStart = InStr(s, richTxt.Text, "Sub")
...
s = InStr(s, richTxt.Text, "Sub") + Len("Sub")

...


1,2,3?
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 21.04.2006 (Пт) 18:46

!Viper!
Если я правильно тебя понял, то

Код: Выделить всё
Private Sub ZarezervirSlova(ByVal richTxt As RichTextBox)
        Dim s As Integer = 1 'Объявляем переменную qw для работы с числами
        Dim i As Integer, ss As Integer
        For i = 0 To richTxt.Text.Length
            ss = InStr(s, richTxt.Text, "Sub")
            If ss <> 0 Then 'Сверяется 2 значения
                richTxt.Focus() 'На RichTxt ставим курсор
                richTxt.SelectionStart = ss - 1 'Устанавливаем курсор перед нужным словом
                richTxt.SelectionLength = Len("Sub")
                richTxt.SelectionColor = Color.Blue
                s = ss + Len("Sub") ' Изменяем переменную на позицию курсора
            Else ' Если в тексте больше нет искомого слова, то переходим кверху.
                richTxt.SelectionStart = 0
                richTxt.SelectionLength = 0
            End If
        Next i
    End Sub


Но это не помогает :(
Последний раз редактировалось Роман-вб 22.04.2006 (Сб) 9:09, всего редактировалось 1 раз.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.04.2006 (Сб) 6:22

Вопрос номер раз: а что вообще вышеуказанный код должен сделать?
Вопрос номер два: зачем все это делается в цикле от 0 до длины текста? Если надо найти все вхождения определенного слова (в данном случае Sub), то имеет смысл найти первое, и искать после него следующее вхождение. У тебя же поиск повторяется столько раз, сколько символов в тексте. Зачем?

Ну и наконец, а чем тебе не понравился метод Find имеющий место быть в контроле (классе) RichTexBox?
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 22.04.2006 (Сб) 9:08

!Viper!
1) Пока ищется подстрока в строке и перекрашивается
2) В цикле, потому что вызывается эта подпрограмма 1 раз
3) Если можешь, приведи пример более эффективного решения
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.04.2006 (Сб) 10:02

Ну вот например:

Код: Выделить всё

Private Sub OnFind(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFind.Click
        FindAndMark("Sub", rtb)
End Sub
Public Sub FindAndMark(ByVal sFind As String, ByVal rtb As RichTextBox)
        Dim nLen As Integer = sFind.Length
        Dim sText As String = rtb.Text
        Dim nLenTxt As Integer = sText.Length
        If nLen = 0 OrElse nLenTxt = 0 Then
            Return
        End If
        Dim iPos As Integer = 1
        Do
            iPos = InStr(iPos, sText, sFind)
            If iPos = 0 Then
                Return
            End If
            With rtb
            .SelectionStart = iPos - 1
            .SelectionLength = nLen
            .SelectionColor = Color.Red
            .Focus()
            End With
            iPos += nLen
        Loop
End Sub


предполагается, что у тебя есть форма с RichTextBox с именем rtb и кнопкой btnFind

З.Ы. Оно конечно надо еще проверять аргументы на Nothing
Последний раз редактировалось Viper 22.04.2006 (Сб) 10:13, всего редактировалось 2 раз(а).
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.04.2006 (Сб) 10:07

Роман-вб писал(а):2) В цикле, потому что вызывается эта подпрограмма 1 раз


и какая связь использования цикла с тем фактом, что подпрограмма вызывается один раз? Все что внутри цикла будет вызываться столько раз сколько у тебя символов в тексте. Причем независимо от количества вхождений искомого слова
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 22.04.2006 (Сб) 11:03

!Viper!
Спасибо за пример! Это как раз то что мне нужно. Теперь не виснет.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 22.04.2006 (Сб) 16:38

!Viper!
А как сделать, чтобы находились только такие подстроки, каоторые являются отдельным словом и не входят в состав другого слова?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 22.04.2006 (Сб) 21:19

Задался вопросом, как искать несколько слов. Стал юзать ParamArray:
Код: Выделить всё
Public Sub FindAndMark(ByVal rtb As RichTextBox, ByVal ParamArray sFind() As String)
        Dim nLen As Integer = sFind.Length
        Dim nLenTxt As Integer = rtb.Text.Length
        If nLen = 0 OrElse nLenTxt = 0 Then
            Return
        End If
        Dim iPos As Integer = 1
        Do
            iPos = InStr(iPos, rtb.Text, sFind(7))
            If iPos = 0 Then
                Return
            End If
            rtb.SelectionStart = iPos - 1
            rtb.SelectionLength = nLen
            rtb.SelectionColor = Color.Blue
            iPos += nLen
        Loop
    End Sub


Но ничего хорошего из этого не получилось. Что посоветуете?
P.S. Конечно можно отдельно для каждого слова вызывать эту подпрограмму, но хотелось бы услышать про ParamArray
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 24.04.2006 (Пн) 8:32

Код: Выделить всё
Imports System.Text.RegularExpressions

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Rgx As New Regex("\w+", RegexOptions.Multiline)

        If Rgx.IsMatch(Rtb.Text) Then

            'Перебор всех слов
            For Each M As Match In Rgx.Matches(Rtb.Text)
                Rtb.SelectionBackColor = Rtb.BackColor
                Rtb.SelectionStart = M.Index
                Rtb.SelectionLength = M.Length
                Rtb.SelectionBackColor = Color.Blue

                Application.DoEvents()
                Threading.Thread.Sleep(1000)
            Next

        End If
    End Sub
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 11:12

Роман-вб писал(а):!Viper!
А как сделать, чтобы находились только такие подстроки, каоторые являются отдельным словом и не входят в состав другого слова?


думай в сторону RichTextBox.Find
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 15:02

Nord777
Что это делает? :roll:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 17:07

Интересно было бы ещё услышать про ParamArray
Если кто знает. :?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 17:12

а в чем трабла то с ParamArray?
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 17:15

!Viper!
Посмотри топик выше, я писал раньше. Что-то я делаю не так. А вот что?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 17:20

А что не так делает код в топике? А есть ли в массиве полученном через ParamArray элемент с нумером 7?
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 17:24

!Viper!
Да, есть. Но с семёркой -- это не выход. Мне нужно, чтобы все слова, которые чя буду передавать при вызове, перекрасились. И как это сделать?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 17:29

Используй либо

Код: Выделить всё

Dim s As String
For Each s in sFind
...
Next


либо

Код: Выделить всё

Dim i As Integer
For i = 0 To sFind.Length - 1
...
Next


А внутри реализовывай поиск и перекраску... Вряд ли есть способ сделать поиск и перекраску сразу же для всего набора слов...
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 17:44

Вот вызов
Код: Выделить всё
Call FindAndMark(richTxt, "Sub", "Function", "Private", "Public")

Вот процедура:
Код: Выделить всё
Public Sub FindAndMark(ByVal rtb As RichTextBox, ByVal ParamArray sFind() As String)
        Dim nLen As Integer = sFind.Length
        Dim nLenTxt As Integer = rtb.Text.Length
        If nLen = 0 OrElse nLenTxt = 0 Then
            Return
        End If
        Dim iPos As Integer = 1
        Do
            iPos = InStr(iPos, rtb.Text, sFind())
            If iPos = 0 Then
                Return
            End If
            rtb.SelectionStart = iPos - 1
            rtb.SelectionLength = nLen
            rtb.SelectionColor = Color.Blue
            iPos += nLen
        Loop
    End Sub
И куда вставлять этот цикл? :?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 18:07

Как то так
Код: Выделить всё

Public Sub FindAndMark(ByVal rtb As RichTextBox, ByVal ParamArray sFind() As String)
        Dim nLenTxt As Integer = rtb.Text.Length
        If nLenTxt = 0 Then
            Return
        End If
        Dim s As String
        For Each s In sFind
             Dim nLen As Integer = s.Length
             If nLen > 0 Then
                  Dim iPos As Integer = 1
                  Do
                     iPos = InStr(iPos, rtb.Text, s)
                     If iPos <> 0 Then
                          rtb.SelectionStart = iPos - 1
                          rtb.SelectionLength = nLen
                          rtb.SelectionColor = Color.Blue
                          iPos += nLen
                     End If
                 Loop
             End If
        Next
    End Sub
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 18:11

!Viper!
При твоём коде и при таком вызове
Код: Выделить всё
Call FindAndMark(richTxt, "Sub", "Function", "Private", "Public")
Красится только "Sub"...
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.04.2006 (Пн) 18:37

Попробуй пройти пошагово, мож где что странное обнаружишь... Я сам это не запускал, ибо сижу за компом без VB, а поскольку человеку свойственно оштибаться... Хотя на первый взгляд должно работать
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 24.04.2006 (Пн) 18:43

Жму как дурак на К8. Зачем они кнопку поменяли традиционную :roll:
:lol:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54

    TopList