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 castenvoid __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 hierfor(int i=0; i < ComponentCount; i++) // myPowerCenter-> weglassenDenn 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