【问题标题】:Project-wide custom component项目范围的自定义组件
【发布时间】:2015-08-17 15:33:13
【问题描述】:

我可以有一个自定义的可视化组件(一个稍微修改过的 TSpeedButton),它可以被拖到表单中并且只存在于某个项目中,而不需要在 Delphi 范围内注册?我也不想使用 TFrame 模拟按钮。它不应该对其他 Delphi 项目可用。

【问题讨论】:

    标签: delphi delphi-6


    【解决方案1】:

    很遗憾,没有。在设计时使用该组件需要将其放入安装到 IDE 中的包中。但是,您可以根据需要在每个项目的基础上启用/禁用已安装的软件包。

    【讨论】:

    • 谢谢。启用和禁用软件包不是正确的解决方案。看来我需要忍受现状了。
    【解决方案2】:

    您也许可以使用所谓的插入器类。像这样定义您的自定义组件:

    type
      TSpeedButton = class(Buttons.TSpeedButton)
        ....
      end;
    

    注意类名与父类相同。这是使插入技术发挥作用所必需的。

    将您的自定义设置放入此插入器类中。当您在设计器中构建 UI 时,请使用调色板中的 TSpeedButton。确保声明您的自定义组件的单元列在每个包含自定义组件之一的表单的使用子句中。

    在流式传输表单的运行时,您的插入组件将被实例化,而不是原始组件。

    这样做的缺点是您无法安排在设计时显示您的自定义。如果您需要设置 vanilla 组件中不存在的属性,则必须在运行时完成。这是您不想在 IDE 中安装任何东西的结果。

    如果这种方法不能满足您的需求,那么您应该使用设计时包以通常的方式制作组件。如果您愿意,您可以安排该包仅包含在特定项目中。

    【讨论】:

    • 目前我几乎不敢相信这种技术有效,但如果是真的,最大的缺点是它会改变所有 SpeedButtons 的行为,我需要两个类都可用。
    • 这种技术确实有效并且众所周知。至少在这里众所周知。如果您设置组件的运行时属性以打开不同的行为,您可以安排您的自定义组件的行为不同。但这并不漂亮。您可能会更好地打直板并制作包裹,而不是试图与系统作斗争。
    • 似乎在运行时组装一个表单是一个更好的解决方案,当然要放弃可视性。
    • @Paul 在运行时组装解决方案并不能回答您的问题。我为您提供了唯一满足问题要求的东西。由您决定如何处理这些信息。
    • 看来,你可以尝试在TForm优势声明中显式定义父类,比如:SpeedButton1: Vcl.Buttons.TSpeedButton; SpeedButton2: Unit1.TSpeedButton;可以吗?
    猜你喜欢
    • 2010-12-03
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多