【问题标题】:Someway to override Delphi default procedures at Design Time?在设计时以某种方式覆盖 Delphi 默认程序?
【发布时间】:2011-01-08 00:52:30
【问题描述】:

在设计时以某种方式覆盖 Delphi 默认程序?

我需要在设计时重写 InstanceSize,我在运行时使用 FastCode 方法:

FastcodeAddressPatch(FastcodeGetAddress(@SInstanceSize), @TWinControl.RfInstanceSize);

但是,有没有办法在设计时做到这一点?

Tks 建议

【问题讨论】:

    标签: delphi overriding design-time


    【解决方案1】:

    “设计时间”实际上只是“运行时间”,但在 IDE 的上下文中,而不是在程序的上下文中。将您的代码放入设计时包中并将其加载到 IDE 中。 IDE 将调用包单元中的所有Register 过程,此时您可以运行所需的任何代码。

    1. 创建一个新的包项目(.dpk 文件)。
    2. 设置项目首选项,使其成为设计时包。
    3. 向其中添加一个新的空白单元。
    4. 向名为Register 的接口部分添加一个过程。它必须大写 R,其余小写。
    5. 按照您的意愿实施该过程(例如通过将您的电话拨打到 FastcodeAddressPatch 那里)。
    6. 编译并安装包。

    我有点担心您在第 5 步中尝试执行的操作,但我会让您自己解决。

    【讨论】:

    • 我想覆盖 TWinControl 的 DefineProperties。我怎么能像你说的那样做?
    • “我所说的方式”与覆盖或修补任何内容无关。它只与 where 有关,您可以放置​​代码以确保它在 when 您想要的时候运行。 做什么由你决定。 (如果您想知道如何修补 VCL 功能,请在一个新问题中提出。根据您发布的内容,我想您已经知道如何做这部分了。)
    • 放代码的问题,不仅仅是加代码。问题是因为没有调用代码。为什么 ?因为没有从它继承类的情况下无法覆盖 TwinControl 过程。我用来执行此操作的递归是使用 FastcodeAddressPatch 来覆盖该方法。但它只在运行时工作。
    • 好吧,如果我在注册过程中添加 FastcodeAddressPatch,它就不起作用。为什么 ?我不知道。在运行时使用它时,它必须是项目中的第一个单元,也许这给了我们一个关于它为什么不在那里运行的提示。
    • 没用,但我认为是因为角色更深,但这是正确的方式。
    【解决方案2】:

    如果您所说的“在设计时”是指“在表单设计器中更改组件的行为方式”,那么您确实不应该尝试这样做。表单设计器是 IDE 的一部分,IDE 是在 BDS.exe 中运行的所有 Delphi 代码。如果您在表单设计器下更改 TObject,您会在整个 IDE 中更改它,这可能会带来灾难性的后果。

    【讨论】:

    • 我知道风险,但这是为了我的学习。你知道有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2012-03-15
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多