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.
有人有類似的問題,可以共享一個可能的解決方案?
我看不出你使用的代碼有什麼問題。當您指定'Self'作爲它的所有者時('TComp1.Create(Self)'),請不要釋放'FComp1'。店主會照顧它的發佈。但即使這樣也不應該引起你描述的問題。你可以自由地將'TComp2'的實例傳遞給不同的表單並訪問它的'Comp1'屬性。例如,你是不是錯誤地稱'Comp1.Free'? – TLama
爲什麼你要爲擁有Owner的內部組件調用FreeAndNil? – MBo
嗨。 TLama和MBo,我不使用「Free」。這個小的組件測試足以產生錯誤。 我習慣使用FreeAndNil。我知道當我使用「Self」創建對象時,沒有必要使用它。但問題不在於強制釋放對象。相信是Delphi XE中的一個bug。 – Delphiman