Problem mit selber erstellter Komponente
-
Hi Fans,
ich hab mir hier so eine fetzige Linien-Graf-Komponente geschrieben.
Nun habe ich 2 Probleme:
1. Wenn ich die Kompo auf eine Form ziehe und im OI meine neu hinzugekommenen Eigenschaften verstelle (Farben, Xmin-Werte usw.), werden diese Einstellungen nicht übernommen und ich bin gezwungen diese nochmal im Quellcode der Form extra zu setzten.
Beispiel:
Eigenschaft "RAP_BackgroundColor" wird im OI auf clWhite gesetzt. Juckt aber keinen, so dass ich im Konstuktor oder sonstwo die Eingenschaft nochmal "per Hand" setzen muß.
2. Die Default-Werte der Properties (also die für den OI) werden einfach ignoriert und ich muß die Kompo in ihrem Konstruktor nochmal selbst auf die Defaultwerte setzen.
Was mache ich wahrsch. falsch?
MfG F98.
-
ZU 2. Frage
ES bleibt dir nichts anderes übrig als den Default-wert für Property nochmal im Konstruktor der Kompo zu schreiben.ZU 1. Frage
Du solltes das OnChange Event der TBush etc. überschreiben
siehe dazu den Konstruktorein Beispiel:
Header::class PACKAGE arnold_analog : public TGraphicControl { private: TNotifyEvent FOnChange; //eigenes Ereignis hier deklariert protected: public: __fastcall arnold_analog(TComponent* Owner); void __fastcall Changed(void); int FStartwinkel; void __fastcall SetStartwinkel(int AStartwinkel); __published: virtual void __fastcall Paint(void); //virtual klasse des Vorgängers überschreiben __property TNotifyEvent _OnChange = {read=FOnChange, write=FOnChange}; //typ. TNotifyEvent (eigenes Ereigniss) void __fastcall StyleChanged(TObject* Sender); TBrush* HBrush; void __fastcall SetHBrush (TBrush* Value); //Hintergrund __property TBrush* _Hintergrund_P = {read=HBrush, write=SetHBrush, nodefault}; __property int Startwinkel ={read=FStartwinkel, write=SetStartwinkel, default=330}; };Konstruktor __fastcall arnold_analog::arnold_analog(TComponent* Owner) : TGraphicControl(Owner) { HBrush = new TBrush(); HBrush->OnChange = StyleChanged; [b]// HIER DAS ONCHANGE VON TBrush (HBrush) überschreiben mit [/b] [b]// mit eigener Funktion damit Propertie übernommen Wird[/b] FStartwinkel = 330; } //--------------------------------------------------------------------------- //########################################################################### //-Eregnissbehandlung, wird ausglöst, wenn __poroperty verändert wird ------- void __fastcall arnold_analog::Changed() { if (FOnChange != NULL) FOnChange(this); } //--------------------------------------------------------------------------- void __fastcall arnold_analog::StyleChanged(TObject* /*Sender*/) { Invalidate(); } //--------------------------------------------------------------------------- //########################################################################### void __fastcall arnold_analog::SetHBrush(TBrush* Value) { HBrush->Assign(Value); Changed(); } //--------------------------------------------------------------------------- void __fastcall arnold_analog::SetStartwinkel(int AStartwinkel) { FStartwinkel=AStartwinkel; if(!ComponentState.Contains(csDesigning)) { //soll einmal wärend der Laufzeit einschalten dann nicht mehr zeigerrein(0); } else { //zur entwurfszeit immer Paint(); } } //--------------------------------------------------------------------------- void __fastcall arnold_analog::Paint() { if(!ComponentState.Contains(csDesigning)) {//soll einmal wärend der Laufzeit einschalten dann nicht mehr zeigerrein(0); } else {//zur entwurfszeit immer zeigerrein(0); } } //---------------------------------------------------------------------------Hoffe das ich nichts vergessen habe....
Grüße
-
Hm, hab jetzt meine Compo so umgeschrieben, dass sie wenn ich sie auf ein Formular ziehen den Gesamten Builder zum Absturz bringt. Der Witz ist, ich weis nicht worans liegt. Der Debugger kommt weder durch den Konstruktor, Loaded() noch sonstwo rein. der Absturz erfolg also noch irgendwo davor. Woran könnte das liegen?