Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Позиция символа

530
08 января 2002 года
solo
21 / / 20.09.2000
Или лыжи не катят, или ... . Вопрос: Надо определить позицию в пикселах 5-го символа в TMemo, который ясно виден на экране, делаю так:
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;
...
получаю какую-то ерунду. Где я не прав???
592
08 января 2002 года
Разьярённое_x77
27 / / 20.01.2000
Можно иначе:
1. Запоминаешь позицию курсора
2. Ставишь курсор на нужно место (например, на пятый символ)
3. Опрашиваешь CaretPos
4. Возвращаешь курсор на место.
 
Изврат, конечно, но зато работать будет и для RichEdit'а (т.е. с разными шрифтами в одной строке).
530
10 января 2002 года
solo
21 / / 20.09.2000
Ответ найден, надо делать так:
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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог