Erzeugten TMenu Button eine Funktion zuweisen (dyn)
-
Hallo Leuz,
und wieder plagt mich ein Problem...
Folgender Code funktioniert abervoid __fastcall Tfrm_main::CmdMenuItemClick(TObject *Sender) { TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender); if (ClickedItem) { switch (ClickedItem->Tag) { case 0: { for(int i = 0; i < PageControl1->PageCount; i++) { if (ClickedItem->Caption == "&"+PageControl1->Pages[i]->Caption) { //aktiviert den Sheet wenn er schon Vorhanden ist PageControl1->ActivePage = PageControl1->Pages[i]; return; //verlässt die Funktion } } break; } case 1: { for(int i = 0; i < PageControl1->PageCount; i++) { if (ClickedItem->Caption == "&"+PageControl1->Pages[i]->Caption) { //aktiviert den Sheet wenn er schon Vorhanden ist PageControl1->ActivePage = PageControl1->Pages[i]; return; //verlässt die Funktion } } break; } // etc... } } }
so nun weis ich ja noch nicht wieviele Fenster der User öffnet... kann man das je nach eingefügtem Item immer um eins erweitern oder gibt es sogar eine bessere lösung
danke euch schonmal
-
Ich verstehe Deine Frage nicht, aber wieso schreibst Du für jedes case immer denselben Code.
[...] case 0: case 1: <Anweisungen> [...]
funktioniert doch auch. Oder ist es etwa langsamer?
Dann noch ein Optimierungstipp schreibe ++i statt i++, hab hier in irgendeiner FAQ gelesen dass es schneller sein soll.Und für welche Information steht bei Dir TMenuItem::Tag?
-
Moin,
Also Ich möchte die Item die hinzugefügt werden nicht begrenzen auf ein festen Wert! Deshalb soll dann auch je nach Anz der Item, wobei in Tag die Anz gespeichert wird, jeder Button seine Funktion erhalten!
Sicher hast Du Recht mit dem mehrfach schreiben, ich bin ja noch am grübeln über das andere Problem, diese Funktion wird es dann auch geben ohne das ich sie xx mal da reinschreibe, vollkommen richtigalso müsste ich dann für jeden Button auch diese Funktion haben, egal wieviel Hinzugefügt werden...
Ich hoffe das war etwas verständlicher und mein Problem ist rübergekommen...
Schonmal Danke
-
Naja, für jeden Button auch die Funktion? Worin liegt das Problem? Sender auswerten, und entsprechend reagieren?
-junix
-
Jo Danke das klappt soweit...
So nun will ich diese Button auch wieder schließen oder besser Zerstören
wenn Sie nicht mehr gebraucht werden...
Den Index habe ich über Tag einer Integer Variable zugewiesen
und kann so mit einer 'for' Schleife über die Button gehn, aber wie zum
Hänker komme ich auf die Caption der Button???
ich hab irgend wie voll nen Brett davor heute...Also der vierte Button ist doch
MainMenu1->Items->Items[3]->Caption
und wie komme ich an die Untereinträge?
Danke
-
ach so hab ich es nun gemacht und funzt
void __fastcall Tfrm_main::CmdMenuItemClick(TObject *Sender) { TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender); if (ClickedItem) { for(int i = 0; i < PageControl1->PageCount; i++) { if (ClickedItem->Caption == "&"+PageControl1->Pages[i]->Caption) { // aktiviert den Sheet... PageControl1->ActivePage = PageControl1->Pages[i]; return; //verlässt die Funktion } } } }
-
0Bytes schrieb:
Also der vierte Button ist doch
MainMenu1->Items->Items[3]->Caption
und wie komme ich an die Untereinträge?
Hinweis:: TMenuItem kann wiederum TMenuItems besitzen... schonmal die Eigenschaften angesehen? (o; Ne feine rekursive Sache (o;
-junix
-
also irgendwie raff ichs nicht
void __fastcall Tfrm_main::CmdDestroyMenuItem(AnsiString sTabSheetCaption) { TMenuItem* pMenuItemToDelete = MainMenu1->Items->Items[3]; for (int i = 0; i < iSubItemTag; ++i) { pMenuItemToDelete = MainMenu1->Items->Items[3]; if (sTabSheetCaption == pMenuItemToDelete->Caption) { delete pMenuItemToDelete; } } }
so und wenn ich das richtig verstanden hab
müsste ichpMenuItemToDelete->Items->Items[i];
wenn ich den Untereintrag haben möchte, aber dann kommt
[C++ Fehler] nwdbm.cpp(1676): E2193 Zu wenige Parameter im Aufruf von '_fastcall TMenuItem::GetItem(int)'
hm bin ich wirklich zu blöd oder ist einfach nicht mein Tag heute
ich stell mich wieder an
-
also ich bin nun einen anderen Weg gegangen
und er schein zu funzenvoid __fastcall Tfrm_main::CmdDestroyMenuItem(AnsiString sTabSheetCaption) { TMenuItem* pCurrItem; pCurrItem = Fenster1->Find(sTabSheetCaption); AnsiString sItemCaption = pCurrItem->Caption; delete pCurrItem; }
ist doch auch ok so oder?