Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Rich Text Box 
:(
    Опции темы
YoD
Дата 20.12.2004, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Подскажите пожалуйста, как в элементе упраления RichTextBox можно целиком выделить строчку, зная только её номер? А то метод Select требует указание начальной и конечной позиции выделения, как получить начальную и конечную позицию в текстбоксе нужной мне строки, я тоже не знаю...
PM MAIL ICQ   Вверх
-Mikle-
Дата 21.12.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Можно получить номер строки, зная номер символа.

Код

LineNum = rtf.GetLineFromCharIndex(10)


В LineNum будет записан номер строки в которой находится 10-ый символ.
rtf - это имя RichTextBox'a

Тебе это подходит?

Это сообщение отредактировал(а) -Mikle- - 23.12.2004, 20:59


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
YoD
Дата 22.12.2004, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Спасибо, почти подходит. А как теперь зная номер строки выделить её?
PM MAIL ICQ   Вверх
-Mikle-
Дата 23.12.2004, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Есть одно предложение, организовать поиск в цикле, но для больших текстов, порядка 1Мб, наверное этот метод медленно будет работать.

На скорую руку примерно так:

Код
Sub SelectLineByNumer(ByVal rtfSrc As RichTextBox, ByVal NumLine As Integer)
   Dim i, n, p1, p2 As Integer
   Dim ln As Integer = rtfSrc.TextLength
   
   p1 = ln : p2 = ln
   For i = 0 To ln
       n = rtfSrc.GetLineFromCharIndex(i)
       If n = NumLine And p1 = ln Then p1 = i
       If n > NumLine Then p2 = i : Exit For
   Next

   rtfSrc.Select(p1, p2 - p1)
   rtfSrc.Focus()
End Sub

Вызывать так: SelectLineByNumer(rtfTestBox, 0) 'Выделить первую строку

Процедура пробежит по всему тексту, узнавая номер строки каждого символа, и запомнит индекс первого символа с искомым номером строки в переменной p1, и индекс последнего символа в p2. Во избежании ошибок, например при поиске не существующей строки, перед циклом переменные p1 и p2 инициализируются, указывая на конец текста.
Это не совсем красиво, но боюсь что единственный вариант. Для большого объема текста, целесообразно будет вначале сделать пару не точных поисков номера строки, и потом выполнить написанный выше цикл начиная не с нуля, а с приблизительно найденного индекса.

В другом случае, если требуется выделить строку в которой находится символ с известным индексом(например строку, в которой находится каретка), можно воспользоваться вот этим кодом:

Код
Sub SelectLineByCharIndex(ByVal rtfSrc As RichTextBox, ByVal CharIndex As Integer)
   Dim i, n, p1, p2 As Integer
   Dim ln As Integer = rtfSrc.TextLength

   p1 = 0 : p2 = ln
   n=rtfSrc.GetLineFromCharIndex(CharIndex)
   For i = CharIndex To 0 Step -1
       If rtfSrc.GetLineFromCharIndex(i) < n Then
           p1 = i + 1
           Exit For
       End If
   Next
   For i = CharIndex To ln
       If rtfSrc.GetLineFromCharIndex(i) > n Then
           p2 = i
           Exit For
       End If
   Next

   rtfSrc.Select(p1, p2 - p1)
   rtfSrc.Focus()
End Sub


Вызвать например так: SelectLineByCharIndex(rtf, rtf.SelectionStart) 'Выделит строку в которой находится курсор

Процедура запомнит в n номер строки в которой находится символ с индексом CharIndex. Затем в первом цикле, перебирая символы от CharIndex в сторону начала, запомнит в p1 индекс первого символа строки с номером n, а во втором цикле, перебирая символы от CharIndex в сторону конца текста, запомнит в p2 индекс последнего символа. На случай если в теле одного или обоих циклов не выполнится условие, перед циклами выполняется инициализация переменных p1 = 0 и p2 = ln(ln - длина текста). Впрочем p1 и так равна нулю, но для наглядности я все же написал инициализацию для нее. И еще можно обойтись без переменной i, указав вместо нее в первом цикле p1, а во втором - p2, но опять таки для большей наглядности не стал этого делать.

Удачи! Приходи еще smile

Это сообщение отредактировал(а) -Mikle- - 23.12.2004, 23:17


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
YoD
Дата 24.12.2004, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Спасибо за за информацию. Приду ещё smile
PM MAIL ICQ   Вверх
DarkDragon
Дата 19.8.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



О да!!! такой код только на шестисотый пентиум с 80Ghz и памятью 8 гб, и 128 разрядный процессор. А можно и на папиновом серваке.smile Не обижайтесь. Только такие вещи делают через API.


Public Declare Auto Function SendMessage Lib "User32" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const EM_LINEINDEX As Short = &HBBS
Private Const EM_LINELENGTH As Short = &HC1S

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim intsl As Integer = RichTextBox1.GetLineFromCharIndex(RichTextBox1.SelectionStart)
        Dim linelen = SendMessage(RichTextBox1.Handle.ToInt32, EM_LINELENGTH, RichTextBox1.SelectionStart, 0)
        Dim linestart = SendMessage(RichTextBox1.Handle.ToInt32, EM_LINEINDEX, intsl, 0)
        RichTextBox1.Select(linestart, linelen)
    End Sub


У ричтекст бокса поставь HideSelection = Flase.
Когда нажмешь на кнопку он выделит ту линию на каторой находится каретка (не важна где, важна на какой линии).
переменная intsl = это номер строки

вот то что тебе нужно. Работает быстро и все как надо(через АПИ, шустрые прогги получаются)!!! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.