Du hast bei der Positionsberechnung die Zeilenumbruchszeichen vergessen.
Bei Delphi und Windows hätte ich einfach EM_LINEINDEX vorgeschlagen, aber inwiefern das für Lazarus sinnvoll ist, weiß ich nicht:
http://msdn.microsoft.com/en-us/libr.../bb761611.aspx
Damit kannst du direkt das erste Zeichen einer Zeile ermitteln bzw. mit EM_LINEFROMCHAR umgekehrt.