访问冲突读取已发布的只读属性

时间:2014-04-03 12:33:25

标签: delphi properties components access-violation readonly

我在使用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.

有人有类似的问题可以分享可能的解决方案吗?

1 个答案:

答案 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;

感谢您的关注。