Zugriff aufs Kontextmenü mit c++ (wie komm ich an das entsprechende item?)

Aj2010

Mitglied
Hi,

zuerst einmal an die Mods, bitte den thread dynamisches array löschen von mir. hab da den falschen titel eingegeben und zudem ist das schon gelöst.

so, nun zu meinem Problem. Das KontextMenü wird nun dynamisch erstellt. Ich muss aber das entsprechende Item bearbeiten beim Klick. Damit es danach nicht mehr auftaucht im Kontextmenü.

hier mal mein code Ansatz

Code:
void Form1::aufbauAntworten() {
		List<Antwort^> ^daten;
		for each (AntwortDaten ^fach in faecher) {
			if (fach->getAusgewaehlt()) {
				daten = fach->getAntworten();
			}
		}
		
		contM = gcnew System::Windows::Forms::ContextMenu();
		this->ContextMenu = contM;
		for each (Antwort ^antwort in daten){
			if(antwort->istSichtbar()) {
				MenuItem ^mnuItemOpenWith = gcnew MenuItem();
				mnuItemOpenWith->Text = antwort->getAntwort();
				mnuItemOpenWith->MenuItems->Add(mnuItemOpenWith);
				mnuItemOpenWith->Click += gcnew System::EventHandler(this, &Correctus::Form1::menuItem1_Click);
			}
		}
	}

	System::Void Form1::menuItem1_Click(System::Object^ sender, System::EventArgs ^e) {
		sender->faecher->abgehackt();  //hier ist das problem
	}

ich hab schon einiges in der click-Methode versucht. Aber ich komm nicht drauf. Ich muss in der entsprechenden Antwort nen boolschen Wert auf false setzen, damit ich weiter machen kann.

Wisst ihr da was zu?
 
ja, will ich dann auch machen. aber ich muss dafür ja an das item kommen, welches da geklickt wurde. da das mit jedem neuaufruf neu erstellt wird... da ich an die einzelnen antworten eh ran kommen muss, da ja jede antwort eine unterschiedliche punktezahl haben kann.
 
Zuletzt bearbeitet:
Hi,

in dem sender ist das geklickte Item.

Versuch es mal so (ungetestet)

C++:
System::Void Form1::menuItem1_Click(System::Object^ sender, System::EventArgs ^e) {
        
        // Ich weiß nicht 100%ig wie  casting in c++/cli gemacht wird aber es sollte so funktionieren.
        MenuItem ^item= (MenuItem)sender;

        if (item != null)
           item->Visible = false;
    }
 
meinst du einen static cast oder einen dynamischen cast?

habs jetzt so:
Code:
 MenuItem ^item= dynamic_cast<MenuItem^>(sender);
           item->abgehackt();

die methode ist in der antwort enthalten. aber der compiler sagt mir nun folgendes :
Form1.cpp(208): error C2039: 'abgehackt': Ist kein Element von 'System::Windows::Forms::MenuItem'
 
Zuletzt bearbeitet:
habs jetzt so:
Code:
 MenuItem ^item= dynamic_cast<MenuItem^>(sender);
           item->abgehackt();

die methode ist in der antwort enthalten. aber der compiler sagt mir nun folgendes :
Form1.cpp(208): error C2039: 'abgehackt': Ist kein Element von 'System::Windows::Forms::MenuItem'

Ja, dass ich aber auch klar, wir haben im Moment nur ein Objekt MenuItem und das hat diese Methode nicht! Wir müssen noch eine Möglichkeit finden von dem jeweiligen Item auf die dazugehörige Antwort zu kommen. Das kann man z. B. erledigten in dem man den Item-Text mit den Antworten vergleicht und somit die Antwort finden und abhacken kann:D

C++:
System::Void Form1::menuItem1_Click(System::Object^ sender, System::EventArgs ^e) {
       // wir durchlaufen alle Fächer und holen alle ausgewählten Antworten raus.
       List<Antwort^> ^daten; 
       for each (AntwortDaten ^fach in faecher) 
       {
            if (fach->getAusgewaehlt()) 
            {
                daten = fach->getAntworten();
            }
        }

        // holen und konvertieren den geklickten Menü-Eintrag.
        MenuItem ^item= (MenuItem)sender;
 
        if (item == null)
           return;

        // Durchlaufen alle Antworten und suchen nach der Antwort mit dem gleichen Antwort-Text wie der Menü-Eintrag.
        for each (Antwort ^antwort in daten)
        {
            if(antwort->getAntwort() == item->Text) 
            {
               antwort->abgehackt();
            }
        }
}

So sollte es jetzt funktionieren (ungetestet)

Gruß
 
jetzt wo du es sagst ^^ das tete ich gleich mal. natürlich abgewandelt. jetzt ist nur noch die frage wie mach ich das bei einem bestimmten event sichtbar? weil ich hab bis jetzt ja das menü erstellt und die items auch, aber wurden ja beide noch nicht zusammengeführt.

ich hab das derzeit so, dass eine bestimmte reihenfolge an pixeln gezeichnet werden muss, damit die
methode aufgerufen wird. ich denk mal, das bekomm ich mit der visible oder showdialog hin, richtig?

So, Contextmenü steht. geht aber nur über rechtsklick auf. das ist aber nicht, was ich erreichen will. gibts da noch ne andere möglichkeit, damit ich das durch ein gezieltes event auslösen kann?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück