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

时间:2009-10-12 03:33:42

标签: delphi tagging

请看一下这个截图

alt text http://www.maclife.com/files/u18/Yep3-big.jpg

我认为这些是'标签面板'的主要特征:

1)面板上的每个标签都是独立控件,可以单击

2)当没有足够的空间显示当前行中的下一个标记时自动换行。

3)每个标签的圆角矩形边框是一个很好的功能。

我想在Delphi中实现类似的功能,是否有现成的控件来执行此操作?如果没有,那么实施这种控制的最佳方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:7)

当您使用最近的Delphi版本时,请使用TFlowPanel和一些适当的标记控件。一个简单的TButton或TLinkLabel就可以做到这一点。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

Delphi 7中有两种可能的自定义对齐解决方案。您可以通过从TCustomPanel派生并覆盖AlignControls()方法来创建自己的流程板,也可以将对齐设置为alCustom并处理OnAlignPosition事件。

我想我会选择TCustomPanel衍生版本。 Delphi 2007形式的TFlowPanel使用了这个选项 - 但我必须承认,我从来没有尝试过我的自我......