在Delphi中实现“标签面板”控件?

5
请查看此屏幕截图。 alt文本 http://www.maclife.com/files/u18/Yep3-big.jpg 我认为这些是“标签面板”的主要特点:
1)面板上的每个标签都是一个独立的控件,可以单击。
2)当当前行没有足够的空间来显示下一个标签时,自动换行。
3)每个标签的圆角矩形边框是一个很好的功能。
我想在Delphi中实现类似的功能,有现成的控件可以做到吗?如果没有,最好的实现方式是什么?
谢谢。

另一个这样的“标签面板”的例子:http://www.macgenealogy.org/images/screen/yep-list.jpg您可以在右侧检查标签部分。 - Edwin Yip
3个回答

7
当您使用最新的Delphi版本时,可以使用TFlowPanel和一些适当的控件来处理标签。一个简单的TButton或TLinkLabel应该就能胜任。

谢谢Uwe,不幸的是,我使用的是D7。升级目前不是一个选项。 - Edwin Yip

3

每个可点击的标签不一定要成为自己的控件,它只需要是你可以检测到被点击的区域即可。

假设你将每个区域表示为Windows区域。您可以根据其文本使用TCanvas.TextExtent函数计算每个区域的宽度。然后使用CreateRectRgn等函数创建区域。对于圆角,请尝试使用CreateRoundRectRgn。您可以使用PtInRegion函数测试每个区域的鼠标事件。您可以使用FrameRgn绘制其周围的边框。最后的障碍是将它们绘制在屏幕上,使它们都适合其中。您正在创建区域并且知道它们的宽度,因此将标签分配给一行,直到没有空间,然后开始下一行。

谢谢你的提示,Rob。如果我想通过拖放重新定位这些标签,你有什么建议吗?例如,将第二个标签从第2行拖到第1行开头。谢谢。 - Edwin Yip
检测鼠标按下和足够的鼠标移动事件以区分拖动和单击,然后调用 SetCapture 进入“拖动”模式。在等待鼠标松开事件时处理鼠标移动事件,此时您可以重新排序标签。(整个问题都是一个概述性问题。如果您有任何具体问题,请发起一个问题,在那里人们可以回复而不必在单个答案中涵盖半打不同的问题。) - Rob Kennedy

1

在Delphi 7中,有两种可能的自定义对齐方式解决方案。你可以通过继承TCustomPanel并覆盖AlignControls()方法来创建自己的FlowPanel,或者将对齐方式设置为alCustom并处理OnAlignPosition事件。

我猜我会选择TCustomPanel派生选项。Delphi 2007中的TFlowPanel使用了这个选项-不过,我必须承认,我从未尝试过...


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