Zugriff auf den Speedbutton x von 32



  • hei
    Ich habe in meinem Formular 32 Speedbutton, welche im (Tag) durchnummeriert sind. Weiter habe ich ein Popupmenü mit 32 Einträge, auch identisch durchnummeriert. Mit einem Click im Popupmenü möchte ich die Eigenschaft des Speedbutton (Checkend) beeinflusen. Dies ist bis jetzt mein Code. Wie kann ich dieses "casten", um auf den Speedbutton mit dem gleichen Tag Wert zuzugreifen?

    void __fastcall TmyPowerCenter::PopupOnOffClick(TObject *Sender)
    {
    iTag = dynamic_cast<TMenuItem*>(Sender)->Tag;
    }
    //-------------------------------------------------------------
    

    bis bald
    dieleena



  • Hallo

    da reicht die Tag-Eigenschaft nicht mehr aus.
    Schau dir stattdessen den FAQ-Thread Dynamische Arrays von Komponenten an.

    bis bald
    akari



  • Hi,

    wenn ich dich jetzt recht verstehe.
    Du möchtest keine 32 OnClicks der einzelnen PopUp-Menüs haben,
    sondern alle 32 PopUp-Menü OnClicks in einem OnClick erledigen.
    Alos Du setzt jeden PopUp-Menü eintrag im Objekt-Inspektor auf den selben
    OnClick.
    hhhmmm...

    void __fastcall TmyPowerCenter::PopupOnOffClick(TObject *Sender)
    {
     TControl *DasObjekt = (TControl *) Sender;
     int iTag = DasObjekt->Tag;  //int ?????
    }
    //-------------------------------------------------------------
    

    Ich kann dir nicht sagen ob das so klappt, müsste aber!!!

    PS:: ich benutze BCB5

    Grüsse



  • hei
    habe es gefunden, und so funktioniert es.

    void __fastcall TmyPowerCenter::PopupOnOffClick(TObject *Sender)
    {
    //
    int Index;
    //
    //
        Index = dynamic_cast<TMenuItem*>(Sender)->Tag;
        //
        for(int i=0; i < myPowerCenter->ComponentCount; i++)
          {
          if (myPowerCenter->Components[i]->ClassNameIs("TSpeedButton"))
            {
            if(dynamic_cast<TSpeedButton*>(myPowerCenter->Components[i])->Tag == Index)
              {
              if (dynamic_cast<TSpeedButton*>(myPowerCenter->Components[i])->Down == true)
                {
                dynamic_cast<TSpeedButton*>(myPowerCenter->Components[i])->Down = false;
                }
              else
                {
                dynamic_cast<TSpeedButton*>(myPowerCenter->Components[i])->Down = true;
                }
              break;  
              }
            }
          }
    }
    //---------------------------------------------------------------------------
    

    bis bald
    dieleena 🙂 🙂 🙂



  • 👍 👍 👍



  • Hallo

    Das mag jetzt für deine Zwecke ausreichen und deinen Kenntnissen von Programm-Aufbau entsprechen.
    Aber es gibt noch einige Verbesserungen :
    - Wenn du schon einen dynamic_cast machst, dann bitte auch mit übeprüfen, ob der cast erfolgreich war. Den son st kannst du auch gleich static_cast nehmen.
    - Du solltest nicht für jeden Zugriff einzeln casten

    void __fastcall TmyPowerCenter::PopupOnOffClick(TObject *Sender)
    {
    //
    int Index;
    //
    //
        Index = dynamic_cast<TMenuItem*>(Sender)->Tag;
        TSpeedButton* Button;
        //
        for(int i=0; i < myPowerCenter->ComponentCount; i++)
        {
          Button = dynamic_cast<TSpeedButton*>(myPowerCenter->Components[i]);
          if ((Button) && (Button->Tag == Index))
            Button->Down = !Button->Down
          }
    }
    //---------------------------------------------------------------------------
    

    - mit deiner Suche greifst du nun auf wirklich alle TSpeedButtons auf dem gesamten Form zu. Wenn du jemals noch andere TSpeedButtons für ganz andere Zwecke hinzufügen willst, bekommst du dann seltsame Fehler.
    - Mit dem in dem von mir geposteten Link gezeigten Prinzip kannst du sowohl schneller als auch elegeganter alle diese Probleme lösen.

    bis bald
    akari



  • hei
    es freut mich, das es Mitglieder in diesem Forum existieren, welche wie zum Beispiel "mich" über bessere und schnellere Varianten informiert. Bin für jede Verbesserung zu haben.
    Danke.
    bis bald
    dieleena 👍 👍 👍



  • Hallo

    ein hab ich noch vergessen, ist aber auch wichtig :
    las die feste Instanzvariable des Forms in den eigenen Methoden weg. Bei dir zum Beispiel hier

    for(int i=0; i < ComponentCount; i++) // myPowerCenter-> weglassen
    

    Denn sonst bindest du dich an genau diese eine Forminstanz, was meistens gar nicht nötig ist.

    bis bald
    akari



  • hei
    danke für den Nachtrag
    bis bald
    dieleena


Anmelden zum Antworten