怎样根据TMemo的行数设置Tmemo的高度,让Tmemo刚好能显示所有的文本?
比如:1行    15
      2行    30
      3行    42
....
当然要根据Tmemo的字体来设。
(不用考虑会太高,我程序中它最多可能是10行。)

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      FontHeigth: Integer;
    begin
      Self.Canvas.Font.Assign(Memo1.Font);
      FontHeigth :=  Self.Canvas.TextHeight('A');
      Memo1.Height := (FontHeigth + 1) * Memo1.Lines.Count;
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);var
      FontHeigth: Integer;
    begin
      Self.Canvas.Font.Assign(Memo1.Font);
      FontHeigth :=  Self.Canvas.TextHeight('合');
      Memo1.Lines.add('好);
      Memo1.Lines.add('好汉');
      Memo1.Lines.add('合乎');
      Memo1.Lines.add('AAAAAAA');
      Memo1.Lines.add('aaaaaaaaa');
      Memo1.Height := (FontHeigth +1 ) * (Memo1.Lines.Count+1);
    end;
      

  3.   

    Memo1.Height := FontHeigth * (Memo1.Lines.Count+1);
      

  4.   

    用下面的代码,无论你的Memo怎样设置,都会准确的显示所有列;procedure TForm1.Button1Click(Sender: TObject);
    var
      DC: HDC;
      SaveFont: HFont;
      I: Integer;
      SysMetrics, Metrics: TTextMetric;
    begin
      with Memo1 do
      begin
        DC := GetDC(0);
        GetTextMetrics(DC, SysMetrics);
        SaveFont := SelectObject(DC, Font.Handle);
        GetTextMetrics(DC, Metrics);
        SelectObject(DC, SaveFont);
        ReleaseDC(0, DC);
        if NewStyleControls then
        begin
          if Ctl3D then I := 8 else I := 6;
          I := GetSystemMetrics(SM_CYBORDER) * I;
        end else
        begin
          I := SysMetrics.tmHeight;
          if I > Metrics.tmHeight then I := Metrics.tmHeight;
          I := I div 4 + GetSystemMetrics(SM_CYBORDER) * 4;
        end;
        Height := Metrics.tmHeight*Lines.Count + I;
      end;
    end;
      

  5.   

    做一个循环:条件是右侧滚动条是否存在,如果存在就把memo的高度加一,直到不存在为止!