您需要一个条件来决定是否滚动到底部。下面似乎适用于一个简单的测试,它将最上面的可见行与备忘录可以显示的可能行数相加,以确定最后一行是否可见。
procedure TForm1.Memo1Change(Sender: TObject);
var
LineCount, TopLine: Integer;
begin
LineCount := Memo1.Perform(EM_GETLINECOUNT, 0, 0) - 1;
TopLine := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
if (TopLine + GetVisibleLineCount(Memo1)) >= LineCount then
SendMessage(Memo1.Handle, EM_LINESCROLL, 0, LineCount);
end;
在哪里
function GetVisibleLineCount(Memo: TMemo): Integer;
var
DC: HDC;
SaveFont: HFONT;
TextMetric: TTextMetric;
EditRect: TRect;
begin
DC := GetDC(0);
SaveFont := SelectObject(DC, Memo.Font.Handle);
GetTextMetrics(DC, TextMetric);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
Memo.Perform(EM_GETRECT, 0, LPARAM(@EditRect));
Result := (EditRect.Bottom - EditRect.Top) div TextMetric.tmHeight;
end;
(您可以缓存可见行数,以避免为备忘录中的每次更改计算它。)
不过,您可能需要进一步调整代码,如果备忘录中可以显示的行数较少的话。此代码也没有考虑插入符号的位置。