【问题标题】:Delphi. Firemonkey. TListbox. Is scrollbar visible?德尔福。火猴。列表框。滚动条是否可见?
【发布时间】:2015-07-31 17:56:05
【问题描述】:

我想通过 ListBox 项目数调整我的表单高度 - 在滚动条可见时增加高度。 如何知道滚动条在 TListbox 中是否可见或不可见? 因此,VCL(基于 Handle)有大量信息,但 FMX 没有。 懒惰的方法:

ListBox1.Items.Count * Round(ListBox1.ItemByIndex(0).Height)

此方法无法正常工作,因为不同机器上的表单边框和标题可能不同。

【问题讨论】:

    标签: delphi listbox firemonkey delphi-xe5


    【解决方案1】:

    要调整表单的高度或宽度以适应某些内容,您应该使用表单的ClientWidthClientHeight 属性,而不是WidthHeight

    ClientWidthClientHeight 保存没有边框、标题和菜单区域的表单尺寸。

    【讨论】:

    • 这与确定 FMX TListBox 滚动条是否可见有什么关系?
    • 是的,当然。我忘记了这个属性——走错路了。谢谢!它解决了我的麻烦,但不回答问题 - 如何知道滚动条是否可见。
    • @KenWhite 因为 OP 提到由于表单的边框和标题,他的计算高度的方法不起作用。
    【解决方案2】:

    如果父控件的客户端宽度与其宽度相同,则垂直滚动条不可见。您可以通过检查样式来确定滚动条的大小。例如:

    if (VertScrollBox1.ClientWidth = VertScrollBox1.Width) then
      VerticalScrollBarVisible := False;
      VerticalScrollBarWidth := 0;
    else
    begin
      VerticalScrollBarVisible := True;  
      VerticalScrollBarWidth := VertScrollBox1.StylesData['vscrollbar.width'].AsExtended;
    end;
    

    【讨论】:

    • 在这个解决方案中,边框厚度丢失了。当我使用以下检查VScrollVisible := ListBox.ClientWidth + BorderWidth < ListBox.Width 时,这种方法运行良好。不幸的是,我没有找到一种简单的方法来获取边框宽度。我的解决方法是通过ListBox.Width - ListBox.ClientWidth 在启动时(使用空列表)计算BorderWidth
    • 计算(列表框的)边框宽度可能取决于平台。在 Windows 和 OSX 上,“背景”样式元素是 TStyleObject。在 iOS 和 Android 上,它是一个具有“Stroke.Thickness”属性的 TRectangle,您可以从中获取边框宽度。是否可以将您的 TListBox 放在 TRectangle 中以使您的计算跨平台保持一致?
    • 是的,我知道边框取决于平台和样式。我不认为需要一个苍白的矩形。 ListBox.Width 返回外部尺寸,而我从 ListBox.ClientWidth 获取内部尺寸。只要不存在滚动条,区别就必须是边框。我的解决方法是在启动时(FormShow)用一个空列表测量这个边框大小。
    • 对不起,我在最后一条评论中提到的方法在任何情况下都不起作用。我希望边框大小也可以从这种样式数据中获取,但我还没有找到可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多