MenuItem zur Laufzeit erzeugen und löschen



  • Hallo,

    ich erzeuge zur Laufzeit ein MenuItem, weise ihm Namen und Caption zu. Danach lösche ich dieses MenuItem, was auch gut klappt.

    Wenn ich jetzt ein MenuItem mit dem selben Namen erzeuge, schlägt es fehl. Ich bekomme die Exception "Komponente mit dem Namen xxx existiert berits". (Die Komponente existiert aber nicht mehr, denn ich habe sie davor entfernt)

    Wenn ich allerdings dem MenuItem keinen Namen zuweise, dann kommt diese Fehlermeldung nicht mehr. (Klar. Das MenueItem bekommt jedes Mal automatisch einen anderen Namen)

    Sollte eigentlich nicht alles (Eigenschaften darunter Name) gelöscht sein, wenn ich die Komponente entferne?

    Dankeschön



  • Hallo,

    Wie entfernst du denn dein Menüitem? Löschst du es nur oder entfernst du es auch aus der Items-Liste des Parent Menüs und aus der Component-Liste des Owners?



  • Danke für die Antwort.

    Ich poste mal meinen ganzen Code:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::CreateMenuItem(AnsiString sCaption)
    {
      try
      {
        if(Datei1->Find(sCaption) == NULL)
        {
          TMenuItem *itm = new TMenuItem(this);
          if(itm)
          {
            //itm->Name = sCaption;
            itm->Caption = sCaption;
            Datei1->Add(itm);
          }
        }
      }
      catch(const Exception &e)
      {
        ShowMessage(e.Message);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::DeleteMenuItem(AnsiString sCaption)
    {
      try
      {
        TMenuItem *itm = Datei1->Find(sCaption);
        if(itm)
          Datei1->Remove(itm);
      }
      catch(const Exception &e)
      {
        ShowMessage(e.Message);
      }
    }
    //---------------------------------------------------------------------------
    //test
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      CreateMenuItem("test");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      DeleteMenuItem("test");
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    TMenuItem *itm = Datei1->Find(sCaption);
    delete itm; // Löscht die Instanz richtig
    

    bis bald
    akari



  • BCB6 Hilfe zu TMenuItem::Remove schrieb:

    Die Methode Remove entfernt einen Menüeintrag aus dem Eigenschafts-Array Items.

    HIDESBASE void __fastcall Remove(TMenuItem* Item);

    Beschreibung

    Durch einen Aufruf von Remove kann ein Menüeintrag mit allen zugehörigen Untermenüs aus einem Menü entfernt werden. Der Parameter Item gibt den zu löschenden Eintrag an. Wenn Item keinen Menüeintrag im Array Items bezeichnet, führt Remove zu einer Exception.

    Remove gibt den dem Menüeintrag zugeordneten Speicher nicht frei. Um einen Eintrag aus dem Menü zu entfernen und gleichzeitig dessen Speicher freizugeben, rufen Sie die Methode Free des zu entfernenden Eintrags auf.

    Verwenden Sie die Eigenschaft Visible, um einen Menüeintrag vorübergehend zu verbergen, ohne ihn zu löschen.



  • Sehr gut.
    Allen vielen Dank.
    Dumm von mir, dass ich die Hilfe nicht ordentlich gelesen habe.
    Schönen Tag


Log in to reply