Funktion in anderer Funktion aufrufen



  • danke.
    das hab ich irgendwann schon mal versucht, aber da immer ne Fehlermeldung bekommen. weiß leider nicht mehr was es war. wahrscheinlich habe ich mich nicht weit genug '"nach oben" gehangelt'.



  • Hallo

    Einfach über die Parent-Property "nach oben" hangeln.

    Das kann nicht mal ich nachvollziehen... Sender entspricht ja dem TPopupMenu. Das hat aber keinen Parent...
    /Edit : Achso, ich bin immer noch vom Event TPopupMenu::OnPopup ausgegangen.

    Im Builder 5 ist sowas schlecht zu machen. Ich würde als einfachstes das aktive Control überprüfen.

    if (ActiveControl == ListView1)
    {
      ...
    }
    if (ActiveControl == ListView2)
    { 
      ...
    }
    

    Soviel ich weiß gibts aber im Builder 6 und höher spezielle Eigenschaften des PopupMenus, die genau das betreffende Control mit übergeben.

    bis bald
    akari



  • erstmal danke akari.
    was ich wollte war, ohne den Listview Namen anzugeben die abfrage zu haben.
    ich benutze den Builder 6. weißt Du die höher spezielle Eigenschaften des PopupMenus, die dieses übergibt ?



  • Hallo

    Nein ich habe nur den 5er. Ich hatte aber mal ein Package, das für den Unterschied zwischen den Versionen extra Präprozessor-Bedinungen hatte. Oder verwechsel ich das jetzt mit TAction?
    Jedenfalls sollte mal jemand was dazu sagen, der auch den 6er oder höher benutzt.

    bis bald
    akari



  • danke, werde einfach mal probieren und die Möglichkeiten in der code - Vervollständigung anschauen.



  • ich glaube etwas gefunden zu haben 'PopupComponent'. erste variante funktioniert, leider die zweite nicht, gibt einen NULL String. vielleicht Zeiger auf Zeiger ? bin da noch nicht so fit. werd mal weiter probieren.

    AnsiString test = ((TListView *)PopupMenu1->PopupComponent)->Name;
       ShowMessage(test);
    
    AnsiString test = AnsiString test = ((TListView *)static_cast<TPopupMenu*>(Sender)->PopupComponent)->Name;
       ShowMessage(test);
    


  • komischerweise ist beim ersten Bsp. der ClassName TListView und beim Zweiten TMenuItem. 😕



  • nur zur info, das hier funktioniert. ob es korrekt ist weiß ich nicht.

    AnsiString test = ((TListView *)((TPopupMenu *)static_cast<TMenu*>(Sender)->GetParentComponent())->PopupComponent)->Name;
       ShowMessage(test);
    


  • Sieht nicht sehr vertrauenerweckend aus. 😉

    Allerdings frage ich mich, ob nicht der gesamte Ansatz falsch ist.
    Zum einen ist das PopupMenu ja fest mit dem jeweiligen ListView verbandelt (über dessen Eigenschaft Popupmenu), so dass eigentlich immer klar sein sollte, welches Menu(Item) zu welchem ListView gehört.
    Und zum anderen wird im OnPopup des Menüs nochmal die auslösende Komponente als Sender übergeben, so dass hier eine eventuelle Prüfung einfacher implementiert werden kann.



  • daß PopupMenu ja fest mit dem jeweiligen ListView verbandelt ist, ist klar, aber ich wollte in einem OnClick event den code schreiben, der dann von allen anderen menus auch benutz werden kann ohne direkt jedes OnClick event seperat zu schreiben.

    Und zum anderen wird im OnPopup des Menüs nochmal die auslösende Komponente als Sender übergeben

    schön das such ich ja, aber wie ?

    ich habe mehrere ListView's und in jedem popupmenu ein gleiches Item z.b. suchen/find (ListView Caption Text) und möchte nicht in jedes Menu das OnClick extra scheiben.

    z.B so was wie das hier. so nun will ich das z.B. in 6 verschiedenen ListViews verwenden. auch wenn es nicht vertrauenswürdig aussieht es funktioniert, bin aber für eine einfachere Lösung dankbar.

    void __fastcall TForm1::SearchbyID1Click(TObject *Sender)
    {
       if(!ListView_Objects->Items->Count) return;
       AnsiString NewString = "";
       if(InputQuery(" ID SEARCH ", "ID Number", NewString) || !NewString.IsEmpty())
         for (int i = 0; i < ListView_Objects->Items->Count; i++)
           {
               if(ListView_Objects->Items->Item[i]->Caption == NewString)
                  {
                     ListView_Objects->ClearSelection();
                     ListView_Objects->ItemIndex = i;
                     ListView_Objects->Items->Item[i]->MakeVisible(true);
                     break;
                  }
           }
    }
    
    void __fastcall TForm1::SearchbyID1Click(TObject *Sender)
    {
       TListView *LiVi = ((TListView *)((TPopupMenu *)static_cast<TMenu*>(Sender)->GetParentComponent())->PopupComponent);
    
       if(!LiVi->Items->Count) return;
       AnsiString NewString = "";
       if(InputQuery(" ID SEARCH ", "ID Number", NewString) || !NewString.IsEmpty())
         for (int i = 0; i < LiVi->Items->Count; i++)
           {
               if(LiVi->Items->Item[i]->Caption == NewString)
                  {
                     LiVi->ClearSelection();
                     LiVi->ItemIndex = i;
                     LiVi->Items->Item[i]->MakeVisible(true);
                     if(LiVi->OnClick) LiVi->OnClick(LiVi);
                     break;
                  }
           }
    }
    


  • Du rufts diesen Code im OnClick eines popupMenuItems auf?

    TListView *LiVi = ((TListView *)((TPopupMenu *)static_cast<TMenu*>(Sender)->GetParentComponent())->PopupComponent);
    

    Mach es besser so.

    TMenuItem *item = dynamic_cast<TMenuItem*>(Sender);
    if( item ) // Ja ist ist ein TMenuItem
    {
       TPopupMenu *pmenu = dynamic_cast<TPopupMenu*>(item->GetParentMenu());
       if( pmenu )
       {
          TListView *lview = dynamic_cast<TListView*>(pmenu->PopupComponent);
          if( lview ) // jetzt haben wir unser ListView
          {
    // jetzt der Code
          }
       }
    }
    

    Hier sind noch ein paar Tests drin um sicherzustellen, dass die Casts auch gültig sind. Ich halte die hier für notwendig.



  • Du rufts diesen Code im OnClick eines popupMenuItems auf ?

    ja.

    Vielen Dank, werde gleich mal probieren.

    die Tests sind zwar wahrscheinlich nicht nötig, da ich wirklich nur die OnClick Ereignisse der betreffenden PopupMenu's Items dabei verwende, aber sicher ist sicher und schaden tut sowas nie. 🙂


Anmelden zum Antworten