TPopupMenu Übergabeproblem



  • Hallo,
    wollte diesesmal die Caption von den Items des TPopupMenue 's ändern.
    Funktioniert fast alles. Nur bei der Rückgabe meiner Methode getName tritt eine Exception mit der Bemerkung /Menuindex außerhalb des zulässigen Bereichs" auf. Die Methode GetName ist definitiv Fehlerfrei. Sie funktioniert bisher bei allen ähnlichen Funktionen hundertprozentig! Ich gehe davon aus das es unwahrscheinlich ist, dass der Index der Items bei 1 beginnt. Habe das zwar in meiner Verzweifellung ausprobiert, aber konnte mir nicht vorstellen das ein Index nicht bei 0 beginnt. Zusätzlich habe ich das auch mit dem Debugger in Einzelschritten durchgetestet. Was könnte das Problem sein und was muss ich an meinem Quelltext ändern? Kann auch den im Notfall den gesamten Queltext zur Verfügung stellen.

    if (Components[i]->ClassNameIs("TPopupMenu"))
             	{
                	int NumberItem = PopupMenu->Items->Count;
    		    for (int i=0; i < NumberItem; i++)
                        {
                            AnsiString ItemName;
        			TMenuItem *ItemToEdit = PopupMenu->Items->Items[i];
                            ItemName = ItemToEdit->GetNamePath();
                           	ItemToEdit->Items[i]->Caption = getName(ItemName, Sprache);
                        }
                }
    


  • Hallo,

    Du willst ja wohl die Caption deines Menüeintrages ändern und der hat keine eigenen Items. Das Ganze müßte also so aussehen.

    if (Components[i]->ClassNameIs("TPopupMenu"))
    {
        size_t NumberItem = PopupMenu->Items->Count;
        for (size_t j=0; j < NumberItem; ++j)
        {
            TMenuItem *ItemToEdit = PopupMenu->Items->Items[j];
            AnsiString ItemName(ItemToEdit->GetNamePath());
            ItemToEdit->Caption = getName(ItemName, Sprache); //Hier geändert
        }
    }
    

    Ich hab auch mal anders eingerückt. Ich finde das so übersichtlicher. 🙂



  • Ich danke dir sehr. Hat natürlich geklappt. Das mit dem Einrücken ist im eigentlichen Quelltext auch kein Problem. Nur hier im Forum habe ich eine Fehler gemacht.
    Nochmals danke.



  • Hey, habe noch eine kurze Frage. Wollte Casten um aus Compinents[i] zuzugreifen was bestandtteil von TComponents ist. Leider hat das Catsen nicht funktioniert. Es sollte dann der Eintrag PopupMenu durch Componets[i] ersetzt werden, da ich dann unabhänig von dem Namen des Objektes auf das Objekt zugreifen wollte. Was habe ich verkehrt gemacht?

    if (Components[i]->ClassNameIs("TPopupMenu"))
             	{
                    String ObjectName;
                 	//TPopupMenu *ppopupmenu = dynamic_cast<TPopupMenu *>(comp);
                	//ppopupmenu = Components[i];
    
         ------>>>    NumberItem = PopupMenu->Items->Count; <<<-------
    				for (int j=0; j < NumberItem; ++j)
    				{
    		        	TMenuItem *ItemToEdit = PopupMenu->Items->Items[j];
    		        	AnsiString ItemName(ItemToEdit->GetNamePath());
    		        	ItemToEdit->Caption = getObjBezeichnung(ItemName, Sprache);
    				}
                }
    


  • Hallo

    entweder so

    if (Components[ix]->ClassNameIs("TPopupMenu"))
    {
      TPopupMenu *PopupMenu = static_cast<TPopupMenu *>(Components[ix]);
      int NumberItem = PopupMenu->Items->Count;
      for (int j=0; j < NumberItem; ++j)
      {
        TMenuItem *ItemToEdit = PopupMenu->Items->Items[j];
        AnsiString ItemName(ItemToEdit->GetNamePath());
        ItemToEdit->Caption = getObjBezeichnung(ItemName, Sprache);
        }
      }
    

    oder

    TPopupMenu* PopupMenu = dynamic_cast<TPopupMenu*>(Components[ix]);
    if (PopupMenu)
    {
      int NumberItem = PopupMenu->Items->Count;
      for (int j=0; j < NumberItem; ++j)
      {
        TMenuItem *ItemToEdit = PopupMenu->Items->Items[j];
        AnsiString ItemName(ItemToEdit->GetNamePath());
        ItemToEdit->Caption = getObjBezeichnung(ItemName, Sprache);
        }
      }
    

    das heißt du brauchst entweder ClassName und static_cast oder dynamic_cast. Beides ClassName und dynamic_cast zusammen ist doppelt gemoppelt.

    bis bald
    akari



  • Klappt nicht ganz. Gleube ich habe das falsch erklärt. Oder ich liege da falsch.
    PopupMenu soll durch Components[i] ersetzt werden. Also so z.B.

    int NumberItem = Components[i]->Items->Count;
    

    Da Components[] kein bestandteil von TPopupmenu ist, sondern von TComponent, bin ich gezwungen zu Casten. Wo liegt mein fehler?
    Hoffe es gibt noch eine Antwort von Euch.
    Danke.



  • Noch kurz,
    PopupMenu ist der Name des Objekts welchens von TPopupMenu stammt. Ich möchte auf verschiede Objekte später mal verschiede TPopupMenu-Komponenten legen. Die heißen dann nur etwas anders.



  • Halt, alles zurück.
    Ich habe mich verguckt. Ist ja alles richtig. Hattest recht und ich unrecht. Danke dir. 👍 👍 👍 👍


Anmelden zum Antworten