首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福滚动备忘录

德尔福滚动备忘录
EN

Stack Overflow用户
提问于 2013-07-17 18:40:18
回答 1查看 8.1K关注 0票数 2

现在我有了这个密码。

代码语言:javascript
复制
procedure TForm1.Memo1Change(Sender : TObject);
begin
  SendMessage(Informacje.Handle, EM_LINESCROLL, 0, Memo1.Lines.Count);
end;

问题是,当添加新行时,我无法向上滚动MemoLines。我想停止移动光标到结束滚动向上,开始向后移动光标到结束时,滚动条在底部。谢谢的帮助。

换句话说。想象一下,有一个IRC聊天与备忘录。新消息,插入符号在最后一条消息的末尾。现在,我想读以前的消息,使用滚动条(向上),但我不能因为有较新的消息,使卡雷特回到底部。我想停止在鼠标滚轮上,读取消息,然后回到以前的状态(再次插入在新消息结束)时,我将滚动到底部。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-17 20:58:46

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

代码语言:javascript
复制
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;

哪里

代码语言:javascript
复制
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。在备忘录中可以显示的行较少的情况下。此外,此代码没有考虑插入符号的位置。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17707689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档