【问题标题】:Implementing a 'tag panel' control in Delphi?在 Delphi 中实现“标签面板”控件?
【发布时间】:2009-10-12 03:33:41
【问题描述】:

请看这个截图

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

我认为这些是这种“标签面板”的主要特点:

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

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

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

我想在 Delphi 中实现类似的功能,是否有现有的控件可以做到这一点?如果没有,实现这种控制的最佳方式是什么?

谢谢。

【问题讨论】:

标签: delphi tagging


【解决方案1】:

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

【讨论】:

  • 感谢 Uwe,不幸的是,我使用 D7。升级目前不是一种选择。
【解决方案2】:

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

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

【讨论】:

  • 谢谢你的提示 Rob。如果我希望这些标签能够通过拖放重新定位,您有什么建议吗?例如,将第 2 行的第二个标签拖放到第 1 行的开头。谢谢。
  • 检测鼠标按下和足够的鼠标移动事件以区分拖动和单击,然后调用SetCapture 进入“拖动”模式。在等待鼠标向上事件时处理鼠标移动事件,此时您可以重新排序标签。 (这整个问题是一个概述问题。如果您对任何事情有具体问题,请提出一个问题,人们可以在其中做出回应,而无需在一个答案中涵盖六个不同的问题。)
【解决方案3】:

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

我想我会选择 TCustomPanel-derivative 选项。 Delphi 2007 中的 TFlowPanel 使用该选项 - 但我必须承认,我自己从未尝试过...

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2022-06-10
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多