如何自动滚动到RichEdit的末尾?

10

我之前从未使用过TRichEdit,一直使用TMemo。

我想让RichEdit在添加文本时像TMemo一样自动滚动到末尾。请看在添加一些数据后的效果:

enter image description here

如您所见,滚动条仍然停留在顶部,但是我希望它随着我添加文本而停留在底部。

我已经搜索了解决方案,但没有找到好的和可靠的方法。


我看不出有什么区别。我尝试了Memo1.Lines.Add('test')RichEdit1.Lines.Add('test'),它们的行为方式是相同的。您需要提供更多详细信息。 - Andreas Rejbrand
@Andreas,我添加了更多细节。希望现在更清楚了。 - Daniel Grillo
@Daniel:显然你不能通过 RichEdit1.Lines.Add('text') 来添加文本。你是使用 SelText := 'text' 吗? - Andreas Rejbrand
@Andreas,我正在使用RichEdit1.Lines.Add('text') - Daniel Grillo
@Andreas:如果我们也使用RichEdit1.Lines.Add()方法,输出结果与上面相同(在D2006中)。 - Bharat
是的,现在我明白了!我在表单的OnClick事件中尝试使用 RichEdit1.Lines.Add('text'),所以 Rich Edit(或备忘录)一直处于焦点状态。然后 Rich Edit 和备忘录都滚动了。但是如果控件没有焦点(例如,在TButtonOnClick事件中使用),那么只有备忘录会滚动!有趣的…… - Andreas Rejbrand
3个回答

19

试试这段代码

RichEdit1.SetFocus;
RichEdit1.SelStart := RichEdit1.GetTextLen;
RichEdit1.Perform(EM_SCROLLCARET, 0, 0);

1
谢谢。它有效!我稍微编辑了一下你的答案,如果你不介意的话。 - Daniel Grillo
5
@Daniel:我不太确定,但我怀疑RichEdit1.GetTextLengthLength(RichEdit1.Text)要快得多。前者只向Rich Edit窗口发送一个WM_GETTEXTLENGTH消息(正如微软所希望的那样),而后者首先必须将整个文本作为字符串获取(潜在地非常缓慢?),然后读取其长度(非常快)。更新:抱歉,您想使用GetTextLen,而Bharat使用了Length。我搞混了! - Andreas Rejbrand
好的,BugFinder想要使用GtTextLen AFAICS,但现在这一切都混乱了。 - Sertac Akyuz
我不知道它是否依赖于Windows或Delphi版本,但在Windows XP和7上使用Delphi 2007时,我只需要.Perform行。即使没有TRichEdit被聚焦,它也可以工作。 - Chad N B
只是想补充一下,对我来说(Delphi XE2),仅使用RichEdit1.Perform(EM_SCROLLCARET, 0, 0);就非常好用。 - KeyszerS
是的,我不得不根据这个“SetFocus”要求进行一些重大更改。我正在做一个日志,在这种情况下,在编写日志期间,表单上的所有内容都被禁用。因此,我必须逐个手动禁用各个控件,而不是整个容器(因为您无法将焦点设置到已禁用的控件)。 - Jerry Dodge

11

1
简而言之,您需要将光标放在末尾,或发送代码以向下滚动。
你试过了吗?
Richedit1.SelStart :=RichEdit1.GetTextLength();
SendMessage(RichEdit1.handle, EM_SCROLLCARET,0,0);

我尝试了,但它没有起作用。你必须先使用RichEdit1.SetFocus。而且至少在Delphi 2010中,你必须使用GetTextLen代替GetTextLength - Daniel Grillo
有点烦人,我很惊讶它需要焦点。(getTextLength是从记忆中得出的,所以我不太意外,抱歉) - BugFinder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接