gpt4 book ai didi

Delphi滚动备忘录

转载 作者:行者123 更新时间:2023-12-01 17:24:31 28 4
gpt4 key购买 nike

现在我有这个代码。

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

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

最佳答案

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

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;

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

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

关于Delphi滚动备忘录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17707689/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com