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

Delphi 如何找到TScrollBox的实际大小(“逻辑区域”),delphi,Delphi,我需要找到TScrollBox的整个大小(也称为“逻辑区域”),与通过Width和Height属性(或ClientWidth ClientHeight)获得的可见区域相反 我想在这个滚动框中创建一些控件。其中一个(称为TViewer)需要与TScrollBox本身一样高。问题是,在创建过程中,TScrollBox向下滚动以显示上次创建的控件。因此,使用Top=1将不起作用,因为我的控件的Top=1不是逻辑区域的顶部 Delphi 7我试过这么做,但相信我,我做不到。 如果您有TScrollBo

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

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



Delphi 7

我试过这么做,但相信我,我做不到。 如果您有TScrollBox内的控件实例,您可以使用它们来计算(不精确地)面积。

查看滚动条:

ScrollBox1.VertScrollBar.Range
ScrollBox1.HorzScrollBar.Range
如果scrollbox逻辑区域不大于物理区域(在这种情况下,滚动条不可见),则它可以小于高度和宽度

或者使用此选项来获得两者的最大值:

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;
编辑 从@table comments,我可以添加逻辑高度和/或宽度不是问题。如果要添加占据滚动条所有高度的控件,请使用上述计算中的AHeight,但将顶部设置为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;

可能
ScrollBox.HorzScrollBar.Range
ScrollBox.VertScrollBar.Range
+相应的
.Position
就是您所需要的。

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

  • 我在TScrollBox.create期间创建了我的第一个子控件(当TScrollBox还没有滚动条时)
  • 设置子项。顶部:=1
  • 创建其余的子控件(这可能会强制TScrollBox显示滚动条)
  • 向上滚动滚动滚动框
  • 使用上述解决方案之一计算TSCRLLBOX的高度

  • 我不确定我是否完全理解您想要做什么,但要将整个区域定义为“可滚动”,您必须编写ScrollBox.HorScrollBar.Range+ScrollBox.Clientwidth(垂直部分也是如此)。滚动框总是从总大小中减去可见的“页面”大小。因此,如果定义高度为1000像素,显示100像素,则滚动范围为900。你必须加上八号才能得到剩下的

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

    既然您想创建一个与完整的可滚动区域一样高的控件,我想您是在创建一个编辑器吧

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

    这是我不久前为拉扎勒斯和弗里帕斯卡写的一本书。如果将消息添加到uses子句中,并在消息处理程序前面加上WM而不是TLM,它将在Delphi下编译

    (代码变长,必须使用外部链接):

  • 将组件(如TLabel)放到TScrollBox上
  • 将组件的左侧和顶部属性设置为0
  • 将组件的Visible属性设置为False
  • 现在你总是有了原点。“逻辑高度”现在为:


    如果有人解释怎么做,我会很高兴。这正是我现在正在做的。但这是残酷的方式:)我想要优雅的方式。很抱歉,没有优雅的方式。它不太管用。您的解决方案很适合获取宽度和高度,并且只有在向上滚动TScrollBox时才起作用。如果没有,我如何找到真正的顶部?我想在这个滚动框中创建一些控件。其中一个必须与TScrollBox本身一样高。问题是,在创建过程中,TScrollBox会向下滚动以显示上次创建的控件。所以,使用Top=1是行不通的。我是Ulrich,你在jachguate的答案上发表了你的评论。;-)@祭坛-关于你的其他评论,Ulrich的意思是虚拟桌面位于
    -1*ScrollBox.VertScrollBar.Position
    @祭坛:没问题。类似的事情经常发生。:-)
    myScrollBox.Height + (myOriginControl.Top * -1);