Rolar o TMemo para primeira linha

06/02/2006

0

Pessoal, acredito que essa seja uma dúvida simples. Tenho uma rotina que insere vários dados em um Memo. Mas após inserir, o cursor do memo fica na última linha. Queria saber como fazer para rolar o cursor para a primeira linha.

Obs.: Eu até consegui fazer de outra forma que ínclusive ficou melhor. Eu fui adicionando os dados em uma TStringList e depois fiz Memo.Lines.AddStrings(Variavel_StringList). Dessa forma funcionou, mas eu queria saber de qualquer maneira se dá para fazer do outro jeito.

Grato.


Delphi32

Delphi32

Responder

Post mais votado

06/02/2006

A coisa mais óbvia é setar [b:0e9bee2114]SelStart[/b:0e9bee2114] para 0, como o colega [b:0e9bee2114]Edilcimar [/b:0e9bee2114]citou. Porém, isso apenas desloca o cursor dentro do Memo, mas não rola a tela.

Adaptei a função a seguir do site [url=http://delphi.about.com]About Delphi[/url]:

procedure ScrollMemo(Memo: TMemo; Direction: Integer);
var
  ScrollMessage: TWMVScroll;
  I: Integer;
begin
  ScrollMessage.Msg := WM_VSCROLL;
  Memo.Lines.BeginUpdate;
  try
    for I := 0 to Memo.Lines.Count do
    begin
     ScrollMessage.ScrollCode := Direction;
     ScrollMessage.Pos := 0;
     Memo.Dispatch(ScrollMessage);
    end;
  finally
    Memo.Lines.EndUpdate;
  end;
end;

...

ScrollMemo(Memo1, SB_LINEUP); // Rola para o início
ScrollMemo(Memo1, SB_LINEDOWN); // Rola para o final


Note o seguinte: se vc quiser, pode chamar [b:0e9bee2114]BeginUpdate [/b:0e9bee2114]antes de inserir a linha, e [b:0e9bee2114]EndUpdate [/b:0e9bee2114]após. Isso não irá rolar o memo para baixo, e consequentemente não será necessário rolá-lo para cima depois.

[]´s


Michael

Michael
Responder

Mais Posts

06/02/2006

Edilcimar

Memo1.SetFocus;
Memo1.SelStart := 0;


Responder

05/01/2016

Bruno

Caso interesse a alguém, alterei o procedimento do Michael para rolar todos os Memos do Form.

procedure TForm1.ScrollMemo(Direction: Integer);
var
  ScrollMessage: TWMVScroll;
  i, j: integer;
begin
  for i := 0 to Form1.ComponentCount - 1 do
  begin
    if Form1.Components[i] is TMemo then
    begin
      with (Form1.Components[i] as TMemo) do
      begin
        ScrollMessage.Msg := WM_VSCROLL;
        Lines.BeginUpdate;
        try
          for j := 0 to Lines.Count do
          begin
            ScrollMessage.ScrollCode := Direction;
            ScrollMessage.Pos := 0;
            Dispatch(ScrollMessage);
          end;
        finally
          Lines.EndUpdate;
        end;
      end;
    end;
  end;
end;

...

ScrollMemo(SB_LINEUP); // Rola para o início
ScrollMemo(SB_LINEDOWN); // Rola para o final
Responder

05/01/2016

Raimundo Pereira

Tente
Memo1.lines[0];
Responder

09/08/2022

Bernelio

Tente
Memo1.lines[0];


O CORRETO É
SendMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEUP, 0);

att.
Bernélio
Responder

12/02/2024

Gilberto

Memo1.SetFocus;
{ Mantém pressionada "CTRL" }
Keybd_Event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Pressiona "HOME" }
Keybd_Event(VK_HOME, 0, 0, 0);
{ Libera (solta) "CTRL" }
Keybd_Event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

Editado agora por Gavel
Responder

12/02/2024

Gilberto

Pessoal, acredito que essa seja uma dúvida simples. Tenho uma rotina que insere vários dados em um Memo. Mas após inserir, o cursor do memo fica na última linha. Queria saber como fazer para rolar o cursor para a primeira linha.

Obs.: Eu até consegui fazer de outra forma que ínclusive ficou melhor. Eu fui adicionando os dados em uma TStringList e depois fiz Memo.Lines.AddStrings(Variavel_StringList). Dessa forma funcionou, mas eu queria saber de qualquer maneira se dá para fazer do outro jeito.

Grato.


Memo1.SetFocus;
{ Mantém pressionada "CTRL" }
Keybd_Event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Pressiona "HOME" }
Keybd_Event(VK_HOME, 0, 0, 0);
{ Libera (solta) "CTRL" }
Keybd_Event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar