Delphi 德尔福滚动备忘录

Delphi 德尔福滚动备忘录,delphi,Delphi,现在我有这个密码 procedure TForm1.Memo1Change(Sender : TObject); begin SendMessage(Informacje.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count); end; 问题是,添加新行时,我无法向上滚动备忘录行。我想在向上滚动时停止将光标移动到末尾,在滚动条位于底部时开始向后移动光标到末尾。谢谢你的帮助。 换句话说。假设有一个IRC聊天记录。新消息,插入符号位于最后一条消息的末尾。现在

现在我有这个密码

procedure TForm1.Memo1Change(Sender : TObject);
begin
  SendMessage(Informacje.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count);
end;
问题是,添加新行时,我无法向上滚动备忘录行。我想在向上滚动时停止将光标移动到末尾,在滚动条位于底部时开始向后移动光标到末尾。谢谢你的帮助。

换句话说。假设有一个IRC聊天记录。新消息,插入符号位于最后一条消息的末尾。现在我想用滚动条(向上)阅读以前的消息,但我不能因为有新消息将carret移回底部。我想在鼠标滚轮上停止它,阅读消息,然后回到之前的状态(在新消息的末尾再次插入符号),然后我将滚动到底部

您需要一个条件来决定是否滚动到底部。下面的测试似乎是一个简单的测试,它将最上面的一行与备忘录可能显示的行数相加,以确定最后一行是否可见

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;
在哪里

(您可以缓存可见行计数,以避免必须为备忘录中的每次更改计算可见行计数。)


不过,如果备忘录中显示的行数较少,您可能需要进一步调整代码。此外,此代码没有考虑插入符号的位置。

Hmm。我会尝试。假设有一个IRC聊天记录。新消息,插入符号位于最后一条消息的末尾。现在我想用滚动条(向上)阅读以前的消息,但我不能因为有新消息将carret移回底部。我想在鼠标滚轮上停止它,阅读消息,然后回到之前的状态(在新消息的末尾再次插入符号),然后我将滚动到底部。现在清楚了吗?完成阅读的UI信号是什么?即,备忘录应在何时恢复正常行为。我现在将尝试为RichEdit执行此操作”(TopLine+GetVisibleLineCount(Form1.Memo6))>=LineCount“如果在单个备忘录更改中有更多行,代码应该如下所示”(TopLine+GetVisibleLineCount(Form1.Memo6))>=LineCount-extra_lines“@user-是您刚才添加的行的“extra_lines”帐户吗?用于irc聊天。有时信息是一行,有时是多行。若消息在3行中,则必须是(TopLine+GetVisibleLineCount(Form1.Memo6))>=LineCount-2
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;