autoscrolling memo in delphi
Does delphi contain a component that allows auto scroll text loaded from db, like in news sites?
Tt's for a delphi 7 application and requires a verti开发者_JAVA技巧cal scrolling.
For such a simple task, you don't need to buy a commercial component! All you need to do is to send an EM_LINESCROLL message to that memo control, to make it scroll to the last line:
procedure ScrollToLastLine(Memo: TMemo);
begin
SendMessage(Memo.Handle, EM_LINESCROLL, 0,Memo.Lines.Count);
end;
If your memo is read-only to users and is updated automatically by the application, you can put a call to the above procedure in its OnChange event-handler, so that whenever the text inside the memo is changed, it is automatically scrolled down to the last line.
None of those solutions for scrolling worked for me in the RichEdit memo. Using Delphi 2010 + w7. But this one works perfectly:
After every Lines.Add('...')
this follows:
SendMessage(RichEditMemo.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
Found in: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10120212.html
Possibly, to save you some money you could adapt this to scroll a DBMemo:
EchoMemo.Lines.Add('A Line of text or more');
EchoMemo.SelStart := EchoMemo.GetTextLen;
EchoMemo.SelLength := 0;
EchoMemo.ScrollBy(0, EchoMemo.Lines.Count);
EchoMemo.Refresh;
I use for a log display.
You can also use Memo.GoToTextEnd;
when needed, for example inside an onchange event. Is not a proper auto-scrolling effect but can be useful in similar situations.
The right thing to send messages within the same application is to use the Perform command, SendMessage sends it to the windows stream while perform sends it directly to the component. So much so that he doesn't even ask for the handle:
memo1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
If you're working with DevExpress components, you should use InnerControl->Handle
. So it should look like this:
SendMessage(cxMemo->InnerControl->Handle, EM_LINESCROLL, 0,cxMemo->Lines->Count);
More generally regarding the need to scroll a TControl (can be a TMemo) to a specific position, here is what says the official RAD Studio /Delphi documentation as an example of usage of TControl.Perform
=> use the Perform(EM_SCROLLCARET, 0, 0)
method
精彩评论