在Tmemo中,我想使当前选中的行自动滚到屏幕的最顶端,我用SendMessage来使滚动条上下移也不行,这个函数对于刚好是一屏也没有用(就是滚动条没有发生作用时),大家帮帮我应该怎么办,我做的是一个考试系统,当用户从cmoboBox中选中一个题号时自动把memo中当前题自动移到屏幕的最顶端,怎样才好实现这一功能?

解决方案 »

  1.   

    这样做吧unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        ComboBox1: TComboBox;
        procedure Button1Click(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
       self.Memo1.Lines.Clear;
       self.Memo1.Lines.Add('aaaaaaa');
       self.Memo1.Lines.Add('bbbbbb');
       self.Memo1.Lines.Add('cccc');
       self.Memo1.Lines.Add('eeeeee');   self.ComboBox1.Items.Add('aaaaaaa');
       self.ComboBox1.Items.Add('bbbbbb');
       self.ComboBox1.Items.Add('cccc');
       self.ComboBox1.Items.Add('eeeeee');
    end;procedure TForm1.ComboBox1Change(Sender: TObject);
    var inti:integer;
    var s:string;
    begin
     //  Memo1.Lines[0].text
       for inti:=0 to Memo1.Lines.Count-1 do
       begin
         if trim(ComboBox1.Text)=trim(Memo1.Lines[inti]) then
         begin
            s:= trim(Memo1.Lines[0]);
            Memo1.Lines[0]:= trim(ComboBox1.Text);
            Memo1.Lines[inti]:= s;
         end;
       end;
    end;end.
      

  2.   

    try this:  SendMessage(memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
      

  3.   

    没有搞定,试一下下面代码:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to 50 do
      begin
        ComboBox1.Items.Append(IntToStr(i));
        Memo1.Lines.Append(IntToStr(i));
      end;
    end;procedure TForm1.ComboBox1Change(Sender: TObject);
    var
      i, j, k: Integer;
    begin
      k := 0;
      j := Memo1.Lines.IndexOf(ComboBox1.Text);
      for i := 0 to j do
        k := k + Length(Memo1.Lines[i-1]);
      k := k + 2*j;
      Memo1.SelStart := k;
      Memo1.SelLength := Length(Memo1.Lines[j]);
      SendMessage(Memo1.Handle, EM_LINESCROLL, 0, 0);
      Memo1.SetFocus;
    end;
      

  4.   

    procedure  TReadPaperForm.ScrollScreen;
    var
     i:integer;
     strQuestionID:string;
    begin
          strQuestionID:=trim(QuestionIDComboBox.Text)+'.';
          for i:=0 to QuestionListMemo.Lines.Count do
             if pos(strQuestionID,QuestionListMemo.Lines.Strings[i])=1 then
              begin
                SendMessage(QuestionListMemo.Handle, EM_LINESCROLL, 0,(i-CurrentRow)+1);
                ShowMessage(inttostr(i));
                CurrentRow:=i;
                break;
              end;
    end;
    上面是我的代码,应该怎样改进一下,还有那个SendMessage(Memo1.Handle, EM_LINESCROLL, 0, 0);有什么用它后面的那两个参数都为0,不是没有移动吗?
      

  5.   

    CurrentRow初始化为,还有如果这样的话,用户如果用鼠标移动一下滚动条不是又不对了?
      

  6.   

    1. 支持在电子邮件中传输汉字信息的协议是_____.                                                                                                                          
    2. 二进制11010110转换成十六制是_____.                                                                                         
    3. 只有硬件而没有软件的计算机被称为_______.                                                                                 
    4. 一个盘符最多有____个根目录.Memo中题目显示是这样的,如果用户在ComboBox中选择一个题号后,程序就在MEMO中自动搜索这个标题然后再停在这一行上面,具体的应该怎么办?