怎样在有上下滚动栏的情况下将memo里面的光标和页面置顶? 例如memo读入一篇很长的文章,默认是显示最后的,怎样让光标跑回第一行,并把滚动栏也返回最顶?

解决方案 »

  1.   

    var
          vScrollInfo:   TScrollInfo;
          i:HWND;
    begin
          FOldWinProc(Msg);   //   选择原来的处理
          //   判断是否滚动消息
          if   Msg.Msg=WM_VSCROLL   then
          begin
              //   进行你的动作,如:ListBox.Perform(   Msg.Msg,   Msg.WParam,   Msg.LParam   );
              i:=GetFocus();
              if i=RichEdit1.Handle then
              Begin
                           vScrollInfo.cbSize   :=   SizeOf(vScrollInfo);
                           vScrollInfo.fMask   :=   SIF_POS;
                           GetScrollInfo(RichEdit1.Handle,   SB_VERT,   vScrollInfo);
                           RichEdit2.Perform(WM_VSCROLL,
                           MakeLong(SB_THUMBPOSITION,   vScrollInfo.nPos   +   1),   0);
              end else if i= RichEdit2.Handle then
              Begin
                           vScrollInfo.cbSize   :=   SizeOf(vScrollInfo);
                           vScrollInfo.fMask   :=   SIF_POS;
                           GetScrollInfo(RichEdit2.Handle,   SB_VERT,   vScrollInfo);
                           RichEdit1.Perform(WM_VSCROLL,
                           MakeLong(SB_THUMBPOSITION,   vScrollInfo.nPos   +   1),   0);
              end;      end;end;参考一下,里面通过GetScrollInfo得到滚动信息,Perform发送消息来使滚动条滚动.
      

  2.   


    var
        ScrollLn   :integer;
       memo.SelStart   :=   memo.Perform(EM_LINEINDEX,   memo.Lines.Count,   1);
       ScrollLn   :=   memo.Lines.Count   -   memo.Perform(EM_GETFIRSTVISIBLELINE,   0,   0);
       memo.Perform(EM_LINESCROLL,   0,   ScrollLn);   SendMessage(memo.Handle,EM_SCROLL,SB_LINEup,0);
       SendMessage(memo.Handle,EM_SCROLL,SB_LINEdown,0);
    //反正就这几句反来复去试一下吧 
    //我写程序的时候跟你要求是相反的,是如何把光标置为最后,写聊天程序时,msg窗口的richedit 在接到信息时,总是不会自动停到最后一行,滚动条有些问题,写了上面几句就好了,好像是先把光标置顶,再置回最后的处理方法。 我想你要的应该是前面一半就够了
       
      

  3.   

    这样就可以了:  memo1.SetFocus;
      Memo1.SelStart:=0;
      Memo1.SelLength:=0;