我有一个源自TMemo的组件。你知道我应该拦截哪些Windows消息来对文本光标位置的变化作出反应吗?我的意思是文本光标,通过按箭头键或鼠标左键单击来改变位置。我在Delphi 7上.OnMouseDown或OrKeyPress事件适用于箭头键但不适用于LMB。
答案 0 :(得分:3)
您可以存储CaretPos
属性值,并在OnKeyPress
和OnClick
个事件中对其进行比较。如果某个程序发生了变化,请调用它。
答案 1 :(得分:1)
你知道我应该拦截哪些Windows消息来对文本光标位置的变化作出反应吗?
在Win32编辑控件中没有更改插入符号位置的通知事件。
您可以通过轮询来检测此类更改,以响应应用程序的OnIdle
事件。
答案 2 :(得分:0)
如果这是你想要的唯一专业,那么已经有了一些答案。如果你希望扩展TMemo的功能而不是你迟早会发现的功能,那么你最好使用像SynEdit这样的东西,顺便提一下,它也支持对光标位置变化作出反应。
答案 3 :(得分:0)
我整理出来了。不工作的鼠标事件是我的错误。要响应TMemo中的插入位置更改,您可以组合两个事件:OnKeyUp(用于箭头键)和OnMouseDown:
procedure TSomeMemo.OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT] then
OnMouseDown(Sender, mbLeft, Shift, 0, 0);
end;
procedure TSomeMemo.OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
row,col: integer;
begin
if Button = mbLeft then
begin
row := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
col := SelStart - SendMessage(Handle, EM_LINEINDEX, row, 0);
...
end;
end;