2014-10-19 2 views
0

У меня есть компонент, который я получил из TImage, который имеет TGlowEffect. У меня он установлен, и он виден на форме. Я могу изменить параметры эффекта свечения, но когда я запускаю программу, программа разбивает Rad Studio?Добавление TGlowEffect к полученному компоненту TImage от firemonkey

Вот мой код.

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» не является полезным описанием проблемы. Вы получили сообщение об ошибке? Если да, то что он говорит? Не устанавливайте компоненты, пока вы их не протестировали. Вы делаете это, создавая его в коде в тестовом приложении и устанавливая параметры для разных значений; если он не работает, вы можете легко использовать отладчик, чтобы определить, почему. После того, как вы тщательно протестировали его, * затем * вы его установите. –

+0

Не причина аварии, но в вашем деструкторе нет необходимости вызывать Assigned перед FreeAndNil. FreeAndNil можно безопасно вызвать с помощью ссылки nil. –

ответ

1

Проблема в том, что вы не можете назначить TGlowEffect на номер TGlowEffect. Если вы запустите код, вы получите исключение EConvertError (TGlowEffect не может назначить TGlowEffect). Я думаю, вы можете использовать только стандарт TImage и добавить TGlowEffect в качестве ChildComponent, или вы должны реализовать TGlowEffect как свойство readonly, чтобы вы могли получить доступ к свойствам эффекта.

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; 
Смежные вопросы