8

I need to scroll a RichEdit to the very end after a line is added. I have this RichEdit in a separate form, that I don't want to get focus at all. I tried often suggested solution:

RichEdit.Lines.Add(someText);
RichEdit.SelStart:=RichEdit.GetTextLen;
SendMessage(RichEdit.handle, EM_SCROLLCARET, 0, 0);

But this doesn't work for me. However, when I focus the RichEdit before calling the SendMessage using RichEdit.SetFocus; it works just fine. That, however, ruins my other needs for the app.

I'm using XE2. Thanks

Ian Boyd
  • 246,734
  • 253
  • 869
  • 1,219
Martin Melka
  • 7,177
  • 16
  • 79
  • 138

2 Answers2

12

This is what I do:

SendMessage(RichEdit.Handle, WM_VSCROLL, SB_BOTTOM, 0);
David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
  • 2
    FWIW, that works to jump at the end, wherever the caret might be. However to jump at the current position of the caret, you have to do the HideSelection trick. – Francesca Mar 19 '12 at 18:04
9

See this blog post by François Gaillard: richedit-on-scrolling-strike.

Appearently a bug, here is the workaround solution :

procedure ScrollToEnd(ARichEdit: TRichEdit);
var
  isSelectionHidden: Boolean;
begin
  with ARichEdit do
  begin
    SelStart := Perform( EM_LINEINDEX, Lines.Count, 0);//Set caret at end
    isSelectionHidden := HideSelection;
    try
      HideSelection := False;
      Perform( EM_SCROLLCARET, 0, 0);  // Scroll to caret
    finally
      HideSelection := isSelectionHidden;
    end;
  end;
end;
LU RD
  • 34,438
  • 5
  • 88
  • 296