在需要调整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得到的行数会比正常情况下少一行。