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

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

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

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

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

Какой-то бред. s постоянно равно "Sub". Я в полном непонимании...



P.S. Отладка результатов не дала :(((
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение Nord777 » 24.04.2006 (Пн) 22:33

Что это делает?

А разобраться не пытался?
Тебе не кажется что программу пишешь не ты, а участники форума?

Вот "разжеванный" вариан:
Код: Выделить всё
Imports System.Text.RegularExpressions

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FindAndMark(Rtb, "Private", "Public", "Sub", "End")
    End Sub

    Public Sub FindAndMark(ByVal rtb As RichTextBox, ByVal ParamArray sFind() As String)
        Dim Rgx As Regex
        If (sFind Is Nothing) Or (rtb.TextLength = 0) Then Return

        Dim RegexPattern As String = "("
        For Each s As String In sFind
            RegexPattern &= s & "|"
        Next
        RegexPattern &= ")"

        Rgx = New Regex(RegexPattern, RegexOptions.Multiline Or RegexOptions.IgnoreCase)
        For Each M As Match In Rgx.Matches(rtb.Text)
            rtb.SelectionStart = M.Index
            rtb.SelectionLength = M.Length
            rtb.SelectionColor = Color.Blue
        Next
    End Sub

End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Сообщение Nord777 » 25.04.2006 (Вт) 8:05

И кстати, почему ты так вцепился в ParamArray?
В VB .Net 171 ключевое слово...
Прикольно же будет выглядеть прцедура FindAndMark со всеми ключевыми словами. Экрана на два? :wink:
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Сообщение Роман-вб » 25.04.2006 (Вт) 15:18

Nord777
Прикольно же будет выглядеть прцедура FindAndMark со всеми ключевыми словами

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

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

Сообщение Роман-вб » 25.04.2006 (Вт) 15:24

Nord777
Вот попробовал -- виснет не по детски.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 25.04.2006 (Вт) 15:36

Роман-вб писал(а):Жму как дурак на К8. Зачем они кнопку поменяли традиционную :roll:
:lol:


поменяли на что :?:

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

Сообщение Роман-вб » 25.04.2006 (Вт) 15:40

Dmitriy Solomnikov
На F11
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение Nord777 » 25.04.2006 (Вт) 21:45

Вот попробовал -- виснет не по детски.

А никто и не обещал тебе шоколадных гор :D
Код работает? - работает.
А быстродействие это понятие растяжимое, все зависит от твоего компа и поставленной задачи. У меня например перекрашивается влет. А вообще регулярные выражения - это удобство, но не быстродействие.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Сообщение Роман-вб » 25.04.2006 (Вт) 22:24

У меня например перекрашивается влет

Хм... Какой же у тебя комп? (у меня в тексте порядка 4 тыс. строк.)
В любом случае, если использовать это:
Код: Выделить всё
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

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

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

Сообщение Nord777 » 26.04.2006 (Ср) 22:27

Вышеизложенный кусок кода я написал в качестве примера и ни о какой оптимизации по скорости не думал. Ты сколько мучался с этой процедурой? А я набросал за 5 мин. ни капли не напрягаясь.
В качестве примера - замер производительности в двух вариантах:
Код: Выделить всё
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 StartTime As DateTime

        'Замер производительности №1
        StartTime = Now
        FindAndMark(Rtb, "Public")
        FindAndMark(Rtb, "Private")
        MsgBox((Now - StartTime).TotalMilliseconds.ToString)

        'Замер производительности №2
        StartTime = Now
        FindAndMarkWithRegex(Rtb, "Public")
        FindAndMarkWithRegex(Rtb, "Private")
        MsgBox((Now - StartTime).TotalMilliseconds.ToString)

    End Sub


    Public Sub FindAndMarkWithRegex(ByVal rtb As RichTextBox, ByVal sFind As String)
        Dim M As Match
        Dim MC As MatchCollection = Regex.Matches(rtb.Text, sFind, RegexOptions.IgnoreCase)

        With rtb
            For Each M In MC
                .SelectionStart = M.Index
                .SelectionLength = M.Length
                .SelectionColor = Color.Blue
            Next
        End With

    End Sub

    Public Sub FindAndMark(ByVal rtb As RichTextBox, ByVal sFind As String)
        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, CompareMethod.Text)
            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

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim FS As New IO.StreamReader("Текстовый документ.txt")
        Rtb.Text = FS.ReadToEnd
        MsgBox(Rtb.Lines.Length)
    End Sub
End Class


Вывод №1: оба варианта показывают одинаковое быстродействие
Вывод №2: оба варианта не обладают достаточным быстродействием для поставленной тобой задачи.
Так что ищи друой алгоритм :D

ЗЫ: И не забывай периодически посылать команду
СероеВещество.Update, а то от Copy/Paste может гастрит разыграться :lol: Удачи тебе амиго в этом нелегком труде.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Сообщение Nord777 » 26.04.2006 (Ср) 23:53

Написал специально для тебя универсальную процедуру, втавляй её везде где только можно:
Код: Выделить всё
    Public Sub ХочуВсёЗнать()
        Dim Doc As New IO.StreamReader("MSDN")
        Мозги.Text = Doc.ReadToEnd
        Мозги.Update
    End Sub


С тебя бутылка пива :D
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Вопрос

Сообщение dmitriy22 » 27.04.2006 (Чт) 12:10

Хотелось бы спросить может кто знает???
Я относительно недавно начал писать на vb.net и у меня возник вопрос???
Как сделать к примеру, чтобы при нажатии на кнопку 1 она просматривала была ли нажата кнопка 2 или кнопка 3 и в соответствии с этим выполнял процедуру либо 2, либо 3 ???
Я не волшебник, я просто учусь.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 27.04.2006 (Чт) 12:22

при нажатии на кнопки 2 и 3 устанавливать значение каких-то переменных (booloean) = true
а затем проверять

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Сообщение dmitriy22 » 27.04.2006 (Чт) 12:45

большое спасибо за быстрый ответ....я правда еще так не попробывал, но думаю получится.....
Я вот это реализовал с помощью sender я думаю это тоже корректно, т.е. при нажатии кнопки 2 sender присваивает значение адреса 2 и вызывает процедуру относящейся к ней.... 8)
Я не волшебник, я просто учусь.

Пред.

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

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

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

    TopList  
cron