Как получить «настоящий» номер текущей строки в TMemo?

Дальше немного текста, чтобы объяснить, что именно мне надо.

Как получить видимый номер строки, я знаю:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .delphi.geshi_code {font-family:monospace;} .delphi.geshi_code .imp {font-weight: bold; color: red;} .delphi.geshi_code .kw1 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw2 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw3 {color: #000066;} .delphi.geshi_code .kw4 {color: #000066; font-weight: bold;} .delphi.geshi_code .co1 {color: #808080; font-style: italic;} .delphi.geshi_code .co2 {color: #008000; font-style: italic;} .delphi.geshi_code .coMULTI {color: #808080; font-style: italic;} .delphi.geshi_code .es0 {color: #ff0000; font-weight: bold;} .delphi.geshi_code .br0 {color: #000066;} .delphi.geshi_code .sy0 {color: #000066;} .delphi.geshi_code .sy1 {color: #000066;} .delphi.geshi_code .sy2 {color: #000066;} .delphi.geshi_code .sy3 {color: #000066;} .delphi.geshi_code .st0 {color: #ff0000;} .delphi.geshi_code .nu0 {color: #0000ff;} .delphi.geshi_code .me1 {color: #006600;} .delphi.geshi_code .re0 {color: #9ac;} .delphi.geshi_code .re1 {color: #ff0000;} .delphi.geshi_code span.xtra { display:block; }

LineNumber := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, -1, 0);
 


Под "настоящим" номером строки я понимаю номер строке в тексте самом по себе, без привязки к размерам мемо. Например, загружаем из текстового файла такой текст:

1 строка: 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
2 строка: гыгыгы гыгыгы
3 строка: abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef

Представим, что ширина TMemo примерно такая:

/====================================/
 


Тогда загруженный текст будет отображаться как-то так:

/====================================/
/123456789 123456789 123456789
/123456789 123456789 123456789
/123456789 123456789 [КУРСОР]
/гыгыгы гыгыгы
/abcdef abcdef abcdef abcdef abcdef
/abcdef abcdef abcdef abcdef abcdef
/abcdef
/====================================/
 


В данной ситуации (ставим курсор в позицию [КУРСОР] ) мы получим LineNumber = 2, то есть номер строки в текущем визуальном контексте. И этот номер может меняться при изменении ширины мемо, ведь "настоящая" строка может как вместиться целиком на одну строку мемо, так и быть разбитой по словам на несколько строк. Мне же нужно получить изначальный номер строки, то есть в данном случае 0. Если обобщить этот пример, то вместо таких номеров строк:

/====================================/
/123456789 123456789 123456789       / 0  
/123456789 123456789 123456789       / 1
/123456789 123456789                 / 2
/гыгыгы гыгыгы                       / 3
/abcdef abcdef abcdef abcdef abcdef  / 4
/abcdef abcdef abcdef abcdef abcdef  / 5
/abcdef                              / 6
/====================================/
 


мне нужно получать такие:

/====================================/
/123456789 123456789 123456789       / 0  
/123456789 123456789 123456789       / 0
/123456789 123456789                 / 0
/гыгыгы гыгыгы                       / 1
/abcdef abcdef abcdef abcdef abcdef  / 2
/abcdef abcdef abcdef abcdef abcdef  / 2
/abcdef                              / 2
/====================================/
 


Что интересно, сам TMemo прекрасно знает, где какая строка на самом деле, ведь при сохранении в файл через TMemo.Lines.SaveToFile строки сохраняются как положено, а не по их видимому разбиению в TMemo, а свойство TMemo.Text также дает текст с нормальными разбиениями на строки.

Теперь, думаю, задача предельно ясна. Какие будут идеи?

1 ответов


Как вариант, попробуйте посчитать кол-во #13 в тексте до нужной позиции. Это и будет реальный номер строки.
Еще можно создать обьект TStringList, перегрузить в него текст из TMemo и через него.
Или, на момент получения номера строки отключать Memo.WordWrap


Люди кончайте извращаться, загуглил за 5 секунд.....

LineNo := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, -1, 0);Или
LineNo := Memo1.Perform(EM_LINEFROMCHAR, -1, 0);

На МСДН ещё пишут :

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761609%28v=vs.85%29.aspx

3й параметр :
Если -1 тогда считает от позиции каретки, если цифра от 0 до X то от позиции буквы