Delphi中Memo控件自适应高度的方法

在需要调整Memo控件高度的地方(如Memo控件的OnChange事件中),调用MemoAutoSize函数即可。

procedure MemoAutoSize(Memo: TMemo);
var
  DC: HDC;
  SaveFont: HFont;
  I: Integer;
  SysMetrics, Metrics: TTextMetric;
begin
  DC := GetDC(0);
  try
    GetTextMetrics(DC, SysMetrics);
    SaveFont := SelectObject(DC, Memo.Font.Handle);
    GetTextMetrics(DC, Metrics);
    SelectObject(DC, SaveFont);
  finally
    ReleaseDC(0, DC);
  end;
  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;
  Memo.Height := Metrics.tmHeight * SendMessage(Memo.Handle, EM_GETLINECOUNT, 0, 0) + I;
end;

说明:
1、MemoAutoSize函数的原型为TCustomEdit.AdjustHeight过程。
2、为什么使用SendMessage(Memo.Handle, EM_GETLINECOUNT, 0, 0),而不是TMemo.Lines.Count?因为当Memo控件的最后一行为空行时,TMemo.Lines.Count得到的行数会比正常情况下少一行。