我在使用Delphi XE时遇到问题,只能在有问题的组件是专用表单或数据模块的情况下,才能在设计时访问从另一个组件派生的只读属性。
我有" Comp1" 组件和" Comp2" 。在" Comp2" 组件中,只有已发布的阅读" Comp1" 属性。
在" Form1" 中植入" Comp1" 组件。我专注于" Form1" 生成" Form2" 。如果我尝试访问" Form2" 中的" Comp1" 属性,则会创建"访问冲突& #34; 即可。
仅在Delphi XE中发现了此问题。在Delphi 6中,测试并正常工作。我实际上没有在新版本XE3,XE4或XE5上进行测试。
在下面的代码中,我展示了案例。
Unit UnTestComp;
Interface
Uses Classes, StdCtrls;
Type
//Component 1
TComp1 = Class(TComponent)
Private
FNome: String;
FEdit: TEdit;
Function GetText: String;
Procedure SetText(Const Value: String);
Public
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
Published
Property Nome: String Read FNome Write FNome;
Property Texto: String Read GetText Write SetText;
End;
// Component 2
TComp2 = Class(TComponent)
Private
FComp1: TComp1;
Protected
Public
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
Published
Property Comp1: TComp1 Read FComp1;
End;
Procedure Register;
Implementation
Uses SysUtils, Dialogs;
Procedure Register;
Begin
RegisterComponents('CompReadOnly Test', [TComp1, TComp2]);
End;
{ TComp1 }
Constructor TComp1.Create(AOwner: TComponent);
Begin
Inherited;
FEdit := TEdit.Create(Self);
End;
Destructor TComp1.Destroy;
Begin
FreeAndNil(FEdit);
Inherited;
End;
Function TComp1.GetText: String;
Begin
Result := FEdit.Text;
End;
Procedure TComp1.SetText(Const Value: String);
Begin
FEdit.Text := Value;
End;
{ TComp2 }
Constructor TComp2.Create(AOwner: TComponent);
Begin
Inherited;
FComp1 := TComp1.Create(Self);
FComp1.Name := 'Comp1';
End;
Destructor TComp2.Destroy;
Begin
FreeAndNil(FComp1);
Inherited;
End;
End.
有人有类似的问题可以分享可能的解决方案吗?
答案 0 :(得分:0)
如何找不到问题的原因。 我将属性更改为“public”,并在需要时通过RTTI访问。 以前,由于遗留代码,该属性在Delphi 6中“发布”,因为我们只能通过RTTI访问该属性是否已发布。目前,在Delphi XE中,由于不再需要RTTI的改进功能。
<强>示例:强>
TComp2 = Class(TComponent)
Private
FComp1: TComp1;
Protected
Public
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
Property Comp1: TComp1 Read FComp1;
End;
感谢您的关注。