【问题标题】:Keeping the caret at the end of text in a rich edit在富编辑中将插入符号保留在文本末尾
【发布时间】:2010-09-09 18:52:46
【问题描述】:

我正在使用 TRichEdit 组件在 Delphi (2009) 中编写一个编辑器。编辑器是只能追加的,从某种意义上说,插入符号必须始终位于末尾,同时保持使用鼠标从组件的其他位置进行复制的能力。

目前它的工作方式是在写入内容时将插入符号移到末尾,但是是否可以在单击文本的其他部分时使插入符号不跟随鼠标?

【问题讨论】:

    标签: delphi richedit


    【解决方案1】:

    不,这是不可能的。当用户键入内容时,您必须将插入符号移到末尾。

    【讨论】:

      【解决方案2】:

      没有。插入符号必须移动,以便用户使用鼠标或键盘进行选择。每次插入新文本时,您都必须将插入符号移到末尾。您可能还应该在每次插入期间保留并恢复用户当前的插入符号位置,例如:

      procedure TForm.AppendText(const S: String);
      var
        OldCharRange, NewCharRange: TCharRange;
      begin
        SendMessage(RichEdit1.Handle, EM_EXGETSEL, 0, LParam(@OldCharRange));
        try
          NewCharRange.cpMin := RichEdit1.GetTextLen;
          NewCharRange.cpMax := NewCharRange.cpMin;
          SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LParam(@NewCharRange));
          RichEdit1.SelText := S;
        finally
          SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LParam(@OldCharRange));
        end;
      end;
      

      【讨论】:

      • 在 C++ 中工作太多? OldStart 有什么问题 := RichEdit1.SelStart; OldLen := RichEdit1.SelLength;试试 RichEdit1.SelStart := NewStart; RichEdit1.SelText := S;最后 RichEdit1.SelStart := OldStart; RichEdit1.SelLength := OldLen;结束;
      • 使用 EM_EXGETSELEM_EXSETSEL 直接消除了发送到 RichEdit 的几条消息(SelStart 和 SelLength 属性获取器和设置器分别重新发出这些消息),并且 SelLength 属性设置器发出一个还有额外的 EM_SCROLLCARET 消息。
      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多