gpt4 book ai didi

delphi - 如何在 RichEdit 中保存然后恢复垂直滚动位置

转载 作者:行者123 更新时间:2023-12-02 16:35:47 25 4
gpt4 key购买 nike

我试图在 RichEdit 中保存然后恢复垂直滚动位置。

存储滚动位置的全局变量:

SI: TScrollInfo;

此代码保存滚动位置:

FillChar( SI, SizeOf(SI), #0 );
SI.cbSize := SizeOf(SI);
SI.fMask := SIF_POS;
GetScrollInfo( RichEdit1.Handle, SB_VERT, SI );

此代码尝试恢复它:

RichEdit1.Perform( WM_VSCROLL, MakeLong(SB_THUMBTRACK, SI.nPos), 0 );

RichEdit 中的文本恢复到原来的位置 OK。问题是垂直滚动条不会跳转到旧位置。

我的系统:Win 7 64位,Delphi 2009

我做错了什么?

最佳答案

选项 1

在许多方面,“最干净”的解决方案是使用 EM_GETSCROLLPOSEM_SETSCROLLPOS消息:

const
EM_GETSCROLLPOS = $04DD;
EM_SETSCROLLPOS = $04DE;

var
P: TPoint;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
RichEdit1.Perform(EM_GETSCROLLPOS, 0, @P)
end;

procedure TForm1.btnRestoreClick(Sender: TObject);
begin
RichEdit1.Perform(EM_SETSCROLLPOS, 0, @P)
end;

但是,请注意文档中描述的 16 位限制,它限制了您可以使用这些消息表示的垂直范围。如果您显示大型 RTF 文档,这可能是一个问题(真的是一个问题)。

选项 2

实际上,您最初的方法似乎(令我惊讶的是)不受此限制。你会失去精度,而不是范围。您观察到的滚动条问题可以通过使用 SB_THUMBPOSITION 而不是 SB_THUMBTRACK 来解决。

选项 3

var
Y: Integer;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
y := RichEdit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
end;

procedure TForm1.btnRestoreClick(Sender: TObject);
var
NewY: Integer;
begin
NewY := RichEdit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
RichEdit1.Perform(EM_LINESCROLL, 0, Y - NewY);
end;

可能是一个可行的选择。

关于delphi - 如何在 RichEdit 中保存然后恢复垂直滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62746217/

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