Classen, Komponenten zur Laufzeit erstellen und Events festlegen



  • Hallo,

    ich möchte folgendes erreichen:
    Eine Classe schreiben die einen Button beinhaltet und die für den Button nötigen Funktionen. Das ist das was ich bisher hinbekommen hab:

    class S1
    {
     public:
            TButton *ButtonTest;
            S1();
            ~S1(){}
            void __fastcall OnButtonTestClick(TObject *Sender);
    };
    void __fastcall S1::OnButtonTestClick(TObject *Sender)
    {
     ButtonTest->Height=100;
     ButtonTest->Width=100;
    }
    S1::S1(void)
    {
     ButtonTest = new TButton(this);
     ButtonTest->Left=100;
     ButtonTest->Top=100;
     ButtonTest->Height=25;
     ButtonTest->Width=25;
     ButtonTest->Caption="S";
     ButtonTest->Parent=Form1;
     ButtonTest->OnClick = OnButtonTestClick;
    }
    

    Der Kompiler mekert nicht ... also von der Syntax wohl alles okay ..... wenn ich das Programm nun starte und auf den in der Klasse generierten Button clicke dann stürzt die anwendung ab.

    Hat jemand einen vorschlag wie ich das hinbekomme?
    Die FAQ und das Forum hab ich schon durchsucht und hat mir auch schon sehr weiter geholfen aber weiter komme ich nicht.

    Schonmal Danke für die Antwort bzw. vorschläge.
    Heiko



  • ich sehe gerade keinen fehler im code.
    aber du könntest den konstruktor und destruktor auch mit __fastcall aufrufen.

    probier mal

    void __fastcall S1::OnButtonTestClick(TObject *Sender)
    {
     TButton *Button = dynamic_cast<TButton *>(Sender);
     if(Button == NULL)
        return;
     Button->Height=100;
     Button->Width=100;
    }
    

    habe aber keinen BCB zum testen da.



  • Du setzt den Owner von Button auf "this", d.h. ein Objekt der Klasse S1, obwohl S1 gar keine VCL-Komponente ist, d.h es kann sein, daß hierfür der falsche Konstruktor aufgerufen wird: Button(HWND hWnd).
    Prüf mal im Debugger, wo er genau abstürzt.

    Meines Erachtens macht es keinen Sinn, einen Button mit Hilfe einer normalen Klasse zu kapseln, da dieser Button ja keinen Zugriff auf andere Form-Komponenten hat, d.h die OnClick-Methode sollte ja mehr können, als die Buttongröße neu zu setzen, oder?



  • Hi .....
    Danke euch für die schnelle Antwort.

    Danke BigNeal:
    Hab deinen Code in das "OnClick"-Event geschrieben und nun funktioniert es ohne das es abstürzt ....

    An Th:
    Ja die "OnClick"-Funktion soll mal mehr können bzw. es sollen andere Events Programiert werden ... das diente nur als beispiel bzw. zum ausprobieren ob und wie es Funktioniert.

    Besten Danke
    Heiko


Log in to reply