Получить номер строки из каретки

Я пытаюсь получить номер строки из позиции каретки в текстовом поле, вот что у меня есть:

int Editor::GetLineFromCaret(const std::wstring &text)
{
unsigned int lineCount = 1;

for(unsigned int i = 0; i <= m_editWindow->SelectionStart; ++i)
{
if(text[i] == '\n')
{
++lineCount;
}
}

return lineCount;
}

Но я получаю некоторые странные ошибки. Например, если у меня есть 10 строк текста в текстовом поле и я использую эту функцию, это не даст мне правильный номер строки, если только каретка не содержит около 10 символов в строке, а в некоторых строках не будет символов, поэтому она будет неправильной.

Вот как я решил проблему с помощью Дамира Арха:

int Editor::GetLineFromCaret(const std::wstring &text)
{
unsigned int lineCount = 1;
unsigned int selectionStart = m_editWindow->SelectionStart;

for(unsigned int i = 0; i <= selectionStart; ++i)
{
if(text[i] == '\n')
{
++lineCount;
++selectionStart;
}
}

return lineCount;
}

0

Решение

Ваш расчет не работает, потому что новая строка занимает два символа в строке (\r\n) но SelectionStart Значение считает новую строку только как один символ. В результате после каждой новой строки у вас отключается 1 символ, то есть вам нужно переместить еще один символ в строку, прежде чем вы обнаружите правильную строку.

Чтобы исправить расчет нужно взять \r символы в счет:

int Editor::GetLineFromCaret(const std::wstring &text)
{
unsigned int lineCount = 1;
unsigned int selectionStart = m_editWindow->SelectionStart;

for(unsigned int i = 0; i <= m_editWindow->SelectionStart; ++i)
{
if(text[i] == '\n')
{
++lineCount;
}
if(text[i] == '\r')
{
++selectionStart;
}
}

return lineCount;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]