Einträge in neuem PopUp Menü einsetzen



  • 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