Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 311921
            [titulo] => Rolar o TMemo para primeira linha
            [dataCadastro] => DateTime Object
                (
                    [date] => 2006-02-06 00:00:00
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 234680
            [status] => A
            [isExample] => 
            [NomeUsuario] => Michael
            [Login] => forum.Michael
            [Apelido] => 
            [Foto] => 
            [Conteudo] => 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]:

[code:1:0e9bee2114]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[/code:1:0e9bee2114]

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


) )

Rolar o TMemo para primeira linha

Delphi32
   - 06 fev 2006

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.


Post mais votado

Michael
   - 06 fev 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]:

#Código

:1:0e9bee2114]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
:1:0e9bee2114]

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


Edilcimar
   - 06 fev 2006

Memo1.SetFocus;
Memo1.SelStart := 0;


Bruno
   - 05 jan 2016

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

#Código

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

P2
   - 05 jan 2016

Tente
Memo1.lines[0];