如何防止滚动条超出范围?

问题描述 投票:0回答:3

我使用代码

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;

问题是,当我添加/删除行时,当我要调整表单大小时,有时会出现错误。它说“滚动条属性超出范围”

如何避免?

谢谢

delphi properties scrollbar outofrangeexception
3个回答
3
投票

您可以尝试设置

PageSize
属性,并调用
SetParams
以避免一一设置各个属性。


0
投票

我收到此错误消息,发现初始化滚动条时发生了更改,当 PageSize 为 2 时,TScrollbar.Max 被设置为 0。在 Max 为 0 之前将 PageSize 设置为 0 修复了该问题。


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 也受到相同的不匹配类型定义的影响。

© www.soinside.com 2019 - 2024. All rights reserved.