2014-10-19 33 views
0

我有一個組件,它具有TGlowEffect的TImage。我已經安裝了它,並且它在窗體上可見。我可以改變發光效果參數,但是當我運行該程序時,程序崩潰Rad Studio?將TGlowEffect添加到派生的firemonkey中TImage組件

這是我的代碼。

type 
    TGlowImage = class(TImage) 
    private 
     FGlowEffect: TGlowEffect; 

     procedure SetGlowEffect(const Value : TGlowEffect); 

    protected 

    public 
     constructor Create(AOwner : TComponent); override; 
     destructor Destroy(); override; 

    published 
     property GlowEffect : TGlowEffect read FGlowEffect write SetGlowEffect; 
    end; 

procedure Register; 

implementation 

procedure Register; 
    begin 
    RegisterComponents('SomeCompany', [TGlowImage]); 
    end; 

{ TGlowImage } 

constructor TGlowImage.Create(AOwner : TComponent); 
    begin 
    inherited; 
     FGlowEffect := TGlowEffect.Create(Self) 
    end; 

destructor TGlowImage.Destroy(); 
    begin 
    if(Assigned(FGlowEffect)) then 
     FreeAndNil(FGlowEffect); 
    inherited; 
    end; 

procedure TGlowImage.SetGlowEffect(const Value : TGlowEffect); 
    begin 
    FGlowEffect.Assign(Value); 
    end; 

我不知道我錯過了什麼,但它一定是相當糟糕。

任何幫助,將不勝感激。

+0

「該程序崩潰RAD Studio」不是一個有用的問題描述。你有錯誤信息嗎?如果是這樣,它說什麼?在測試之前不要安裝組件。您可以通過在測試應用程序的代碼中創建它並將參數設置爲不同的值來實現此目的;如果它不起作用,您可以輕鬆使用調試器來確定原因。一旦你完全測試了它,*然後*你安裝它。 – 2014-10-19 05:01:54

+0

不是崩潰的原因,但在你的析構函數中沒有必要在FreeAndNil之前調用Assigned。 FreeAndNil可以安全地用一個零參考來調用。 – 2014-10-19 07:10:55

回答

1

問題是,您不能將TGlowEffect分配到TGlowEffect。如果您運行代碼,您將收到一個EConvertError異常(TGlowEffect無法分配給TGlowEffect)。 我認爲你只能使用標準TImage並將TGlowEffect添加爲ChildComponent,或者應該將TGlowEffect實現爲只讀屬性,以便可以訪問該效果的屬性。

TGlowImage=class(TImage) 
private 
    FGlowEffect: TGlowEffect; 
public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy(); override; 
published 
    property GlowEffect: TGlowEffect read FGlowEffect; 
end; 

{ TGlowImage } 

constructor TGlowImage.Create(AOwner: TComponent); 
begin 
    inherited; 
    FGlowEffect:=TGlowEffect.Create(Self); 
    Self.AddObject(FGlowEffect); 
end; 

destructor TGlowImage.Destroy(); 
begin 
    FreeAndNil(FGlowEffect); 
    inherited; 
end;