【问题标题】:Delphi scrolling MemoDelphi 滚动备忘录
【发布时间】:2013-07-17 18:40:18
【问题描述】:

现在我有这个代码。

procedure TForm1.Memo1Change(Sender : TObject);
begin
  SendMessage(Informacje.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count);
end;

问题是添加新行时我无法向上滚动 MemoLines。我想在向上滚动时停止将光标移动到末尾,当滚动条位于底部时开始将光标移动到末尾。感谢的帮助。
换句话说。想象一下,有一个 IRC 与 Memo 聊天。新消息,插入符号位于最后一条消息的末尾。现在我想使用滚动条(向上)阅读以前的消息,但我不能导致有更新的消息将 carret 移回底部。我想在鼠标滚轮上停止它,阅读消息,然后回到以前的状态(在新消息的末尾再次插入插入符号),当我滚动到底部时。

【问题讨论】:

  • 嗯。我会尝试。想象一下,有一个 IRC 与 Memo 聊天。新消息,插入符号位于最后一条消息的末尾。现在我想使用滚动条(向上)阅读以前的消息,但我不能导致有更新的消息将 carret 移回底部。我想在鼠标滚轮上停止它,阅读消息,然后回到以前的状态(在新消息的末尾再次插入插入符号),当我滚动到底部时。现在清楚了吗?
  • 阅读完毕的 UI 信号是什么? IE。备忘录何时应恢复正常行为?
  • 两者兼得。我现在会尝试为 RichEdit 做这件事

标签: delphi


【解决方案1】:

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

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;

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

您可能需要进一步调整代码,f.i.对于备忘录中可以显示的行数较少的情况。此代码也没有考虑插入符号的位置。

【讨论】:

  • "(TopLine + GetVisibleLineCount(Form1.Memo6)) >= LineCount" 如果在单个备忘录更改中有更多行,代码应如下所示 "(TopLine + GetVisibleLineCount(Form1.Memo6)) > = LineCount - extra_lines"
  • @user - 您刚刚添加的行的“extra_lines”帐户吗?
  • 它用于 irc 聊天。有时消息是一行,有时是多行。如果消息在 3 行中,则必须是 (TopLine + GetVisibleLineCount(Form1.Memo6)) >= LineCount -2
猜你喜欢
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多