Von wo aus wurde das Kontextmenu aufgerufen??



  • Habe zwei TCharts, die beide mit dem selben Kontextmenu verbunden sind. Wie kann ich nach der Auswahl eines MenuItems erfahren, von welchem TChart das ausging?? Als Sender bekomm ich ja nur das MenuItem...



  • Hallo

    das geht wohl nur über die Eigenschaft TMenuItem->Parent

    BCB-Hilfe zu TMenuItem::Parent schrieb:

    Wenn es sich bei dem Menüeintrag um einen Eintrag im Hauptmenü oder um einen übergeordneten Eintrag eines Popup-Menüs handelt, ist Parent mit den Wert der Eigenschaft Items des betreffenden Menüs identisch.

    also

    TMenuItem *MenuItem = static_cast<TMenuItem *> (Sender);
      if (MenuItem->Parent == PopupMenu1->Items)
      {
        // MenuItem gehört zu PopupMenu1
        }
    

    /Edit : Am besten ist es, wenn du das ganze Konzept so schreibst, das du diese Überprüfung nicht brauchst.
    Am leichtesten ist es, die Tag-Eigenschaft zu benutzen, um die einzelnen Menu-Einträge auseinander zu halten.

    bis bald
    akari



  • Danke, ich werde mir das mal ansehen!



  • Hallo,

    Man erhält das ParentMenu auch über die Funktion TMenuItem::GetParentMenu(). Den erhalten Pointer kann man dann versuchen nach TPopupMenu zu casten. Wenn das erfolgreich war kann man die übergeordnete Komponente des PopupMenus mit TPopupMenu::PopupComponent auslesen. Die Eigenschaft liefert einen Zeiger auf TComponent welchen du nach nach TChart casten kannst. Alles immer schön mit dynamic_cast und nachfolgender Kontrolle.

    Ciao



  • Hmm, so recht versteh ich das nicht! Hab mich bisher noch nicht so richtig mit diesem casten beschäftigt (dynamic_cast, static_cast)... und jetzt auch noch kontrollieren, da kann ich leider nicht ganz folgen.

    Nochmals, ich muss wissen, ob es nun von Chart1 oder von Chart2 aufgerufen wurde, wobei BEIDE charts das GLEICHE PopupMenu haben



  • bei einer Anwendung hab ich auch allen Charts das gleiche PopupMenu zugewiesen und dann z.B. so auf die einzelnen Charts zugegriffen:

    void __fastcall TReportForm::Title1Click(TObject *Sender)
    {
    TChart *Chart = dynamic_cast<TChart*>(PopupMenu1->PopupComponent);
    if (Chart && Chart->ClassNameIs("TChart"))
        {
        Chart->Title->Text->Clear();
        Chart->Title->Text->Add(Chart->Name);
        }
    }
    

    [Edit:] dynamic_cast eingebaut



  • Schön!! Das ist genau das, was ich gebraucht hab!



  • Ohne dynamic_cast ist das if (Chart) allerdings für'n A.



  • Warum?



  • Weil Linneas C-Style Cast auch dann einen NichtNull-Pointer liefert wenn in PopupComponent gar kein TChart drin ist. Dieser Pointer wäre dann natürlich ungültig und würde bei Verwendung eine Zugriffsverletzung liefern.
    Sieh mal in der C++ FAQ nach
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39493.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39463.html



  • Hallo

    weil bei dem harten C-Style Cast keine Überprüfung durchgeführt wird, ob Sender wirklich gecastet werden kann. Also ist wird Chart nicht auf NULL gesetzt, wenn der Cast nicht möglich ist. Deshalb ist die nachfolgende Überprüfung auf NULL sinnlos.
    Wenn man sich bei casts nicht sicher ist, deshalb dynamic_cast mit Überprüfung.
    Ansonsten statt dem C-Style Cast auch gleich static_cast nehmen.

    /Edit : zu spät...

    bis bald
    akari


Anmelden zum Antworten