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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как поставить каретку в заданную позицию, RichTextBox/VC#.NET 
:(
    Опции темы
neutrino
Дата 23.4.2003, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Приветствую, господа!

Вот код, который я состряпал для нахождения положения каретки в RichTextBox. Конечно он оставляет желать лучшего, но тем не менее мне не удалось (не используя API) сделать его более эффективным и красивым. Может вы бы могли сделать что-то получше?

Цитата

  void CaretMoved(object sender, EventArgs e)
  {
  int Cols, Rows;
  Cols = OpenFiles[CurrentFile].ProgData.GetLineFromCharIndex(OpenFiles[CurrentFile].ProgData.SelectionStart);
  Rows = OpenFiles[CurrentFile].ProgData.SelectionStart;
  for (int I=0; I<Cols; I++)
  {
    Rows-=OpenFiles[CurrentFile].ProgData.Lines[I].Length+1;
  }
  statusBar.Panels[3].Text = "Col: " + (Cols+1).ToString();
  statusBar.Panels[4].Text = "Row: " + (Rows+1).ToString();
  }


И еще, в справке описано много методов для того, чтобы поставить каретку в нужную позицию, но наоборот - ничего.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex101
Дата 24.4.2003, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



РичТекстБокс.SelectionStart
Доступен как для чтения, так и для записи.


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
neutrino
Дата 24.4.2003, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Это ведь многострочный контрол, так можно узнать только в ЕдитБоxе.
Моя же функция работает для многострочных контролов. Ведь длина каждой строки разная...


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 24.4.2003, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Единственное - нужно поставить на обработчик OnSelectionChange. Вот код для общего случая (AntonSaburov, может стоит это положить в "записки программиста"?):
Цитата

RichTextBox MyTextBox;

void main()
{
    MyTextBox = new RichTextBox();
    MyTextBox.Parent = Form1;
    MyTextBox.Dock = DockStyle.Fill;
    MyTextBox.SelectionChanged += new EventHandler(this.CaretMoved);
}

void CaretMoved(object sender, EventArgs e)
{
    int Cols = MyTextBox.GetLineFromCharIndex(MyTextBox.SelectionStart);
    int Rows = MyTextBox.SelectionStart;
    for (int I=0; I<Cols; I++)
    {
        Rows-=MyTextBox.Lines[I].Length+1;
    }
    statusBar.Panels[0].Text = "Col: " + (Cols+1).ToString();
    statusBar.Panels[1].Text = "Row: " + (Rows+1).ToString();
  }



--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 24.4.2003, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Поищи среди этих функций:

- GetPositionFromCharIndex
- GetCharIndexFromPosition
- GetLineFromCharIndex

В принципе можно повозиться здесь. Также посмотреть свойство Lines.

А свойство SeletionStart работает на любом контроле - просто строка уезжает.

Когда что-то конкретное получится - кинь в находки. Буду крайне признателен.
PM MAIL WWW ICQ   Вверх
neutrino
Дата 24.4.2003, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Дык, я именно там и лазил и то что сверху и удалось мне написать. Все работает, я просто удивляюсь как это мелкософт не реализовала такую возможность? Столько всякого реализовала, а эту фичу - нет. Ну тогда я запостю именно этот метод, т.к. он работает 100%.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 24.4.2003, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата
Ну тогда я запостю именно этот метод, т.к. он работает 100%.


Давай исправлять - это не работает на 100%.
Попробуй вставить строку, которая будет резаться самим контролом (без нажатия на Enter). Лучше подлиннее и вызови свою функцию - упадет из-за превышения размера массива.
(Index was outside the bounds of the array)

Так что надо дорабатывать - опубликуй еще раз в находках. А я старый вариант пока помечаю, как нерабочий.

Без обид ?
PM MAIL WWW ICQ   Вверх
neutrino
Дата 24.4.2003, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Да какие обиды?
Исправлю. Это вы извиняйте, что дырявый код вам подсунул smile.gif


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex101
Дата 24.4.2003, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



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

while((RichTextBox.Lines[i++] вот тут как определить, что она есть?)&&(sum<position))
sum=sum+RichTextBox.Lines[i].Length;

Да, я пробовал находить индекс в этой строке, но в нулевой позиции GetPositionFromCharIndex, не помогает.

Это сообщение отредактировал(а) Alex101 - 24.4.2003, 16:04


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Alex101
Дата 24.4.2003, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



Да, и еще - а надо ли оно? Ведь ежели внутреннее представление отличается от визуального, то все равно работать с внутренним, а координаты можно вычислить через GetPositionFromCharIndex (чтобы нарисовать - я туда textBox помещаю).



--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
neutrino
Дата 24.4.2003, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Да, но ведь 8 точек и 8 букв 'д' имеют разную длину в пикселях, так что индекс не поможет. Я вот прямо сейчас пишу решение этой задачи, через пол часа, думаю, отлажу и закину.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex101
Дата 24.4.2003, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



GetPositionFromCharIndex возвращает как раз точки...
Единственное, что надо - это определить, существует ли строка...
Цитата
This method enables you to determine where in the control a specific character index is located.



--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
neutrino
Дата 24.4.2003, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



А надо индекс символа! Причем от начала строки, которая в Lines property.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex101
Дата 24.4.2003, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



Понятно, что индекс. я хотел взять разность индексов - искомого символа, и того символа, который самый первый - член структуры System.Drawing.Point X устанавливаю в ноль, згаченгие Y из текущего, полученного с помощью GetPositionFromCharIndex, но что-то не выходит каменный цветок...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Alex101
Дата 24.4.2003, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

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



Идея такова:
Код

pos=RichTextBox.SelectionStart;//Текущая позиция
System.Drawing.Point tpoint=RichTextBox.GetPositionFromCharIndex(pos);//Определяем, где рисуется
System.Drawing.Point spoint=tpoint; //Копируем значения
spoint.X=0;//Типа нарисовалось в начале (или 1 можно поставить)
int spos=RichTextBox.GetCharIndexFromPosition(spoint); //Получаем позицию
int pos=pos-spos;

У этого способа два глюка - когда переносим на новую строку, или когда в самом конце строки находится символ, то неправильно определяет.

Это сообщение отредактировал(а) Alex101 - 24.4.2003, 17:30


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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