![]() |
|
Модераторы: diadiavova, gambit |
![]()
|
|
| YoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 29.11.2004 Репутация: нет Всего: нет |
Подскажите пожалуйста, как в элементе упраления RichTextBox можно целиком выделить строчку, зная только её номер? А то метод Select требует указание начальной и конечной позиции выделения, как получить начальную и конечную позицию в текстбоксе нужной мне строки, я тоже не знаю...
|
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 3 Всего: 59 |
Можно получить номер строки, зная номер символа.
В LineNum будет записан номер строки в которой находится 10-ый символ. rtf - это имя RichTextBox'a Тебе это подходит? Это сообщение отредактировал(а) -Mikle- - 23.12.2004, 20:59 -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| YoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 29.11.2004 Репутация: нет Всего: нет |
Спасибо, почти подходит. А как теперь зная номер строки выделить её?
|
|||
|
||||
| -Mikle- |
|
||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 3 Всего: 59 |
Есть одно предложение, организовать поиск в цикле, но для больших текстов, порядка 1Мб, наверное этот метод медленно будет работать.
На скорую руку примерно так:
Вызывать так: SelectLineByNumer(rtfTestBox, 0) 'Выделить первую строку Процедура пробежит по всему тексту, узнавая номер строки каждого символа, и запомнит индекс первого символа с искомым номером строки в переменной p1, и индекс последнего символа в p2. Во избежании ошибок, например при поиске не существующей строки, перед циклом переменные p1 и p2 инициализируются, указывая на конец текста. Это не совсем красиво, но боюсь что единственный вариант. Для большого объема текста, целесообразно будет вначале сделать пару не точных поисков номера строки, и потом выполнить написанный выше цикл начиная не с нуля, а с приблизительно найденного индекса. В другом случае, если требуется выделить строку в которой находится символ с известным индексом(например строку, в которой находится каретка), можно воспользоваться вот этим кодом:
Вызвать например так: SelectLineByCharIndex(rtf, rtf.SelectionStart) 'Выделит строку в которой находится курсор Процедура запомнит в n номер строки в которой находится символ с индексом CharIndex. Затем в первом цикле, перебирая символы от CharIndex в сторону начала, запомнит в p1 индекс первого символа строки с номером n, а во втором цикле, перебирая символы от CharIndex в сторону конца текста, запомнит в p2 индекс последнего символа. На случай если в теле одного или обоих циклов не выполнится условие, перед циклами выполняется инициализация переменных p1 = 0 и p2 = ln(ln - длина текста). Впрочем p1 и так равна нулю, но для наглядности я все же написал инициализацию для нее. И еще можно обойтись без переменной i, указав вместо нее в первом цикле p1, а во втором - p2, но опять таки для большей наглядности не стал этого делать. Удачи! Приходи еще Это сообщение отредактировал(а) -Mikle- - 23.12.2004, 23:17 -------------------- Если тебе плюют в спину, значит ты впереди... |
||||
|
|||||
| YoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 29.11.2004 Репутация: нет Всего: нет |
Спасибо за за информацию. Приду ещё
|
|||
|
||||
| DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: 5 Всего: 8 |
О да!!! такой код только на шестисотый пентиум с 80Ghz и памятью 8 гб, и 128 разрядный процессор. А можно и на папиновом серваке.
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 = это номер строки вот то что тебе нужно. Работает быстро и все как надо(через АПИ, шустрые прогги получаются)!!! |
|||
|
||||
![]()
|
| Правила форума VB .NET | |
|
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |