2014-10-19 38 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;