gpt4 book ai didi

Delphi组件属性类取决于组件的Owner类

转载 作者:行者123 更新时间:2023-12-03 05:09:00 25 4
gpt4 key购买 nike

我正在使用 RAD Studio XE5 来构建我的应用程序。

我发现尝试在 TForm 上发布属性不太实际。然后必须将其注册并安装为包,这对于繁重的开发来说是不切实际的。

因此,我决定创建一个非可视组件 (TFormPropertiesEditor),用于填充表单属性。一种标准化我的表格的方法。

该组件将被放置在基本表单上,其他所有表单都继承该表单(我们称之为 TBaseForm)。因此,该组件只会在“基本”表单上删除一次,然后通过继承,所有其他表单也会拥有它。

创建的组件将检测其所有者的类(BaseForm 或其后代),并创建一个可通过“Properties”属性访问的对象,该对象的类将以所有者类为条件。

这样,当检查 TBaseForm 上的组件时,我只能访问 TBaseFormProperties。在检查 TSecondForm 上的组件时,我还可以访问 TSecondFormProperties。只是,该组件足够智能,可以检测应将哪个 PropertyClass 公开为 Properties 属性。

组件将通过GetPropertiesClass检查表单,定义为:

function TBaseForm.GetPropertiesClass : TPropertiesClass;
begin
Result := TBaseFormProperties;
end;

function TSecondForm.GetPropertiesClass : TPropertiesClass;
begin
Result := TSecondFormProperties;
end;

每个表单都有一个相应的 TProperties 后代,如下所示:

TBaseForm ------------ TSecondForm ------------- ...
|
TBaseFormProperties -- TSecondFormProperties --- ...

例如:

如果放置组件的表单是 TBaseForm,则 FProperties 将是 TBaseFormProperties。如果表单是 TSecondForm,则 FProperties 将是 TSecondFormProperties。当然,TSecondFormProperties 将从 TBaseFormProperties 继承。

但是,当我将组件放置在表单上时,它似乎无法检测到该组件属于哪个类。

function TFormPropertiesEditor.GetPropertiesClass: TFormPropertiesClass;
begin
Result := TBaseForm(Owner).GetPropertiesClass;
end;

看起来 TBaseForm(Owner) 部分导致了问题。解释器停留在 TBaseForm 上,并且不会考虑 Owner 的类型是 TSecondForm 还是 TThirdForm。

接口(interface)

因此,为了解决 TBaseForm(Owner) 类型转换,我决定使用一个接口(interface)。因此,如果我使用声明 GetPropertiesClass 的接口(interface):

IMasterForm = interface(IInterface)
['{B6122F34-65C4-4701-8A5E-50C8DABF5516}']
function GetPropertiesClass : TFormPropertiesClass;
end;


type
TBaseForm = class(TForm, IMasterForm)
MyFormPropertiesEditor1: TMyFormPropertiesEditor;
private
{ Déclarations privées }
public
function GetPropertiesClass : UCommon.TFormPropertiesClass;
end;

以下:

function TFormPropertiesEditor.GetPropertiesClass : TFormPropertiesClass;
begin
Result := (Owner as IMasterForm).GetPropertiesClass;
end;

导致接口(interface)不受支持错误。

抽象祖先方法

然后,我决定添加一层额外的血统。我添加了一个类 TMasterForm,TBaseForm 继承自该类。此 TMasterForm 将 GetPropertiesClass 声明为抽象和虚拟:

TMasterForm = class(TForm, IMasterForm)
public
function GetPropertiesClass : TFormPropertiesClass; virtual; abstract;
end;


type
TBaseForm = class(TMasterForm)
private
{ Déclarations privées }
public
function GetPropertiesClass : UCommon.TFormPropertiesClass; override;
end;

但是,我得到了一个 AV,因为我认为 IDE 尝试访问 TMasterClass.GetPropertiesClass,这当然没有实现。

如何完成这个 TypeCasting?知道我该如何继续吗?

提前非常感谢

下载示例项目 https://www.wetransfer.com/downloads/b524438609fc04257af803a8e3dd2eca20141225161239/764d108d335b9d296c3004dfea04a54620141225161240/9c8cc0

最佳答案

这里的基本问题是 IDE 不会在设计时实例化您的表单。因此,无论您在表单类中放入什么代码,IDE都不会执行它。这是因为您没有在 IDE 中注册表单。

如果您希望 IDE 了解您的表单,那么您需要在 IDE 中注册它们。到那时,您的所有代码都变得不必要,因为您又回到了做您试图避免的事情。即向 IDE 注册表单。你陷入了第 22 条军规的困境。如果您需要 IDE 了解表单,那么您需要注册它们。此时,您也可以直接在对象检查器中显示属性。

关于Delphi组件属性类取决于组件的Owner类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27644975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com