Use SynEdit instead?
It doesn' habve line wrapping, which for a terminal should be correct.
synEdit has
CaretX: integer
CaretY: integer
CaretXY :Point
properties, which can be read and written
It also has
LogicalCaretX, LogicalCaretY, LogicalCaretXY
Where the x position, is the 1 based byte index into the string for the line. This differs because some chars (utf8) take 2 or more byte.
aä1
The ä has 2 bytes: so the Caret can go to pos 1, 2, 3 or 4 (behind the "1"
The LogicalCaret will be 1, 2, 4, or 5
SynEdit also has
TextBetweenPoints[p1, p2] to read/write text.
and you can set the shape of the caret or insert and overwrite mode. (vert-line, underline, block, halfblock)