TMemo中的光标位置更改

时间:2015-08-10 06:40:15

标签: delphi

我有一个源自TMemo的组件。你知道我应该拦截哪些Windows消息来对文本光标位置的变化作出反应吗?我的意思是文本光标,通过按箭头键或鼠标左键单击来改变位置。我在Delphi 7上.OnMouseDown或OrKeyPress事件适用于箭头键但不适用于LMB。

4 个答案:

答案 0 :(得分:3)

您可以存储CaretPos属性值,并在OnKeyPressOnClick个事件中对其进行比较。如果某个程序发生了变化,请调用它。

答案 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;