问题
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
回答1:
This is what I do:
SendMessage(RichEdit.Handle, WM_VSCROLL, SB_BOTTOM, 0);
回答2:
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;
来源:https://stackoverflow.com/questions/9757134/scrolling-richedit-without-it-having-focus