procedure TForm1.Memo1Change(Sender: TObject);
var
  ContentHeight: Integer;
begin
  Canvas.Font := Memo1.Font;        //这什么意思.canvas是干什么用的.为什么给它赋值
  ContentHeight := Canvas.TextHeight('好');  //这句完全不明白.还有那个('好')又是个什么东西
  ContentHeight := (Memo1.Lines.Count+1) * ContentHeight;//这句话有什么意义啊
  if ContentHeight < Memo1.Height then       //这里下面我知道.判断是否超出memo的高度
  begin
    Memo1.ScrollBars := ssNone;
  end
  else
  begin
    Memo1.ScrollBars := ssVertical;
  end;
end;
end.好人做到底.给我个详细解答

解决方案 »

  1.   

    procedure TForm1.Memo1Change(Sender: TObject);
    var
      ContentHeight: Integer;
    begin
      Canvas.Font := Memo1.Font;        //canvas是memo1控件的画布,memo1显示出的东西都是画在这上面的。
      ContentHeight := Canvas.TextHeight('好');  //这句是得到单独一行文字的高度,"好"字没意义,只是随便用一字来取得当前字体下,一行文字的高度,你可以换成其它字。
      ContentHeight := (Memo1.Lines.Count+1) * ContentHeight;//这句话得到memo1中所有行的文字高度
      if ContentHeight < Memo1.Height then       //这里下面我知道.判断是否超出memo的高度
      begin
        Memo1.ScrollBars := ssNone;
      end
      else
      begin
        Memo1.ScrollBars := ssVertical;
      end;
    end;
    end.
      

  2.   

      ContentHeight := (Memo1.Lines.Count+1) * ContentHeight;
    这句还是不理解.为什么Memo1.Lines.Count+1 要加1.还要剩 ContentHeight
      

  3.   

    ContentHeight := (Memo1.Lines.Count+1) * ContentHeight;
    在乘法没有执行前,ContentHeight是每行的高度
    而memo1中,有Memo1.Lines.Count这么多行,所以总高度应该是(Memo1.Lines.Count+1) * ContentHeight;+1应该是为了让memo1提前一行就开始有滚动条。你把+1去掉也没关系,显示上有点不同。
      

  4.   

    MEM0的滚动条有四种状态。只捡两种说。
    ssNone:不出现滚动条。即使超出范围也不出现。(界面上不显示滚动条部分)
    ssVertical:当超出Memo高度时出现滚动条。(界面上始终显示滚动条部分).
    所以楼主的意思是两者的综合体,超出的时候可以显示,但是没超出来就不能显示滚动条部分!但是Memo默认的属性要么始终显示,要么都不显示。这就有点死板了!