我需要找到TScrollBox的整个大小(也称为“逻辑区域”) - 与通过Width和Height属性(或ClientWidth ClientHeight)获得的可见区域相反。
我想在TScrollBox中创建一些控件。其中一个(称为TViewer)需要与TScrollBox本身一样高。问题是在创建过程中,TScrollBox向下滚动以显示上次创建的控件。因此,使用Top = 1将无效,因为我的控件将具有top = 1,而不是逻辑区域的顶部。
Delphi 7
答案 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.Range
和ScrollBox.VertScrollBar.Range
+相应的.Position
是你需要的。
答案 2 :(得分:2)
现在你总是有起源。 “逻辑高度”现在是:
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)
这是一个复杂(但完整)的解决方案:
答案 5 :(得分:-1)
我试图这样做,相信我,我无法做到。 如果您拥有TScrollBox内部控件的实例,则可以使用它们来计算(不精确)该区域。