12

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 vertical scrolling.

bummi
  • 27,123
  • 14
  • 62
  • 101
none
  • 4,669
  • 14
  • 62
  • 102
  • 1
    The answer from @vcldeveloper is best, but another option to consider is simply to add lines to the `TMemo` (or similar) VCL control in reverse order. This puts the latest item on top which may remove the need to scroll at all. – AlainD Mar 29 '19 at 11:08

7 Answers7

43

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.

vcldeveloper
  • 7,399
  • 2
  • 33
  • 39
7

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

Aljaz - aly
  • 256
  • 3
  • 2
5

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.

Despatcher
  • 1,745
  • 12
  • 18
3

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.

lluca
  • 181
  • 2
  • 15
3

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);

RoCkHeLuCk
  • 199
  • 1
  • 5
  • 2
    `SB_LINEDOWN` scrolls one line down, so you have to know how many times to call it to scroll enough. The answer with `EM_LINESCROLL` scrolls to the end with just one call. – VLL Nov 15 '22 at 09:39
1

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);
Powkachu
  • 2,170
  • 2
  • 26
  • 36
0

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

Didier Cabalé
  • 385
  • 3
  • 10