Ereignisse bei dynamisch erzeugten Komponenten



  • Hallo,

    wie und wo kann man für dynamisch erzeugte Komponenten eine Ereignisbehandlungs-Routine hinterlegen?

    Also z.B. soll zur Laufzeit ein Button erstellt werden, bei dessen Anklicken irgendetwas passiert. Wie teile ich dem Compiler mit, was passieren soll, wenn es zur Erstellungszeit des Programms den Button noch nicht gibt?

    Danke im Voraus für eure Hilfe,
    GoldenAge



  • Hallo

    Siehe FAQ hier im BCB-Forum, Abschnitt Komponenten benutzen.

    bis bald
    akari



  • Ihr braucht eindeutig einen "Asche-auf-mein-Haupt"-Smiley. 😃

    Danke!



  • ...hat leider mein Problem trotzdem nicht gelöst bzw. jetzt stehe ich vor einem neuen. 🙄

    Ich habe CheckBoxen und Edit-Felder, die jeweils paarweise zur Laufzeit generiert werden.

    Jetzt möchte ich gern eine Funktion, die bei einem Klick auf eine Checkbox das dazugehörende Edit-Feld verändert.

    Nur: wenn ich jeder CheckBox dieselbe Funktion zuweise, wie kann ich dann innerhalb der Funktion herausfinden, von welcher Checkbox sie aufgerufen wurde?
    (Um nach dem Klick das zugehörige Edit-Feld zu ändern.)

    Jeder CheckBox eine andere Funktion zuweisen, kann ich nicht, da ich vorher nicht weiß, wieviele ich haben werde. Oder kann man auch Funktionen dynamisch generieren?

    Ich bin ratlos... aber irgendwie muss das doch gehen, hab ich schon oft genug gesehen. 😕



  • Welche Checkbox geklickt wurde, kannst Du dem Parameter Sender entnehmen.

    Es gibt verschiedene Möglichkeit, das Problem zu lösen. zB Über eine der Standard-Pair-Listen, in der Du die Zeiger auf die CheckBox und den Zeiger afu das dazugehörige Edit-Feld ablegst.

    Grüße Joe



  • Hallo

    Siehe auch den Beitrag "Dynamische Arrays von Komponenten" in besagter FAQ.

    bis bald
    akari



  • @Joe_M:
    Klingt logisch. ^^
    Zeigt Sender direkt auf das geklickte Element? Dann könnte man ja auch einfach mit den Namen arbeiten, oder?

    😞
    Okay, wie ich gerade herausgefunden habe, geht das nicht... "Name is not a member of TObject".
    Welche Informationen kann ich denn über Sender abfragen?

    @akari:
    Wenn ich den Thread richtig deute, wird dort von einem festen Button auf eine dynamisch erzeugte Komponente zugegriffen, oder? Das hilft mir nicht wirklich weiter...



  • Schau nochmal in die FAQ zu "Komponenten benutzen". Da gibt es einen Beitrag namens "Zugriff, aber nicht durch Namen"
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39207.html



  • Wenn du die Komponenten dynamisch paarweise erzeugst kannst du sie in einem vektor ablegen:

    #include <vector>
    #include <utility>
    
    typedef std::pair<TCheckBox*, TEdit*> Pair_t;
    typedef std::vector<Pair_t>           PairVector_t;
    
    class TForm1 : public TForm
    {
       ...
       PairVector_t  Paired_;
       ...
    };
    
    __fastcall TForm1::TForm( TObject* Owner )
    {
       for( int i = 0; i < 7; ++i )
       {
          // Komponenten erzeugen
          TEdit* pEdit = new TEdit( this ); 
          TCheckbox* pCheckbox = new TCheckBox( this );
    
          pCheckBox->OnClick = OnClickMyCheckBox;
    
          // paarweise in Vektor einfügen
          Paired_.push_back( std::make_pair( pCheckBox, pEdit ) );
       }
    }
    
    void __fastcall OnClickMyCheckBox( TObject* Sender )
    {
       TCheckBox* pChk = dynamic_cast<TCheckBox*>( Sender );
       if( NULL != pChk )
       {
          // quick´n´n dirty, ein Function object und std::find wären schöner
          for( PairVector_t::iterator it = Paired_.begin(); it != Paired_.end(); ++it ) 
          {
             if( it->first == pChk )
             {
                TEdit* pEdit = it->second;
                // mach was pEdit
             } 
          }
       }
    }
    

    PS:
    Alles Humbug, wenn du nur eine Zuordnung von CheckBox auf TEdit brauchst kannst die Adresse des zugehörigen TEdit an das Tag Attribut der ComboBox hängen:

    TEdit* pEdit = new TEdit( ... );
    TCheckBox* pChk = new TCheckBox( ... );
    pChk->Tag = reinterpret_cast<int>( pEdit );
    
    TEdit * pEdt = reinterpret_cast<TEdit*>( pChk->Tag );
    


  • DocShoe schrieb:

    Wenn du die Komponenten dynamisch paarweise erzeugst kannst du sie in einem vektor ablegen

    Hab ich schon. 🙂

    Mein Problem war nur, dass ich mit TObject * Sender nichts anfangen konnte, allerdings hat man mir jetzt verraten, dass ich per typecast auf die Eigenschaften der CheckBox zugreifen kann. Damit ist mir eigentlich schon geholfen.

    Der Attribut-Tag ist jedenfalls ein sehr hilfreicher Hinweis, vielen Dank! 🙂



  • Nur mal als generelle Frage: wenn ich konkret Fragen zu einem FAQ-Beitrag habe, sollte ich diese dann hier oder direkt in der FAQ stellen?

    Grüße,
    GoldenAge



  • Hallo

    Die FAQs sind sowieso nur für die Moderatoren des jeweiligen Forums bearbeitbar. Damit erübrigt sich deine Frage. Stell hier deine Frage, wenn es relevant ist wird es von den Moderatoren in die FAQ übertragen.

    bis bald
    akari



  • M.E. können registrierte User auch in der FAQ posten.
    Nur wird die ja von kaum jemandem gelesen (;)), so dass eine direkt dort gestellte (Nach)Frage wohl untergehen würde. Deshalb, wie von akari gesagt, hier im Hauptforum nachfragen.



  • Hallo

    Also ich als Mod darf z.B. im MFC-Forum nichts in die FAQ schreiben. Deshalb dürften auch andere normale Benutzer nicht in unsere BCB-FAQ schreiben.

    bis bald
    akari



  • Ok. Dann habe ich wohl den "Antworten"-Button etwas überinterpretiert. 😉

    Vielen Dank bisher!



  • Nein hast Du nicht... Aber wenn Du tatsächlich draufklickst, bekommst Du folgenden Meldung:

    Nur Moderatoren haben die Berechtigung, in diesem Forum auf Beiträge zu antworten.



  • Hmm ja, habe ich das etwa mit dem "eigenen FAQ-Beitrag editieren" verwechselt!?


Anmelden zum Antworten