我之前从未使用过TRichEdit,一直使用TMemo。
我想让RichEdit在添加文本时像TMemo一样自动滚动到末尾。请看在添加一些数据后的效果:
如您所见,滚动条仍然停留在顶部,但是我希望它随着我添加文本而停留在底部。
我已经搜索了解决方案,但没有找到好的和可靠的方法。
我之前从未使用过TRichEdit,一直使用TMemo。
我想让RichEdit在添加文本时像TMemo一样自动滚动到末尾。请看在添加一些数据后的效果:
如您所见,滚动条仍然停留在顶部,但是我希望它随着我添加文本而停留在底部。
我已经搜索了解决方案,但没有找到好的和可靠的方法。
试试这段代码
RichEdit1.SetFocus;
RichEdit1.SelStart := RichEdit1.GetTextLen;
RichEdit1.Perform(EM_SCROLLCARET, 0, 0);
RichEdit1.GetTextLength
比Length(RichEdit1.Text)
要快得多。前者只向Rich Edit窗口发送一个WM_GETTEXTLENGTH
消息(正如微软所希望的那样),而后者首先必须将整个文本作为字符串获取(潜在地非常缓慢?),然后读取其长度(非常快)。更新:抱歉,您想使用GetTextLen
,而Bharat使用了Length
。我搞混了! - Andreas Rejbrand这里有一个更加简单和快捷的解决方案:
在OnChange事件处理程序中,只需要执行以下代码:
SendMessage(RichEdit1.handle, WM_VSCROLL, SB_BOTTOM, 0);
原回答来自:https://www.experts-exchange.com/questions/21002277/Richedit-autoscrolling.html
Richedit1.SelStart :=RichEdit1.GetTextLength();
SendMessage(RichEdit1.handle, EM_SCROLLCARET,0,0);
RichEdit1.SetFocus
。而且至少在Delphi 2010中,你必须使用GetTextLen
代替GetTextLength
。 - Daniel Grillo
Memo1.Lines.Add('test')
和RichEdit1.Lines.Add('test')
,它们的行为方式是相同的。您需要提供更多详细信息。 - Andreas RejbrandRichEdit1.Lines.Add('text')
来添加文本。你是使用SelText := 'text'
吗? - Andreas RejbrandRichEdit1.Lines.Add('text')
。 - Daniel GrilloOnClick
事件中尝试使用RichEdit1.Lines.Add('text')
,所以 Rich Edit(或备忘录)一直处于焦点状态。然后 Rich Edit 和备忘录都滚动了。但是如果控件没有焦点(例如,在TButton
的OnClick
事件中使用),那么只有备忘录会滚动!有趣的…… - Andreas Rejbrand