Einträge in neuem PopUp Menü einsetzen



  • Hallo,

    TPopupMenu* Pop1 = new TPopupMenu(this);   // neues Menü erzeugen
     Pop1->Items->Add(????);                   // wie kommt neuer Eintrag rein?????
     Pop1->Items->NewTopLine();
     Pop1->Popup(10,10);
     delete Pop1;
    

    Möchte ein PopupMenü erstellen, dann beliebige Einträge
    eintragen, nach Auswahl durch User das Popup wieder löschen..

    Die BCB Hilfe ist leider super knapp (erstellen Sie mit new ein
    neues Popup) und in der FAQ und google steht auch nur immer
    TPopupMenu benützen.. Aber wie kommt ein Eintrag (STRING!) rein????
    Da ich Ordnernamen anbieten möchte, muss das Menü flexibel sein
    (während Laufzeit jederzeit neue Namen möglich)

    Gruss und Danke
    Stefan



  • Stefan7124 schrieb:

    Die BCB Hilfe ist leider super knapp

    Hallo!? In der Hilfe zu TMenu::Items wie auch zu TMenuItem::Add gibt es konkrete Beispiele.



  • 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.


Anmelden zum Antworten