MainMenu Fragen



  • Ich lege mit NewItem() dynamisch zur Laufzeit zusätzlich neue Items an.
    Wie muss ich diese bei Programmende TForm1->OnClose() wieder freigeben, wenn man das denn muss?

    Einfach alle Items der MainMenu durchgehen und per Delete löschen?

    for (int i=Sprachen->Count-1;i>=0;i--) Sprachen->Delete(i);

    Ich frage weil in der Hilfe steht:

    Warnung: Der von NewItem zurückgegebene Eintrag hat keinen Eigentümer. Der Programmierer muß den dem Eintrag zugewiesenen Arbeitsspeicher wieder freigeben, wenn der Eintrag nicht mehr benötigt wird. Die Methoden Delete und Remove von TMenuItem geben diesen Arbeitsspeicher nicht frei.

    Bin deshalb ein wenig verunsichert 😉



  • Die Methoden löschen nur die Einträge aus der Liste, aber nicht das dahintersteckende TMenuItem-Objekt.
    Diese müssen einzeln per "delete" (zB. "delete MenuItem1") gelöscht werden.



  • Mit MenuFile->Add(newItem); verbinde ich doch diese. Also wenn ich das Programm beedende sollte mit MenuFile auch die dynamischen einträge verschwinden oder? Wohl nicht.

    Hat wer eventuell ein Beispiel wie ich beliebig viele Menüeinträge dynamisch zur Luafzeit hinzufügen und bei Programmende sauber wieder freigibt?

    Muss man das mit vector<> machen? wieviel Einträge es werden weiss ich ja erst bei Programm start. Also brauch man ein Array was nach oben offen ist.



  • In der FAQ gibt's einen Eintrag zu dynamischen Arrays.

    Allerdings brauchst du das hier nicht notwendigerweise, du kannst zum Löschen ja durch die Items-Property des betreffenden Menus iterieren (dabei Items in eventuellen SubMenus nicht vergessen).



  • Ich habe den Menü Eintrag "Vorlagen" als Submenu (->) dann "Standard Vorlage" darunter ein "-" Balken und darunter dann die dynamischen Einträge für zuletzt verwendete Vorlagen. Ähnlich dem "Datei"->"Neu öffnen" bei CBuilder5.

    Angelegt habe ich die Einträge so:
    for (i=0;i<anzahl;i++)
    {
    TMenuItem* newItem = NewItem(Liste->Strings[i],0,false,true,VorlagenClick,0,"VorlagenItem_"+IntToStr(i));
    Vorlagen->Add(newItem);
    }

    Momentan also 2 feste + 22 dynamische Einträge in "Vorlagen".

    ich muss also in onClose()
    for (i=2;i<Vorlagen->Count;i++)
    {
    delete Vorlagen->Items[i];
    }

    ist das so richtig?


Anmelden zum Antworten