Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

Edit Control Messages   Найти похожие ветки 

 
Inquirer   (2003-02-10 14:17) [0]

Как в потомке TEditControl перехватывать события типа EM_...
(EM_SCROLLCARET, ...)?


 
Inquirer   (2003-02-10 14:20) [1]

Конструкция типа
procedure EMScrollcaret(var Message: TMessage); message EM_SCROLLCARET;
не отлавливает...


 
Игорь Шевченко ©   (2003-02-10 14:47) [2]

WndProc ?


 
Inquirer   (2003-02-10 15:38) [3]

Через WndProc проходят Window messages (типа WM_...), а Edit Control messages (EM_...) похоже туда и не забредают...


 
gsu ©   (2003-02-10 15:51) [4]

а я думал, что WndProc обрабатывает все и вся по окну

typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;


 
Inquirer   (2003-02-10 15:59) [5]

Почему WM_VSCROLL отлавливается, а EM_SCROLL нет?

EM_SCROLL - Scrolls the text vertically in a multiline edit control. This message is equivalent to sending a WM_VSCROLL message to the edit control. It is not processed by single-line edit controls.


 
MBo ©   (2003-02-10 16:05) [6]

by single-line edit controls


 
Inquirer   (2003-02-10 16:08) [7]

именно что для multiline edit control EM_SCROLL и не отлавливается (с WM_VSCROLL все нормально) ...


 
Игорь Шевченко ©   (2003-02-10 16:21) [8]

Через WndProc приходит все, что обрабатывает окно конкретного класса.


 
Inquirer   (2003-02-10 16:36) [9]

ОК, я погорячился, через WndProc действительно все проходит (если послать message напрямую Edit.Perform(EM_SCROLLCARET,0,0), то перехат есть).
Перефразирую вопрос почему, когда я перемещаю курсор в Edit не передается EM_SCROLLCARET?


 
Игорь Шевченко ©   (2003-02-10 16:44) [10]

An application sends an EM_SCROLLCARET message to scroll the caret into view in an edit control.

Понятно ? Это ты его должен посылать, а не он тебе.


 
Inquirer   (2003-02-10 17:08) [11]

Весь сыр-бор из-за того, что я хотел отловить момент перемещения курсора в Edit"е одним действием (вместо использования двух событий OnKeyDown и OnClick)...
Спасибо всем за соучастие :-)


 
Inquirer   (2003-02-10 17:12) [12]

... чтобы отобразить в статус-строке текущие координаты курсора в Edit"е...


 
Inquirer   (2003-02-10 18:43) [13]

Кстати, а как определить текущую позицию курсора в TEdit кроме как c помощью SelStart?


 
Sha ©   (2003-02-11 10:20) [14]

SelStart+SelLength :)


 
Anatoly Podgoretsky ©   (2003-02-11 10:35) [15]

Inquirer (10.02.03 18:43)
А зачем еще что то изобретать, SelStart штатное средство, в комбинации с SelLength


 
Inquirer   (2003-02-11 10:46) [16]

Если выделять текст справа налево -> CaretPos = SelStart;
Если слева направо -> CaretPos = SelStart + SelLength;
как отследить какое выражение использовать? :-)


 
Sha ©   (2003-02-11 11:04) [17]

2 Inquirer (11.02.03 10:46)

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


 
Anatoly Podgoretsky ©   (2003-02-11 11:18) [18]

Если ты хочешь использовать именно CaretPos то ничего мудрить не надо, оно уже показывает точную позицию в кординатах каретки
Если ты хочешь в терминах позиция символа, то EM_CHARFROMPOS


 
Anatoly Podgoretsky ©   (2003-02-11 11:19) [19]

Попробуй точно объясниться, что ты хочешь, а то постоянно задаешь головоломки по разгадыванию твоиъ мыслей.


 
Sha ©   (2003-02-11 11:29) [20]

Похоже, он хочет знать где реально находится курсор.
У TEdit нет CaretPos, у TMemo CaretPos есть, но дает не то.


 
Inquirer   (2003-02-11 11:38) [21]

>> Anatoly Podgoretsky
Прошу прощения за misunderstanding,
>>Если выделять текст справа налево -> CaretPos = SelStart;
>>Если слева направо -> CaretPos = SelStart + SelLength;
под CaretPos я имел ввиду просто переменную, куда сохраняется позиция курсора в однострочном TEdit"е (не свойство CaretPos в TMemo)... А нужна мне всего-то текущая позиция мигающего знака вставки в однострочном TEdit"е, т.к. SelStart+SelLength не всегда корректен (см. выше)

>> Sha
Вы все правильно поняли, спасибо.


 
Anatoly Podgoretsky ©   (2003-02-11 11:40) [22]

Ну тогда возможно поможет GetCaretPos


 
Sha ©   (2003-02-11 11:46) [23]

По-моему, без запоминания предыдущего положения курсора ничего не выйдет.


 
Inquirer   (2003-02-11 11:51) [24]

>> Anatoly Podgoretsky
GetCaretPos существует опят-таки только для TMemo, но не для TEdit...

По всей видимости Sha прав...


 
Игорь Шевченко ©   (2003-02-11 11:58) [25]

GetCaretPos существует для любого окна, имеющего каретку.


 
Sha ©   (2003-02-11 12:02) [26]

Проблема только в том, что GetCaretPos всегда возвращает координаты левой границы выделенной области.


 
Inquirer   (2003-02-11 12:27) [27]

Связка GetCaretPos(WinAPI) + EM_CHARFROMPOS сработала корректно!!

СПАСИБО ВСЕМ ЗА ПОМОЩЬ.


 
Sha ©   (2003-02-11 12:38) [28]

2 Inquirer (11.02.03 12:27)

Работающий код можно посмотреть?


 
Inquirer   (2003-02-11 12:51) [29]

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 13:30) [30]

2 Inquirer (11.02.03 12:51)

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


 
Anatoly Podgoretsky ©   (2003-02-11 13:37) [31]

Естественно реальные, поскольку Получить Позицию Каретки


 
Sha ©   (2003-02-11 14:52) [32]

2 Anatoly Podgoretsky © (11.02.03 13:37)

SelStart попутал. Это он все время возвращает левые координаты и других туда же тянет :)
Давно с этим возился. Подзабыл. Star стал :)


 
Inquirer   (2003-02-11 15:14) [33]

Кстати свойство 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;


 
Inquirer   (2003-02-11 15:22) [34]

Oops, чепуха при скроллировании...


 
Inquirer   (2003-02-11 15:35) [35]

Так правильно :-)

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 16:06) [36]

GetCaretPos отрабатывает только в клиентских координатах окна :(



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
1-30440
XTC
2003-03-27 09:43
2003.04.10
Резидентная программа


6-30498
timer
2003-02-19 15:15
2003.04.10
как можно листануть файлы на удалееноой...


8-30480
Карлсон
2003-01-07 13:14
2003.04.10
преобразование в ASCII


9-30201
APTEMKA
2002-11-05 00:45
2003.04.10
Коллизия в 3D


3-30215
Vovik
2003-03-19 09:51
2003.04.10
Типы полей в Dbase