Einträge in neuem PopUp Menü einsetzen
-
Das ist die Originalhilfe des BCB:
*Die Methode TPopupMenu erzeugt eine Instanz von TPopupMenu.
__fastcall virtual TPopupMenu(Classes::TComponent* AOwner);
Beschreibung
Rufen Sie TPopupMenu indirekt über das Schlüsselwort new auf, um zur Laufzeit ein Popup-Menü zu erstellen. Die Erstellung von Popup-Menüs, die beim Entwurf in Formulare oder Datenmodule eingefügt wurden, erfolgt automatisch.
*Das Hallo!? ist also kaum gerechtfertig; über die Links oberhalb des
Themas kommt man ebenfalls nicht zu Deinem Link; allerdings hatte ich den
auch gefunden, kam aber damit nicht klar, da als Newbie die Hilfe leider
nicht immer gleich verständlich ist.So sieht für mich eine für Newbies verständliche Hilfe aus:
void __fastcall TForm1::Auswhlen1Click(TObject *Sender) {AnsiString z1; int i1, i3; // Vars definieren TPopupMenu *Pop1 = new TPopupMenu(this); // neues PopupMenü erzeugen for (int i2 = 0; i2 < frm1_cbGruppe->Items->Count; ++i2) { // Combo Gruppe auslesen TMenuItem *NewItem = new TMenuItem(Pop1); // Neuen Eintrag erzeugen Pop1->Items->Add(NewItem); // dem Popup-Menü hinzufügen NewItem->Caption = frm1_cbGruppe->Items->operator [](i2); // Eintrag aus Combo auslesen und anhängen NewItem->OnClick = Pop1MenuItemsClick; // eine Ereignisbehandlungsroutine zuweisen } TMenuItem *NewItem = new TMenuItem(Pop1); // Neuen Eintrag erzeugen Pop1->Items->Add(NewItem); // dem Popup-Menü hinzufügen NewItem->Caption = "Abbruch"; // Eintrag anhängen Pop1->Popup(10,10); // Popup Menü zeigen }Trotzdem danke für Deinen Tipp
Gruss Stefan
-
Eine Frage habe ich jetzt aber schon noch:
Wie komme ich an den Auswahlindex oder Names des Menüs,
welches der User im Popup-Menü ausgewählt hat?Da ja das Menü in einer Schleife erzeugt wird (For())
kann ich dem OnKlickEreignis ja auch nur eine Routine
zuweisen. Wie kann ich aber da erkennen, welches Menü
nun ausgewählt wurde?NewItem->OnClick = Pop1MenuItemsClick; / ?????Danke und Gruss Stefan
-
(falscher Beitrag)

Gruss Stefan
-
Hallo
Da ja das Menü in einer Schleife erzeugt wird (For())
kann ich dem OnKlickEreignis ja auch nur eine Routine
zuweisen.Warum? Du kannst auch die Methoden in der Schleife gezielt verteilen, wenn diese unterschieldiche Bedeutung haben. Zum Beispiel über ein Array.
Wie kann ich aber da erkennen, welches Menü
nun ausgewählt wurde?Über den Parameter Sender des OnClick-Events. Du kannst beim Erstellen der MenuItems jedem von diesem in die Eigenschaft Tag eine eindeutige Zahl geben, zum Beispiel die Leufvariable der For-Schleife.
Dann kannst du beim Eventaufruf mit einem Cast des Senders auf TMenuItem wieder den Tag auslesen und weist welcher Menueintrag gemeint ist.bis bald
akari
-
Hallo, akari
da ich erst 2 Wochen in C++ programmiere, weiss ich noch nicht, wie man mittels Array die Routinen zuordnen kann. Die Methode mit dem Tag finde ich aber eleganter.
Leider komme ich mit Sender und Cast und zugehöriger Hilfe nicht ganz klar. So habe ich es aktuell (das Sender->Free() ist nur so im Moment damit keine Fehlermeldung kommt):void __fastcall TForm1::frm1_btnPopupClick(TObject *Sender) {int i1=1; AnsiString z1; // Vars definieren i1=Pop1->Tag; // ??? Sender->Free() // ??? ShowMessage(i1); //delete Pop1; // Popup löschen } void __fastcall TForm1::Auswhlen1Click(TObject *Sender) {AnsiString z1; int i1, i3; // Vars definieren Pop1 = new TPopupMenu(this); // Popup neu erzeugen for (int i2 = 0; i2 < frm1_cbGruppe->Items->Count; ++i2) { // Combo Gruppe auslesen TMenuItem *NewItem = new TMenuItem(Pop1); // Neuen Eintrag erzeugen Pop1->Items->Add(NewItem); // dem Popup-Menü hinzufügen NewItem->Caption = frm1_cbGruppe->Items->operator [](i2); // Eintrag aus Combo auslesen und anhängen NewItem->Tag=i2; // MenüID eintragen NewItem->OnClick=frm1_btnPopupClick; // Ereignissroutine zuordnen } Pop1->Items->NewBottomLine(); // Trennlinie anhängen TMenuItem *NewItem = new TMenuItem(Pop1); // Neuen Eintrag erzeugen NewItem->Caption = "Abbruch"; // Eintrag anhängen Pop1->Items->Add(NewItem); // dem Popup-Menü hinzufügen Pop1->Alignment=paRight; // Ausrichtung rechts zum Mauszeiger Pop1->Popup(5,5); // Menü zeigen an X/Y z1=Pop1->Items->Caption; }Dazu noch eine Frage, wo ich gestern mir den Wolf gesucht habe:
Wie bekomme ich aktuelle Mauskoordinaten für den Befehl Popup?
Mit Mouse scheint es nicht zu gehen (habe gestern den ganzen Tag
am Popup rumgemacht.... seufz)
Danke für die sehr guten Tipps!
Stefan
-
Hallo
void __fastcall TForm1::frm1_btnPopupClick(TObject *Sender) {int i1=1; TMenuItem *CurItem = dynamic_cast<TMenuItem *> (Sender); // Versuchen, Sender als MenuItem anzusprechen if (CurItem) // Wenn Versuch erfolgreich, mit CurItem weiterarbeiten { i1=CurItem->Tag; ShowMessage(i1); } }Dazu noch eine Frage, wo ich gestern mir den Wolf gesucht habe:
Wie bekomme ich aktuelle Mauskoordinaten für den Befehl Popup?Wozu? Dafür hast du doch den Event, der dir sagt was geklickt wurde.
bis bald
akari
-
Hei, akari
Vielen Dank, funktioniert. Das Cast wandelt also den Sender
in den benötigten Typ rum, richtig? Klappt jedenfalls.
Die Mauskoordinaten suche ich wegen dem Befehl
int x,y; x=5 y=5 Pop1->Popup(x,y);Statt x/y mit Koordinate 5 möchte ich das Menü logischerweise
unter der Maus haben (mit Aligment passiert nichts).
Ich kenne aus anderen Sprachen z.B. MouseX oder MousesX; bei
Mouse->... finde ich aber nichts.Gruss Stefan
-
Hallo,
Es gibt ja Mouse->CursorPos. Das gibt dir die Position in globalen Koordinaten.
-
Hallo,
das ist ja das Problem; bei Mouse-> kommt bei mir als Auswahl kein CursorPos!!
Mach ich was falsch ????Stefan
-
Welche Builderversion hast du denn?
Wenn den BCB6: verwendest du VCL oder CLX?
-
Hei,
den BCB6 mit VCL
-
Die Eigenschaft gibt es definitiv im BCB6. Sie liefert eine Variable vom Typ TPoint zurück. Versuchs doch einfach mal.
-
Ne, kommen definitiv als Auswahl nur ein paar Funktionsaurufe.
Bei Eingabe Mouse->C kommen nur zwei Auswahltexte (ClassNameIs...)Könnte ja mal einen Screenshot zusenden; aber schätze da kann man
nicht viel falsch machen.... oder?Gruss Stefan
-
warum nutzt du nicht einfach die Hilfe?
unter TMouse -> Eigenschaften -> CursorPos
-
Hallo, Linnea
weiss zwar jetzt nicht genau, was der Hinweis auf die Hilfe soll,
aber es ändert nichts an der Tatsache, daß bei Aufruf
Mouse->C.... eben KEINE Auswahl CursorPos kommt; ich habe die Hilfe
dafür kreuz und quer durchgeforstest; ebenfalls Foren und Google.Ich programmiere seit 20 Jahren und mag in C++ Newbie sein,
in Suche Online, Foren usw. bestimmt nicht.Wie wäre es mit einem konkreten Hinweis oder Tipp?
Gruss Stefan
-
ganz einfach mal eingeben und kompilieren?
z.B.
TPoint p = Mouse->CursorPos; String t = "X: " + IntToStr(p.x) + " Y: " + IntToStr(p.y); ShowMessage(t);
-
Stefan7124 schrieb:
Ne, kommen definitiv als Auswahl nur ein paar Funktionsaurufe.
Bei Eingabe Mouse->C kommen nur zwei Auswahltexte (ClassNameIs...)Die CodeInsight-Funktion ist so intelligent, dass sie nur Methoden bzw. Properties mit kompatiblen Rückgabewerten anbietet. Wenn du also schreibst
String bla = Mouse->dann werden auch nur die Methoden/Eigenschaften eingeblendet, die AnsiStrings zurückliefern. Ein
Mouse->hingegen listet alles auf.
Trotzdem sollte man mit 20 Jahren Programmiererfahrung eigentlich in der Lage sein, in der Hilfe die Auflistung der Methoden eines Objektes zu finden. Wenn schon nicht aus eigener Kraft, dann doch spätestens nach Studium von junix' entsprechender Anleitung.