2012-12-30 4 views
0

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

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 символов в строке, а некоторые строки не будут содержать символов, поэтому они будут неверными.

Это, как я решил эту проблему с помощью от Damir Arh:

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; 
} 

ответ

2

Вашего расчет не работает, потому что новая строка занимает два символа в строке (\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; 
} 
+0

Ваш LineCount выключен один, когда я возвращаюсь к предыдущей строке. Я отвечу правильно, потому что вы помогли мне разобраться, в чем проблема. Мне не пришлось принимать во внимание «\ r». Я обновил свой вопрос с ответом. –

Смежные вопросы