Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Edit Control Messages [D6, Win2k]


Страницы:   1 2

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)

Я это когда-то делал, запоминая предыдущее состояние.
Придется повозиться.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо