PopUpMenü und Menü

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

PopUpMenü und Menü

Beitrag von MASH »

Wie kann ich ein Pupupmenü und ein normales menü gleichzeitg verwenden ich bekomme den Schleifenbaum einfach nicht hin hier mal ein beispiel was ich bisher versucht habe:

Code: Alles auswählen

Repeat
  Event = WaitWindowEvent()
  
  Select EventType()
    Case #PB_EventType_RightClick      ; rechte Maustaste wurde gedrückt =>
    DisplayPopupMenu(#MenuPopUp_0,WindowID())  ; Popup-Menü jetzt öffnen 
    Repeat
      If Event = #PB_Event_Menu        ; ein Eintrag des Popup-Menüs wurde angeklickt
      Select EventMenuID()     ; ermittle den angeklickten Menü-Eintrag...
        Case 1 : Debug "Menu: Open"
        Case 2 : Debug "Menu: Save"
        Case 3 : Debug "Menu: Save as"
        Case 4 : Quit = 1
        Case 5 : Debug "Menu: PureBasic.exe"
        Case 6 : Debug "Menu: Text.txt"
      EndSelect
      EndIf
    Until Quit = 1
  EndSelect

    Select EventMenuID()
      
      Case #MENU_1  ;Öffnen
        Debug "GadgetID: #MENU_1"
      Case #MENU_2  ;Speichern
        Debug "GadgetID: #MENU_2"
      
      Case #MENU_3  ;Beenden
        Debug "GadgetID: #MENU_3"
        MessageRequester("INFO","BEENDEN",0)
        End
      
      Case #MENU_4  ;(Bearbeiten Untermenü)
        Debug "GadgetID: #MENU_4"
      
      Case #MENU_5  ;Kennwort
        Debug "GadgetID: #MENU_5"

    EndSelect

  
Until Event = #PB_EventCloseWindow

End
Danke Mark S.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Hi Mark.

Du brauchst nach dem Aufruf von DisplayPopupmenu() keine eigene Eventschleife einbauen (bei der du zudem nichteinmal waitwindowevent() oder Windowevent() nutzt) Du kannst es einfach in die normale Schleife einbauen.
zudem solltest du Event auch auswerten, anstatt alles durch zu testen

Code: Alles auswählen

Repeat
  Event = WaitWindowEvent()
 if event=#pb_eventtype
  Select EventType()
    Case #PB_EventType_RightClick      ; rechte Maustaste wurde gedrückt =>
    DisplayPopupMenu(#MenuPopUp_0,WindowID())  ; Popup-Menü jetzt öffnen
wurde angeklickt
  EndSelect
elseif event=#pb_eventmenu
    Select EventMenuID()
        Case 1 : Debug "Menu: Open"
        Case 2 : Debug "Menu: Save"
        Case 3 : Debug "Menu: Save as"
        Case 4 : Quit = 1
        Case 5 : Debug "Menu: PureBasic.exe"
        Case 6 : Debug "Menu: Text.txt"     
      Case #MENU_1  ;Öffnen
        Debug "GadgetID: #MENU_1"
      Case #MENU_2  ;Speichern
        Debug "GadgetID: #MENU_2"
     
      Case #MENU_3  ;Beenden
        Debug "GadgetID: #MENU_3"
        MessageRequester("INFO","BEENDEN",0)
        End
     
      Case #MENU_4  ;(Bearbeiten Untermenü)
        Debug "GadgetID: #MENU_4"
     
      Case #MENU_5  ;Kennwort
        Debug "GadgetID: #MENU_5"

    EndSelect
endif
 
Until Event = #PB_EventCloseWindow

End
Das sollte so laufen, hab´s jetzt net getestet.
Du musst aber natürlich darauf achten, dass du die Menuitems im Popupmenu anders durchnummerierst als die im Normalen Menu

Also nicht:
Normales Menu: 1,2,3
Popupmenu: 1,2,3

sondern:
Normales Menu: 1,2,3
Popupmenu:4,5,6

Das ist wichtig, wenn du wissen willst, welches Menuitem denn nun betätigt wurde. Haben allerdings beide die gleiche Funktion ist es nicht weiter wichtig.

Und noch ein Tip:

#menu_1 sagt nicht´s über die Funktion dieses Menuitems aus, du solltest vielleicht die items nach ihrer Funktion benennen (#menu_open für "Datei öffnen" zum Beispiel)
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Beitrag von MASH »

Danke ich habe es jetzt verstanden glaube ich. Ich habe es jetzt wie folgt gelöst:

Code: Alles auswählen

Repeat
  Event = WaitWindowEvent()
    EventType = EventType()
    
  If EventType = #PB_EventType_RightClick
    DisplayPopupMenu(#MenuPopUp_0,WindowID())

  ElseIf Event = #PB_EventMenu 
    Select EventMenuID()
      
      Case #Menu_Open  ;Öffnen
        Debug "GadgetID: #MENU_1"

      Case #Menu_Save  ;Speichern
        Debug "GadgetID: #MENU_2"
      
      Case #Menu_Exit  ;Beenden
        Debug "GadgetID: #MENU_3"
        MessageRequester("INFO","BEENDEN",0)
        End
      
      Case #Menu_df  ;(Bearbeiten Untermenü)
        Debug "GadgetID: #MENU_4"
      
      Case #Menu_DatabasePWD  ;Kennwort
        Debug "GadgetID: #MENU_5"
        
      Case #PopMenu_1
        Debug "#PopMenu_1"
      
      Case #PopMenu_2
        Debug "#PopMenu_2"
      
      Case #PopMenu_3
        Debug "#PopMenu_3"

    EndSelect
EndIf
  
Until Event = #PB_EventCloseWindow
Funktionieren tut es ist das denn auch so gut geschrieben??
Danke Mark S.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Ich finds gut so, nur das du auch im Popupmenü nicht #PopMenu_1 usw. benutzen solltest.
Aber ich denke mal das sollte eh nur ein Beispiel sein.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

MASH hat geschrieben:Funktionieren tut es ist das denn auch so gut geschrieben??
ich persönlich springe nicht mit End aus Repeat-Schleife, sondern
verwende hierfür eine Variable (Quit). Das ermöglicht, am Ende der
Schleife evtl. Aufräumarbeiten durchzuführen.

Des weiteren würde ich ebenso wie Batze die Popupmenü-Items mit
sprechenden Namen (so wie Dein Menü) ausstatten.

Code: Alles auswählen

Repeat
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadgetID() ; Is it a gadget event?
  EventType = EventType() ; The event type
  
  Select EventType 
    
    Case #PB_EventType_RightClick
      
      DisplayPopupMenu(#MenuPopUp_0,WindowID())
      
    Case  #PB_EventMenu 
      
      Select EventMenuID()
        
        Case #Menu_Open  ;Öffnen
          Debug "GadgetID: #MENU_1"
          
        Case #Menu_Save  ;Speichern
          Debug "GadgetID: #MENU_2"
          
        Case #Menu_Exit  ;Beenden
          Debug "GadgetID: #MENU_3"
          Quit = 1
          
        Case #Menu_df  ;(Bearbeiten Untermenü)
          Debug "GadgetID: #MENU_4"
          
        Case #Menu_DatabasePWD  ;Kennwort
          Debug "GadgetID: #MENU_5"
          
        Case #PopMenu_1
          Debug "#PopMenu_1"
          
        Case #PopMenu_2
          Debug "#PopMenu_2"
          
        Case #PopMenu_3
          Debug "#PopMenu_3"
          
      EndSelect
      
    Case #PB_EventCloseWindow
      Quit = 1
      
  EndSelect
  
Until Quit = 1

CloseWindow(#DeinWindow)

; evtl. Aufräumaktionen
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Das mit dem Quit ist auch Geschmackssache.
Es gibt bestimmt auch Leute die gern Brake benutzen oder sich eine eigene Prozedur zum aufräumen schreiben.
Das mit der Prozedur ist bei Fehlermeldungen mit anschließendem beenden wirklich praktisch.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Das mit dem Quit ist auch Geschmackssache.

yipp, jeder so, wie er gern möchte.

> Es gibt bestimmt auch Leute die gern Brake benutzen

na, ich gehe nicht so gern in die Eisen beim Programmieren ;-)

Grüße ... Kiffi
a²+b²=mc²
Antworten