Позиция символа
var
Point:^TPoint;
...
try
New(Point);
Memo1.Perform( EM_POSFROMCHAR, Integer(Point), 5);
Label1.Caption:='X='+IntToStr(Point^.x)+'; Y='+IntToStr(Point^.y)+';';
finally
Dispose(Point);
end;
...
получаю какую-то ерунду. Где я не прав???
1. Запоминаешь позицию курсора
2. Ставишь курсор на нужно место (например, на пятый символ)
3. Опрашиваешь CaretPos
4. Возвращаешь курсор на место.
Изврат, конечно, но зато работать будет и для RichEdit'а (т.е. с разными шрифтами в одной строке).
var
pos:DWord;
begin
pos:=Memo1.Perform( EM_POSFROMCHAR,WPARAM(5),0);
Label1.Caption:='X='+IntToStr(LoWord(pos))+'; Y='+IntToStr(HiWord(pos))+';';
end;
Но этот ответ порождает другой вопрос: у меня в SDK(которое шло вместе с Delphi 5) написано так:
*************************************************
An application sends the EM_POSFROMCHAR message to retrieve the coordinates of the specified character in an edit control.
EM_POSFROMCHAR
wParam = (LPPOINT) lpPoint; // address of structure
// receiving character position
lParam = (LPARAM) wCharIndex; // zero-based index of character
Parameters
lpPoint
Value of wParam. Address of a POINT structure that receives the coordinates of the specified character. The coordinates in the structure locate the upper-left corner of the character. If the wCharIndex is greater than the index of the last character in the control, the returned coordinates are of the position just past the last character of the control. The coordinates are relative to the upper-left corner of the edit control's client area.
wCharIndex
Value of lParam. Specifies the zero-based index of the character.
Return Value
This message does not return a value.
Remarks
For a single-line edit control, the y-coordinate is always zero. A returned coordinate can be negative if the character has been scrolled outside the edit control's client area. The coordinates are truncated to integer values.
**********************
а у людей вот так:
*****************************
EM_POSFROMCHAR
wParam = (WPARAM)wCharIndex; // zero-based index of character
lParam = 0; // not used, must be zero
An application sends the EM_POSFROMCHAR message to retrieve the coordinates of the specified character in an edit control.
Parameters
wCharIndex
Value of wParam. Specifies the zero-based index of the character.
Return Value
The return value specifies the coordinates of the upper-left corner of the character. If wCharIndex is greater than the index of the last character in the control, the return value specifies the coordinates of the position just past the last character in the control. The x-coordinate is in the low-order word and the y-coordinate is in the high-order word. The coordinates are relative to the upper-left corner of the edit control's client area.
************************************
В чем дело? Может кто объяснит. Интересно же.
Canvas.TextExtent(Memo1.Text[NumStr][5]).cx
Выдаёт ширину в пикселях 5-го символа в строке с номером NumStr. Соответственно надо делать проверку, что такая строка не пуста, что в ней есть 5-й символ. И чтобы узнать количество пикселей от левого края экрана надо посчитать Form1.Left+Memo1.Left+[То, на чём лежит Memo1].Left.