【发布时间】:2013-07-20 06:02:04
【问题描述】:
我正在开发一个组件,但我不能让它考虑在设计时设置的属性。
以下是组件的摘录:
TRVEditFrame = class(TFrame)
...
private
{ Private declarations }
FRVEditor:TCustomRichView;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
protected
function GetRVEditor:TCustomRichView;
procedure SetRVEditor(Editor:TCustomRichView);
published
property RVEditor:TCustomRichView read GetRVEditor write SetRVEditor;
end;
...
constructor TRVEditFrame.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetRVEditor(FRVEditor);
...
end;
function TRVEditFrame.GetRVEditor:TCustomRichView;
begin
Result:=FRVEditor;
end;
procedure TRVEditFrame.SetRVEditor(Editor:TCustomRichView);
begin
if Assigned(Editor) then begin
FRVEditor:=Editor;
end;
end;
我可以注册组件,将其放置在表单中并在设计时设置 FRVEditor。
问题是当我运行应用程序时,SetRVEditor() 中的代码没有执行,因为 Editor=nil。
如果我能够在设计时设置 FRVEditor,为什么它在运行时为=nil?我该如何解决这个问题?
由于解释太长,我在此处添加我的其他 cmets
@Kenneth,谢谢你的回复
- TCustomRichView 是第三方组件集的一部分,用于管理 超文本文档,并有 4 个更专业的后代,而你 是的,TCustomRichView 不应该在实际应用中使用。
- TRVEditFrame 是我正在开发的组件。
我的组件背后的想法是创建一个带有菜单、快捷方式、弹出菜单等的单个框架(因此选择组件 TFrame)来管理 4 个 TCustomRichView 后代中的每一个。
这正是我使用 TCustomRichView 的原因:我可以将 4 个后代中的任何一个“插入”到我的组件框架中。这与 TDatasource 的原理相同,可以与 TTAble 和 TQuery 连接(它们具有相同的祖先)。
我想 VCL 没有将 RVEditor 链接到我在设计时设置的 TCustomRichView 后代的原因是因为 TFrame 没有 OnCreate 事件,例如 TForm 。
到目前为止,我设法通过在托管 TRVEditFrame 的 TForm.OnCreate 中手动调用 TRVEditFrame.SetRVEditor 解决了这个问题,但我想知道是否有更好的方法可以做到这一点,这就是我在这里寻求建议的原因。
我知道您也可以为 TFrame 创建 OnCreate 事件,也许我可以将 TRVEditFrame.SetRVEditor 放在那里,但我想知道是否有更好的方法。
关于您评论的最后一部分,我知道注册程序,但考虑到该组件正在开发中。当我开发组件时,我从不将它们安装在 IDE 中,因为我更喜欢将测试内容保留在“官方”之外。 我使用这种方法,一旦组件准备好,我就会使用您提到的程序注册它。如果我想为同一个组件实现其他功能,我可以在测试功能上工作,同时继续使用我在 IDE 中拥有的“官方”功能。
【问题讨论】:
-
什么是 TCustomRichView?它看起来像一个类。所以属性是一个参考。实际对象在哪里?它存在于表格中吗?对象在用作属性分配源之前是否已经实例化?此外,构造函数中的 SetRVEditor(FRVEditor) 毫无意义。摆脱它。
-
@David TcustomerRichView 是一个类,并且该属性是对要链接的另一个类的引用 是的,该对象在设计时以与 TRVEditFrame 相同的形式删除。 “对象在用作属性分配源之前是否已实例化?”我不确定你在这里的意思。 TRVEditFrame.RVEditor 在设计时指定。我回答你的问题了吗
-
@pio pio:当您查看 DFM (alt+F12) 时,您是否看到属性设置为您分配的值?
-
@AlexSC 是的,属性 RVEditor 设置为正确的对象
-
@pio pio:您能告诉我们您使用的是哪个 Delphi 版本吗?您是否在此框架中使用视觉表单继承?
标签: delphi properties runtime components design-time