2014-04-03 43 views
0

我遇到了Delphi XE在designtime中訪問從另一個組件派生的只讀屬性的問題,只有在有問題的組件是專用窗體或數據模塊的情況下。讀取已發佈的只讀屬性的訪問衝突

我有一個「Comp1」組件和一個「Comp2」。在「Comp2」組件中,有一個已發佈的讀物「Comp1」唯一的屬性。

植物的「器Comp1」「Form1的」組件。我專門爲「Form1」生成「Form2」。如果我嘗試訪問「Comp1」財產「Form2」它創建一個「訪問衝突」

只在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

我看不出你使用的代碼有什麼問題。當您指定'Self'作爲它的所有者時('TComp1.Create(Self)'),請不要釋放'FComp1'。店主會照顧它的發佈。但即使這樣也不應該引起你描述的問題。你可以自由地將'TComp2'的實例傳遞給不同的表單並訪問它的'Comp1'屬性。例如,你是不是錯誤地稱'Comp1.Free'? – TLama

+0

爲什麼你要爲擁有Owner的內部組件調用FreeAndNil? – MBo

+0

嗨。 TLama和MBo,我不使用「Free」。這個小的組件測試足以產生錯誤。 我習慣使用FreeAndNil。我知道當我使用「Self」創建對象時,沒有必要使用它。但問題不在於強制釋放對象。相信是Delphi XE中的一個bug。 – Delphiman

回答

0

如何找不到問題的原因。 我更改屬性爲「公開」,並在需要時通過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; 

感謝您的關注。