2012-12-30 70 views
0

我试图让一个文本框从插入记号位置的行号,这里是我有:获取行号从插入符号

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个字符,并且某些行将没有字符,因此它将不正确。

这是我如何解决这个问题有帮助,从达米尔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个字符关闭,即您需要将一个字符进一步移动到行中,然后才能检测到正确的行。通过一个

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字符考虑计算。我会将你的答案标记为正确的,因为你帮助我找出问题所在。我不必考虑'\ r'。我用答案更新了我的问题。 –