Untermenüs zur Laufzeit erstellen
-
Hallo zusammen,
ich möchte ein Menü zur Laufzeit generieren. Das geht soweit auch schon mit dem Beispiel aus der Borlandhilfe. Nur habe ich folgendes Problem:
- Menu1
- Menü2
geht... Wie machte ich ein
-->Menü1
----->Menü1.1
-->Menü2
----->Menü2.2
Ich weiß das es eine Eigenschaft Parent für TMenuItem gibt. Aber die scheint es nicht zu sein...
Vielleicht könnt ihr mir helfen...
Gruß
handyman
-
Statt dem Hauptmenü musst du das neue Item halt dem Item hinzufügen, unter dem das SubMenu zu finden sein soll.
PopupMenu1->Items->Items[0]->Add(NewItem);Anstelle des Index kannst du natürlich auch direkt den Namen des "Eltern"-Items verwenden, was allerdings recht unflexibel ist.
-
Hallo
in der Komponentenpalette MainMenu anclicken
F1-Taste druecken
Eigenschaften
Items
BeispieleMfG
Klaus
-
Ehrlich gesagt kann auch ich in der Hilfe kein Beispiel zum Erstellen eines "SubItems" finden (sonst hätte ich schon darauf hingewiesen ;)).
Dabei wäre angesichts des etwas verwirrenden "doppelten" Einsatzes von Items gerade hier ein Beispiel durchaus angebracht.
-
Hallo zusammen,
danke für die Tips!
Mit dem folgenden Quellcode kann ich das erste Item erstellen:
//Datei TMenuItem *NewItem = new TMenuItem(NewItem); // create the new item MainMenu1->Items->Add(NewItem);// add it to the Popupmenu NewItem->Caption = language_f(1); NewItem->Tag = 0; NewItem->OnClick = MenuClick; // assign it an event handlerWenn ich dann aber folgendes hinzufüge:
//Datei -> Beenden TMenuItem *NewItem1 = new TMenuItem(NewItem1); // create the new item MainMenu1->Items->Items[0]->Add(NewItem1);// add it to the Popupmenu NewItem1->Caption = language_f(2); NewItem1->Tag = 1; NewItem1->OnClick = MenuClick; // assign it an event handler´Dann meldet er in der Ausführung:
---------------------------
Debugger Exception Notification
---------------------------
Project main.exe raised exception class EAccessViolation with message 'Access violation at address 00421A62 in module 'main.exe'. Read of address FFFFFFD0'. Process stopped. Use Step or Run to continue.
---------------------------
OK Hilfe
---------------------------Und bleibt in der Zeile
TMenuItem *NewItem = new TMenuItem(NewItem); // create the new itemdes ersten Items stehen. Ohne das zweite Menüitem klappt aber alles...
Was mache ich falsch??

CU
Handyman<Edit>
Der Aufruflanguage_f(2);ist lediglich der Text des Menüpunktes, der je nach der Sprachauswahl dees Anwenders angezeigt wird.
-
handyman schrieb:
Ohne das zweite Menüitem klappt aber alles...
Das bezweifle ich. Zumindest, wenn du dort denselben Code verwendest wie hier gezeigt.
Du kannst im Konstruktor nicht das gerade erst zu erzeugende Item übergeben, und diesen Fehler hast du auch im Code für das erste Item. Nimm stattdessen das Menu selbst.
TMenuItem *NewItem = new TMenuItem(MainMenu1);
-
Hallo Jansen,
danke für den Tipp!! *sich-an-den-Kopf-schlägt*
Mit der Funktion
void __fastcall TForm3::create_menu (int caption, int tag, TMenuItem *parent) { TMenuItem *NewItem1 = new TMenuItem(MainMenu1); // create the new item parent->Add(NewItem1);// add it to the Popupmenu NewItem1->Caption = language_f(caption); NewItem1->Tag = tag; NewItem1->OnClick = MenuClick; // assign it an event handler }und dem Aufruf
//Datei create_menu(1,0,MainMenu1->Items); //Datei -> Beenden create_menu(2,1,MainMenu1->Items->Items[0]);geht es nun!!
CU
Dominique
-
Hi leute ich hab auch ein Problem was damit zutun hat und zwar kann ich prima MenueItems erstellen nur das löschen funktioniert nur scheinbar. Irgendwie gibt er beim Löschen die MenueItems und deren OnClick nicht anständig frei... Ich lösche die Items und alles ist okay... mann sieht also keine mehr... dann erstelle ich neue Items und auf einmal sind auch die alten wieder da...
void __fastcall TForm_Main::ClientenONClick(TObject *Sender) { TMenuItem *ASender; try { ASender = ( dynamic_cast<TMenuItem *> (Sender) ); TstaticClass::ChangeClient(AnsiReplaceStr( ASender->Caption,"&","" )); } catch ( ... ) { } ASender = 0; }; void __fastcall TForm_Main::CreateClientenItem(const AnsiString &TheCaption) { TMenuItem *NewItem; NewItem = new TMenuItem(this); NewItem -> OnClick = ClientenONClick; NewItem -> Caption = TheCaption; MainMenu->Items->operator [](0)->operator [](1)-> Add(NewItem); }Ich hab jede Art von Destroy ausprobiert (also Clear, Delete, etc.)...
Hat jemand ne Ahnung weshalb er die Menuepunkte nicht korrekt zerstört?
-
Hallo,
1. Zu einer neuen Frage solltest du immer auch einen neuen Thread aufmachen.
2. Wie löscht du denn deine MenuItems? Aus dem geposteten Code ist das nicht zu ersehen. Bedenke, das ein MenuItem aus der Liste des Parent Items (oder Menus) gelöscht werden muss.Ciao