Wie zur Laufzeit neuen Menüeintrag erstellen mit Methode??



  • Hallo,

    wie kann ich zur laufzeit einen menüeintrag in einem Mainmenu erstellen?

    Vorhabe:

    In meinem Programm kann man eine geöffnete datei per Main menu mit Word aufrufen (also man klickt auf Datei und dann mit Word öffnen)

    Nun möchte ich dem benutzer die möglichkeit geben, andere programme in das Mainmenu mit einzutragen, welche die datei auch öffnen können!

    Wie mache ich das am besten?
    Denn zu dem neuen Menüeintrag muss dann ja auch noch eine OnKlickmethode erzeugt werden, welche mit ShellExecute die Datei mit dem Programm öffnet!

    Wie kann man dies realisieren?



  • Hallo

    Menüeinträge kannst du wie alle anderen Objekte mit new erzeugen. Du must dannn nur noch die richtigen Eigenschaften zuweisen.

    Und natürlich sollst du nicht für jeden neuen Eintrag eine neue OnClick-Methode erzeugen, sondern du hast immer nur eine feste. Die soll dann anhand des überlieferten Parameters "Sender" entscheiden was zu tun ist.

    Schau dir in der BCB-FAQ die Themen zum Kapitel Komponenten benutzen an, dort werden solle Prinzipien erklärt.

    bis bald
    akari



  • ok hab das glaub ich verstanden, aber wie kann ich durch alle Items durchgehen, um zu prüfen ob das schon existiert?

    for(int i = 0; i < Sprache1->Items->Count; ++i)
    {
     if(Sprache1->Items[i]->Name == "Testitem")
      ok = false;
    

    so geht es nicht

    "zu wenige Parameter im Aufruf GetItems(Int)"



  • Sprache1->Items->Items[i]->Name
    


  • und gibt es dafür auch eine erklärung, wieso 2x Items??



  • achso, der fehler kommt im kopf der for-schleife, liegt wohl an dem Count irgendwie??



  • ist Sprache1 das MainMenu oder ein Menupunkt?

    wenn es ein Menüpunkt ist: BCB-Hilfe zu TMenuItem -> Items -> Beispiel

    wenn es Das MainMenu ist: BCB-Hilfe zu TMainMenu -> Items -> Beispiel



  • hm...? schrieb:

    und gibt es dafür auch eine erklärung, wieso 2x Items??

    Ist durch die Objekthierarchie so notwendig. Die kannst du in der BCB-Hilfe nachlesen.

    Ums kurz zu fassen : Das erste Items ist der Container der untergeordneten Menüeinträge. Das zweite ist die Zugriffseigenschaft auf die einzelnen Einträge im Container. Das zweimal der gleiche Name verwendet wird ist unglücklich, aber dahinter leigen zwei verschiedene Klassen.

    bis bald
    akari



  • aha, soweit verstanden 😉

    hab das also so abgeändert

    TMenuItem* myItem = new TMenuItem(MainMenu1);
    bool ok =true;
    for(int i = 0; i < Sprache1->Count;++i)
    {
     if(Sprache1->Items[i]->Name == "Testitem")
      ok = false;
    }
    if(ok)
    {
    myItem->Caption = "Test";
    myItem->Checked = false;
    myItem->Name = "Testitem";
    Sprache1->Items->Add(myItem);
    }
    else
     ShowMessage("Eintrag bereits vorhanden");
    }
    

    nun bekomm ich beim Add denselben fehler!
    Woran liegt das denn nun schonwieder?



  • Hier sollte es

    Sprache1->Add(myItem);
    

    heißen. Von welchem Typ ist denn Sprache1? Von TMenuItem? Linneas Beispiel stimmt nur wenn Sprache1 vom Typ TMainMenu ist.



  • nee ist TMenuItem!



  • Dann so wie ich es geschrieben habe.



  • auch zur Methode Add von TMenuItem gibt es ein Beispiel in der BCB-Hilfe 😡



  • Linnea schrieb:

    auch zur Methode Add von TMenuItem gibt es ein Beispiel in der BCB-Hilfe 😡

    ja und da ich eben fälschlicherweise bei TMainMenu war habe ich die falsche Add Metode genommen, wie du eigentlich gesehen haben musst!

    🙄


Anmelden zum Antworten