我使用代码
procedure TMyCanvas.RichEditChange(Sender: TObject);
var
ScrollInfo: TScrollInfo;
begin
FillChar(ScrollInfo, SizeOF(ScrollInfo), 0);
ScrollInfo.cbSize := SizeOf(ScrollInfo);
ScrollInfo.fMask := SIF_RANGE or SIF_PAGE or SIF_POS;
if GetScrollInfo(FRichEdit.Handle, SB_VERT, ScrollInfo) then
begin
FVertScroll.Max := ScrollInfo.nMax;
FVertScroll.Min := ScrollInfo.nMin;
FVertScroll.PageSize := ScrollInfo.nPage;
FVertScroll.Position := ScrollInfo.nPos;
end;
Invalidate;
end;
问题是,当我添加/删除行时,当我要调整表单大小时,有时会出现错误。它说“滚动条属性超出范围”
如何避免?
谢谢
我收到此错误消息,发现初始化滚动条时发生了更改,当 PageSize 为 2 时,TScrollbar.Max 被设置为 0。在 Max 为 0 之前将 PageSize 设置为 0 修复了该问题。
我有另一个奇怪的问题(LargeChange 和 SmallChange),它们被定义为 TScrollBarInc (在 StrCtrls TScrollBar 定义中),并且被定义为 1..32767 (在 Forms
TScrollBarInc = 1..32767;
中)而不是 Integer,而 Min、Max 和 Position定义为 Integer(在 StdCtrls TScrollBar 定义上),在 SetParams 上参数也是 Integer,而不是 1..32767。
(在我看来)这显然是 TScrollBarInc 类定义上的一个 BUG。
举个例子:
Edit1.Text:='100000000'; // Ten millions
MyScrollBar.Min:=0;
MyScrollBar.Max:=100000000; // One hundred millions
MyScrollBar.Position:=1000000; // One million
MyScrollBar.LargeChange:=StrToInt(Edit1.Text);
// When in Edit1.Text is "100000000" (ten millions), this puts in
// LargeChange a negative value (-27008, not ten millions)
// and there is no error at compile not at execution time.
MyScrollBar.SmallChange:=Round(StrToInt(Edit1.Text)/10);
// When in Edit1.Text is "100000000" (ten millions), this puts in
// SmallChange a positive value (16960, not one million(
// and there is no error at compile not at execution time.
Caption:=IntToStr(ScrollBar1.LargeChange)+' & '+IntToStr(ScrollBar1.SmallChange);
// This is to see the values (it shows '16960 & -27008').
需要一个 FIX,类的两个参数(LargeChange 和 SmallChange)的类型覆盖,因此将其类型覆盖为 Integer(与 Min、Max 和 Position 类型相同)...IDE 还帮助说 LargeChange 和SmallChange 在 Min 和 Max 范围内,但不可能分配 0 和/或任何大于 32767 的值。
如何完成这种“类型覆盖”?我还不知道如何做(也许是一个类助手、类覆盖等,但不知道该怎么做)。
P.D.:以防万一有人会问,TurboDelphi 2006 ...TTntScrollBar 也受到相同的不匹配类型定义的影响。