Auf Daten in dynamischen Listboxen auf dynamischen Tabscheets zugreifen!?



  • Hallo,

    ich erstelle dynamisch Tabsheets, mit ListBoxen und Buttons, jenachdem wieviele ich gerade brauche. Die Buttons und Listboxen haben als Parent das TabSheet.

    Was ich nicht schaffe in der ClickRoutine herauszufinden auf welchem TabSheet geklickt wurde. Mit dynamc_cast bekomme ich durchaus den Button-Namen aber auf den Parent des Buttons kann ich zugreifen um den PageIndex herauszufinden.

    for (int i=0;i<5;i++){
       TabSheet[i] = new TTabSheet(this);
        ...
       MyListBox[i] = new TListBox(this);
        ...
       MyButton[i] = new TButton(this);
        ...
       MyButton[i]->OnClick = MyClick;
        ...
    }
    
    void __fastcall Form1::MyClick(TObject *Sender)
    {
    AnsiString s;
    int i;
    s = dynamic_cast<TButton*>(Sender)->Caption; //funktioniert
    i = dynamic_cast<TButton*>(Sender)->Parent->PageIndex; //funktioniert nicht
    // das komplette TabSheet laesst sich ueber Parent aber z.B. disabeln
    ShowMessage(s);
    }
    

    als fehler kommt das es PageIndex in TWinControl nicht gibt - was ja auch richtig ist alledings müßte Parent doch vom Typ TTabSheet sein?

    Ziel. in der Clickroutine möchte ich den Inhalt der jeweils aktiven Listbox (MyListBox[i]) weiter verarbeiten! Die anzahl der benötigten TabSheets ist erst zu Laufzeit bekannt!

    Aus der Hilfe bzw. FAQ konnte ich nicht das Richtige herausfiltern!

    Gruss QfY


  • Mod

    Hallo

    ich glaube nicht, das TButton ein "PageIndex" hat ?
    du castest nach TButton 😕

    MfG
    Klaus



  • Hmmm,

    das ist mir klar das TButton keine PageIndex hat, allerdings kann ich (bringt einen Laufzeit Fehler an Adresse XXXX) nach TTabSheet casten und ich dachte ich kann auf den pageIndex via Parent zu greifen da
    MyButton[i]->Parent = TabSheet[i];

    QfY



  • QfY schrieb:

    i = dynamic_cast<TButton*>(Sender)->Parent->PageIndex; //funktioniert nicht
    

    Woher soll der Compiler zur Entwurfszeit wissen, dass das Parent ein TabSheet sein wird? Du musst du ihm ausdrücklich sagen, also auch noch das Sender-Parent nach TTabSheet casten.



  • So was ähnliches dachte ich mir auch schon, allerdings habe ich kaum erfahrung mit casten und gerate immer wieder ins Stolpern,

    dynamic_cast<TButton*>(Sender)->Parent->dynamic_cast<TTabSheet*>->PageIndex;

    würde ich versuchen allerdings kommt dann der Fehler dynamic_cast sei kein Element von TWinControl?

    QfY



  • Ich habs, wenn ich gleich richtig gelesen haette:

    i = dynamic_cast<TTabSheet*>(dynamic_cast<TButton*>(Sender)->Parent)->PageIndex;
    

    danke

    so müsste ich dann doch auch an die Listboxen ranb kommen oder??

    QfY



  • Das ist eine rethorische Frage, oder?

    Was ich nicht verstehe ist, warum du nicht einfach TPageControl::ActivePage verwendest.



  • Naja wie gesagt, ich kenne mich mit dem cast-zeug nicht so richtig aus,

    warum ich nicht activepage verwende weiss ich jetzt auch nicht, wahrscheinnlich war ich so fixiert auf meine Listboxen zu zugreifen das ich wild los gecastet habe.

    i2 = dynamic_cast<TListBox*>(dynamic_cast<TButton*>(Sender)->Parent)->Items->Count;
    

    und wenn ich nach einer Listbox caste bekomme ich eine Zugriffsverletzung, ich habe wohl noch sehr viel zu lernen

    QfY



  • int idx = PageControl1->ActivePageIndex;
    int cnt = MyListBox[idx]->Items->Count;
    


  • Das funktioniert natuerlich, allerdings hatte ich MyListBox nur lokal deklariert und ich dachte trotzdem über das TTabSheet ran zu kommen etwas in der Art:

    dynamic_cast<TTabSheet*>(dynamic_cast<TButton*>(Sender)->Parent)->Componetns[FindComponent("MyListBox[idx]")]->....
    

    was allerdings nicht zu funktionieren scheint??

    QfY


Anmelden zum Antworten