Delphi中的流式表单布局

9
我们开发了一款软件,在该软件中,根据不同的情况,在各种输入屏幕上显示和隐藏一些控件。当我们隐藏一个控件时,该控件占用的空间仍然保留,因此在具有较多控件的屏幕上布局看起来非常糟糕。我们的客户不喜欢这种情况,并要求我们做出改变。
我的问题是: 是否有一种方法可以创建流式布局,使得当一个控件被隐藏时,其余的控件会自动调整以填补控件留下的空白处,当控件显示时它们应该为控件自动让路并相应地调整自己。
我知道我们可以通过编码实现这一点,但那将需要在每个屏幕上编写大量代码以调整布局。我正在寻找一些可以减少每个输入屏幕中不必要的代码量和错误率的方法。
请提供一些更少出错的方法,以便摆脱每个输入屏幕中不必要的代码。
5个回答

10

我认为你最好的选择是使用一个在运行时处理vcl控件在表单上布局的组件(取决于你定义的条件)。我建议你尝试使用Devexpress ExpressLayout Control

你可以在这里找到两个很棒的演示视频

alt text
(来源:devexpress.com

你可以查看这些功能

自动管理 - 控制组和单独的控件元素由布局控件自动管理。您不用担心每个像素的位置。

表单自动调整大小 - 表单可以自动调整大小以最适合其内容。

再见。


这个组件能让我们拥有自己的屏幕布局吗?还是会限制我们创建布局? - Yogi Yang 007
经过查看ExpressLayout的详细信息,它似乎是一种接口,允许最终用户根据自己的需求自定义布局。这不是我需要的。最终用户将无法修改任何内容。当任何控件被隐藏或显示时,布局应自动调整。 - Yogi Yang 007
2
@Yogi Yang 007,这个组件允许最终用户自定义布局,这是正确的,但这不是此控件的唯一功能,也不是我推荐它的原因。 - RRUZ
+1 for (new) LayoutControl!您还可以通过代码控制其行为。如果隐藏一个控件,其他控件将填充该空间。使用此控件,我们的所有表单始终完美对齐。 - Birger
对于DevExpress的LayoutControl,我给出+1的评价。我认为它可以完成任何你想要的功能。 - yozey

4

现在,我不确定您的布局有多复杂,但我猜您可以使用TFlowPanel和/或TGridPanel来完成此操作。Flowpanel对于更改可见性的组件具有很好的处理能力。我不确定网格面板如何处理相同的情况...


该软件是为医生设计的。它包含许多输入控件,其中一些屏幕非常复杂,根据屏幕顶部的各种选择和用户权限显示和隐藏控件。 - Yogi Yang 007
3
我会选择流式面板。尝试将相关组件分组到面板或框架中,并将此面板与其他面板一起放置在流式面板中。当您隐藏一个面板时,其他面板将使用可用的空间。 网格面板可能对此用途过于有限。 - Vegar

1
你动态隐藏的是什么控件?自动填充空间是指什么?
我不知道是否这么简单:将控件放在面板上,并使用align alTop/alClient/alBottom。当你隐藏一个面板时,所有其他面板都会自动向上移动。 但有一个问题:如果你想再次显示一个面板,面板的顺序有时可能会被搞乱...可以通过手动设置.Top属性或通过设置.Height := 1来“隐藏”来解决这个问题。

这就是FlowPanel比普通面板更好处理顶部对齐子控件的地方。;-) - Vegar
1
是的,你说得对,但FlowPanel是D2007+吗?我们不知道他在使用哪个Delphi版本... - André
我们正在使用Delphi 6和2006版本。目前没有升级到其他版本的计划,也不打算在近期进行升级。 - Yogi Yang 007

0
我在处理复杂布局时,通常会将其分成几个选项卡。这样做有两个好处。一方面可以简化表单布局,另一方面可以根据其他选项卡中的选择来显示或隐藏整个选项卡。

0

Raize Components有一个TRzFlowPanel UI组件,可以完全满足您的需求。

使用TRzFlowPanel在表单上放置一个空的流式面板。传统面板和流式面板之间的主要区别在于控件的放置方式。在传统面板中,您将控件(如按钮)放置在特定位置。您可以使用鼠标自由移动该控件到面板内的任何位置。在流式面板中,每个控件都放置在特定位置,无论您用鼠标放置在哪里。自动位置由FlowStyle属性控制。例如,使用默认的FlowStyle属性LeftRightTopBottom,您添加到流式面板的第一个控件会自动吸附到左上角。您添加的第二个控件会自动吸附到第一个控件旁边,以此类推。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接