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 Konstruktor

    ein 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?


Anmelden zum Antworten