![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Edit Control Messages [D6, Win2k]
Inquirer © (2003-02-10 14:17:00)Как в потомке TEditControl перехватывать события типа EM_...
(EM_SCROLLCARET, ...)?
Inquirer (2003-02-11 16:06:00) [1]GetCaretPos отрабатывает только в клиентских координатах окна :(
Inquirer (2003-02-11 15:35:00) [2]Так правильно :-)
function TMyMemo.GetCaretPos: TPoint; override;
var
Pos: LongRec;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(Result);
// получаем текущее положение каретки в координатах символа
Pos := LongRec(Perform(EM_CHARFROMPOS, 0, MakeLParam(CarPos.X, CarPos.Y)));
Result.Y := Pos.Hi + 1;
Result.X := Pos.Lo + 1 - Perform(EM_LINEINDEX, -1, 0);
end;
Inquirer (2003-02-11 15:22:00) [3]Oops, чепуха при скроллировании...
Inquirer (2003-02-11 15:14:00) [4]Кстати свойство CaretPos для TMemo при расчете координат отталкивается тоже от EM_GETSEL, поэтому при выделениии тоже не всегда возвращает корректные координаты...
Победил аналогично как для TEdit
function TMyMemo.GetCaretPos: TPoint; override;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(Result);
// получаем текущее положение каретки в координатах символа
Result.X := LongRec(Perform(EM_CHARFROMPOS,0,MakeLParam(Result.X, Result.Y))).Lo + 1;
Result.Y := LongRec(Perform(EM_CHARFROMPOS,0,MakeLParam(Result.X, Result.Y))).Hi + 1;
Result.X := Result.X - Perform(EM_LINEINDEX, -1, 0);
end;
Sha (2003-02-11 14:52:00) [5]2 Anatoly Podgoretsky © (11.02.03 13:37)
SelStart попутал. Это он все время возвращает левыекоординаты и других туда же тянет :)
Давно с этим возился. Подзабыл. Star стал :)
Anatoly Podgoretsky (2003-02-11 13:37:00) [6]Естественно реальные, поскольку Получить Позицию Каретки
Sha (2003-02-11 13:30:00) [7]2 Inquirer (11.02.03 12:51)
Действительно работает.
Получается, что GetCaretPos всегда возвращает реальныекоординаты каретки. Я почему-то считал иначе.
Inquirer (2003-02-11 12:51:00) [8]var
CarPos: TPoint;
X: integer;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(CarPos);
// получаем текущее положение каретки в координатах символа
X := Edit1.Perform(EM_CHARFROMPOS,0,MakeLParam(CarPos.X, CarPos.Y)) + 1;
end;
Sha (2003-02-11 12:38:00) [9]2 Inquirer (11.02.03 12:27)
Работающий код можно посмотреть?
Inquirer (2003-02-11 12:27:00) [10]Связка GetCaretPos(WinAPI) + EM_CHARFROMPOS сработала корректно!!
СПАСИБО ВСЕМ ЗА ПОМОЩЬ.
Sha (2003-02-11 12:02:00) [11]Проблема только в том, что GetCaretPos всегда возвращает координаты левой границы выделенной области.
Игорь Шевченко (2003-02-11 11:58:00) [12]GetCaretPos существует для любого окна, имеющего каретку.
Inquirer (2003-02-11 11:51:00) [13]>> Anatoly Podgoretsky
GetCaretPos существует опят-таки только для TMemo, но не для TEdit...
По всей видимости Sha прав...
Sha (2003-02-11 11:46:00) [14]По-моему, без запоминания предыдущего положения курсора ничего не выйдет.
Anatoly Podgoretsky (2003-02-11 11:40:00) [15]Ну тогда возможно поможет GetCaretPos
Inquirer (2003-02-11 11:38:00) [16]>> Anatoly Podgoretsky
Прошу прощения за misunderstanding,
>>Если выделять текст справа налево -> CaretPos = SelStart;
>>Если слева направо -> CaretPos = SelStart + SelLength;
под CaretPos я имел ввиду просто переменную, куда сохраняется позиция курсора в однострочном TEdit"е (не свойство CaretPos в TMemo)... А нужна мне всего-то текущая позиция мигающего знака вставки в однострочном TEdit"е, т.к. SelStart+SelLength не всегда корректен (см. выше)
>> Sha
Вы все правильно поняли, спасибо.
Sha (2003-02-11 11:29:00) [17]Похоже, он хочет знать где реальнонаходится курсор.
У TEdit нет CaretPos, у TMemo CaretPos есть, но дает не то.
Anatoly Podgoretsky (2003-02-11 11:19:00) [18]Попробуй точно объясниться, что ты хочешь, а то постоянно задаешь головоломки по разгадыванию твоиъ мыслей.
Anatoly Podgoretsky (2003-02-11 11:18:00) [19]Если ты хочешь использовать именно CaretPos то ничего мудрить не надо, оно уже показывает точную позицию в кординатах каретки
Если ты хочешь в терминах позиция символа, то EM_CHARFROMPOS
Sha (2003-02-11 11:04:00) [20]2 Inquirer (11.02.03 10:46)
Я это когда-то делал, запоминая предыдущее состояние.
Придется повозиться.