如何找到TScrollBox的实际大小(“逻辑区域”)

时间:2010-12-16 22:17:20

标签: delphi

我需要找到TScrollBox的整个大小(也称为“逻辑区域”) - 与通过Width和Height属性(或ClientWidth ClientHeight)获得的可见区域相反。

我想在TScrollBox中创建一些控件。其中一个(称为TViewer)需要与TScrollBox本身一样高。问题是在创建过程中,TScrollBox向下滚动以显示上次创建的控件。因此,使用Top = 1将无效,因为我的控件将具有top = 1,而不是逻辑区域的顶部


Delphi 7

6 个答案:

答案 0 :(得分:2)

看看Scrollbars:

ScrollBox1.VertScrollBar.Range
ScrollBox1.HorzScrollBar.Range

如果滚动框逻辑区域不大于物理区域(在这种情况下看不到滚动条),它可能小于高度和宽度

或者用它来获得两者的最大值:

var
  AHeight, AWidth: Integer;
begin
  AHeight := Max(ScrollBox1.VertScrollBar.Range, ScrollBox1.Height);
  AWidth := Max(ScrollBox1.HorzScrollBar.Range, ScrollBox1.Width);
  ShowMessageFmt('%d,%d', [AHeight, AWidth]);
end;

修改 从@Altar注释,我可以添加逻辑高度和/或宽度不是问题。如果要添加任何占据滚动条所有高度的控件,请使用上面计算中的AHeight,但将Top设置为VertScrollBar.Position的负数,如下所示:

procedure TForm2.Button3Click(Sender: TObject);
var
  AHeight, AWidth: Integer;
  Btn: TButton;
begin
  AHeight := Max(ScrollBox1.VertScrollBar.Range, Height);
  AWidth := Max(ScrollBox1.HorzScrollBar.Range, Width);
  Btn := TButton.Create(Self);
  Btn.Parent := ScrollBox1;
  Btn.Left := 15;
  Btn.Top := -ScrollBox1.VertScrollBar.Position;
  Btn.Height := AHeight;
end;

答案 1 :(得分:2)

可能ScrollBox.HorzScrollBar.RangeScrollBox.VertScrollBar.Range +相应的.Position是你需要的。

答案 2 :(得分:2)

  1. 在TScrollBox上删除一个组件,如TLabel。
  2. 将组件的Left和Top属性设置为0。
  3. 将组件的Visible属性设置为False。
  4. 现在你总是有起源。 “逻辑高度”现在是:

    myScrollBox.Height + (myOriginControl.Top * -1);
    

答案 3 :(得分:1)

我不确定我到底想要做什么,但要将完整区域定义为“可滚动”,您必须编写ScrollBox.HorScrollBar.Range + ScrollBox.Clientwidth(对于垂直部分也是如此) 。滚动框始终从总计中扣除可见的“页面”大小。因此,如果您定义1000像素的高度,显示100像素 - 它将具有900的滚动范围。您必须添加客户端高度以获得其余部分。

此外,要获得正确的“顶部”位置,您必须阅读Canvas.Cliprect.Top,因为滚动窗口不会更改子控件的顶部位置。 Windows会为您处理此问题,并且只会在初始化滚动条后告诉您重新绘制的内容。

由于你想要创建一个与完整的可滚动区域一样高的控件,我认为你正在创建一个各种编辑器?

如果是这样,你可能会在查看SynEdit时获得更好的结果并提取将滚动条添加到普通TCustomControl的基类(这很容易)。这样你就可以控制绘画和控件的布局。

这是我前一段时间为Lazarus和FreePascal写的。如果你将消息添加到uses子句并使用WM而不是TLM为消息处理程序添加前缀,它将在Delphi下编译。

(代码很长,不得不使用外部链接):http://delphimax.wordpress.com/2010/09/20/platform-independent-image-component-for-lazarus/

答案 4 :(得分:0)

这是一个复杂(但完整)的解决方案:

  1. 我在TScrollBox.Create期间创建了我的第一个子控件(当TScrollBox还没有滚动条时)
  2. 设置Child.Top:= 1
  3. 创建其余子控件(这可能会强制TScrollBox显示滚动条)
  4. 向上滚动TScrollBox
  5. 使用上述解决方案之一计算TScrollBox的高度

答案 5 :(得分:-1)

我试图这样做,相信我,我无法做到。 如果您拥有TScrollBox内部控件的实例,则可以使用它们来计算(不精确)该区域。