Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:决定在运行时创建哪个组件_Delphi_Oop - Fatal编程技术网

Delphi:决定在运行时创建哪个组件

Delphi:决定在运行时创建哪个组件,delphi,oop,Delphi,Oop,问题: 表单应该具有可视组件 同一组件有两个版本具有相同的祖辈类。每种都允许不同类型的功能 根据配置参数,表单加载时应加载正确的组件。 默认情况下,其中一个组件在设计时出现在表单上。在运行时,应用程序需要决定是保留该组件还是放弃该组件,并使用与前一个组件相同的事件处理程序和属性加载另一个组件,再加上它自己的一些组件,以允许附加功能。它们不是来自同一继承分支 在OOP术语中: TGrandParent->TParent->TDesiredComponent1(在设计时存在。默认情况下加载) TGr

问题:

表单应该具有可视组件

同一组件有两个版本具有相同的祖辈类。每种都允许不同类型的功能

根据配置参数,表单加载时应加载正确的组件。 默认情况下,其中一个组件在设计时出现在表单上。在运行时,应用程序需要决定是保留该组件还是放弃该组件,并使用与前一个组件相同的事件处理程序和属性加载另一个组件,再加上它自己的一些组件,以允许附加功能。它们不是来自同一继承分支

在OOP术语中:

TGrandParent->TParent->TDesiredComponent1(在设计时存在。默认情况下加载) TGrandParent->TDesiredComponent2(需要根据配置加载)

若我尝试在运行时创建这两个组件,它就会工作,并加载正确的组件。问题是,它附带了很多事件处理程序,并且有大量这样的组件

如果能在一个地方简明扼要地做到这一点,那将是非常好的。你知道如何做到这一点吗?

有一次我用事件做了这样的把戏。但总的来说,我更喜欢更清晰、更明智的设计


老实说,有一次我使用了一个更有趣的技巧:在运行时,我找到了一个Component1 VMT并对其进行了更改,因此当调用Component1.NewInstance/Create时,Component2.NewInstance/Create实际上已经执行了。它肯定会解决您的问题:)

这就是我最后要做的-创建两个版本的component1。一个是保留旧行为,另一个是从组件2继承的。我需要保留旧版本,因为在新继承之后,全局更改组件仍然会在某些地方出现问题。任何更好的解决方案都会有帮助,但这似乎工作得很好,但没有检查内存/性能问题。
谢谢你的帮助。

这听起来并不是解决问题的正确方法。如果我是你,我会寻找更好的设计。首先,如果你在运行时决定需要哪个组件,为什么还要在设计时创建一个呢?这不就是浪费CPU周期吗(创建组件只是为了让它在几毫秒后被销毁)。其次,当这些组件具有不同的属性/方法时,您将如何访问它们?是的,我看到它们共享公共属性/方法,但是当其他组件没有此方法时,您如何确定是否可以调用“扩展”组件的某个方法?正确的方法是添加传统的抽象层(类或接口)它公开所有psoble属性和方法,然后在运行时确定何时可以访问某些属性,或者何时可以执行某些方法,并返回一些有用的结果或警告(如果不可行)。现在,这个抽象层应该只转发从两个组件的属性或方法返回的数据,或者如果组件没有该方法或属性,则返回一些预定义的结果。@DavidHeffernan两者都是自定义组件。这个应用程序非常庞大,有许多表单和位置将Component1用作设计时组件。Component2应该根据配置在所有这些位置添加功能。所以在架构上,没有太多改变组件使用的选项。我认为这听起来也不是一个好的设计。为什么不创建一个具有两种不同模式的组件?比如T形图。。。一个单一的控制,可以切换到工作在许多不同的方式。IDE中的清洁器也是如此。