Seite 1 von 3

[code] Eventloop für mehrere Fenster

Verfasst: 04.06.2009 14:34
von Kaeru Gaman
Ich hab meinen etwas älteren Code mal überarbeitet...


Man kann mehrere Fenster von einem Eventloop aus steuern, ohne MDI oder Child/Parent zu verwenden.

Wichtig ist dabei vor allem, dass man für alle Gadgets eindeutige Nummern verwendet.
Und natürlich sollte man den Code gut strukturieren, um etwas wiederfinden zu können.

Code: Alles auswählen

;*********************************************************
;*** MoreWindows.pb
;***
;*** Example for use of EventWindow()
;*** to handle multiple Windows
;*** without child/parent
;***
;*** Review 2009-06-04  Kaeru Gaman
;***
;*** PB Ver 4.30 Win
;*********************************************************
EnableExplicit
;*************************************
Enumeration     ;Windows
  #Win_Main
  #Win_Sub1
  #Win_Sub2
  #Win_Sub3
  #Win_Sub4
EndEnumeration
;*************************************
Enumeration     ;Gadgets
  #Main_But_LaunchSub1
  #Main_But_LaunchSub2
  #Main_But_LaunchSub3
  #Main_Txt_Display
  #Sub1_But_TestBeep 
  #Sub2_But_TestBeep 
  #Sub3_But_LaunchSub4
  #Sub4_Opt_Text1
  #Sub4_Opt_Text2
  #Sub4_Opt_Text3
EndEnumeration
;*************************************
 Procedure OpenSub1()
  OpenWindow(#Win_Sub1, -1, -1, 200,150,"Sub1",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    ButtonGadget(#Sub1_But_TestBeep,10,10,60,20,"Beep Deep")
 EndProcedure
;*************************************
 Procedure OpenSub2()
  OpenWindow(#Win_Sub2, -1, -1, 200,150,"Sub2",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    ButtonGadget(#Sub2_But_TestBeep,10,10,60,20,"Beep High")
 EndProcedure
;*************************************
 Procedure OpenSub3()
  OpenWindow(#Win_Sub3, -1, -1, 200,150,"Sub3",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    ButtonGadget(#Sub3_But_LaunchSub4, 70,110,120,30,"Launch Sub4")
 EndProcedure
;*************************************
 Procedure OpenSub4()
  OpenWindow(#Win_Sub4, -1, -1, 200,150,"Sub4",#PB_Window_ScreenCentered | #PB_Window_SystemMenu )
    OptionGadget(#Sub4_Opt_Text1,20,20,160,20,"Beef")
    OptionGadget(#Sub4_Opt_Text2,20,50,160,20,"Lamb")
    OptionGadget(#Sub4_Opt_Text3,20,80,160,20,"Fish")
 EndProcedure
;*************************************
OpenWindow(#Win_Main,0,0,320,240,"Main", #PB_Window_ScreenCentered | #PB_Window_SystemMenu )
  ButtonGadget(#Main_But_LaunchSub1,190,120,120,30,"Launch Sub1")
  ButtonGadget(#Main_But_LaunchSub2,190,160,120,30,"Launch Sub2")
  ButtonGadget(#Main_But_LaunchSub3,190,200,120,30,"Launch Sub3")
  TextGadget(#Main_Txt_Display,10,10,160,20, "No Choice yet", #PB_Text_Border)
;*************************************
Define Event.i, EvWin.i, EvGad.i
Define EXIT.l
Define DisplayTxt$ = "Your Choice is "
;*************************************
Repeat
  Event = WaitWindowEvent()
  EvWin = EventWindow()
  EvGad = EventGadget()
  Select EvWin
;*********************************************************
;*** Main Window
;*********************************************************
    Case   #Win_Main
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EvGad
            Case #Main_But_LaunchSub1
              OpenSub1()
            Case #Main_But_LaunchSub2
              OpenSub2()
            Case #Main_But_LaunchSub3
              OpenSub3()
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          EXIT = 1
      EndSelect
;*********************************************************
;*** Sub Window 1
;*********************************************************
    Case #Win_Sub1
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EvGad
            Case #Sub1_But_TestBeep
              ; Beep_( 500,300)
              MessageBeep_( #MB_ICONERROR )
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub1)
      EndSelect
;*********************************************************
;*** Sub Window 2
;*********************************************************
    Case #Win_Sub2
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EvGad
            Case #Sub2_But_TestBeep
              ; Beep_(1500,300)
              MessageBeep_( #MB_ICONEXCLAMATION )
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub2)
      EndSelect
;*********************************************************
;*** Sub Window 3
;*********************************************************
    Case #Win_Sub3
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EvGad
            Case #Sub3_But_LaunchSub4
              OpenSub4()
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub3)
      EndSelect
;*********************************************************
;*** Sub Window 4
;*********************************************************
    Case #Win_Sub4
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EvGad
            Case #Sub4_Opt_Text1
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Beef")
            Case #Sub4_Opt_Text2
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Lamb")
            Case #Sub4_Opt_Text3
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Fish")
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_Sub4)
      EndSelect
;*********************************************************
;*** End of Window List
;*********************************************************
  EndSelect
Until EXIT = 1
End

Verfasst: 04.06.2009 19:23
von HeX0R
Ich finde es sehr unpraktisch den Code grundsätzlich nach EventWindow() unterscheiden zu lassen.
Da man ohnehin fortlaufende Konstanten für Gadgets und Menüs verwendet, braucht man bei diesen Events nicht wissen, welches Fenster gemeint ist.

Auch für die meisten API-Events ist es erst mal egal, welches Fenster das Signal gesendet hat (es sei denn ich will es wirklich wissen).

So finde ich das eher suboptimal gelöst und im Endeffekt zu aufwändig.

Besser grundsätzlich nach dem eigentlichen Event auflösen und dann, wenn ich es wirklich brauche (z.B. bei #PB_Event_CloseWindow) noch das Fenster abfragen.

Verfasst: 04.06.2009 22:24
von Kai
Ich bevorzuge dieses Grundgerüst.
Aber wie man es sich aufteilt, bleibt eh jedem selbst überlassen, man muss ja selbst wissen wie man am besten die Übersicht behält. :mrgreen:

Code: Alles auswählen

Repeat
  
  iWinEvent    = WaitWindowEvent()
  iEventWin    = EventWindow()
  iEventGadget = EventGadget()
  iEventMenu   = EventMenu()
  iEventType   = EventType()
  
  Select iWinEvent
    Case #PB_Event_Gadget
      Select iEventGadget
      EndSelect
    Case #PB_Event_Menu
    Case #PB_Event_CloseWindow
      Select iEventWin
      EndSelect
  EndSelect

ForEver

Verfasst: 05.06.2009 13:05
von Kurzer
Der grüne Frosch macht's so wie der rote Frosch ganz oben.
Allerdings ziehe ich es vor für jedes Fenster bzw. Aufgabengruppe eine eigene Includedatei zu benutzten in der dann auch die anteilige Eventbehandlung abläuft. Insgesamt bleibts natürlich eine große Event-Schleife.

Beispiel eines Gerüsts:
MAINWINDOW:

Code: Alles auswählen

Repeat
  Event       = WaitWindowEvent(25)
  EventType   = EventType()
  EventWindow = EventWindow()
  EventwParam = EventwParam()
  EventlParam = EventlParam()
  EventGadget = EventGadget()
  EventMenu   = EventMenu()
  
  
  Select EventWindow
  Case #Window_Main
    Main_EventLoop()
  Case #AnderesFenster
    AnderesFenster_EventLoop()
  usw...
  EndSelect
  
Until Event = #PB_Event_CloseWindow And EventWindow = #Window_Main
Und in jedem Include dann eine entsprechende Prozedure für die Events:

Code: Alles auswählen

Procedure Main_EventLoop()
  ; +-----------------------------------------------------------------
  ; |Description  : Arbeitet die Events des Main-Fensters ab
  ; |Arguments    : Keine, da die entsprechenden Variablen global sind
  ; |Results      : -
  ; +-----------------------------------------------------------------
  Select Event
  Case #PB_Event_Gadget
    Select EventGadget
      Case #Gadget : GadgetProzedur()
    EndSelect
  EndSelect
  
EndProcedure

Code: Alles auswählen

Procedure AnderesFenster_EventLoop()
  ; +-----------------------------------------------------------------
  ; |Description  : Arbeitet die Events des Anderen-Fensters ab
  ; |Arguments    : Keine, da die entsprechenden Variablen global sind
  ; |Results      : -
  ; +-----------------------------------------------------------------
  Select Event
  Case #PB_Event_Gadget
    Select EventGadget
      Case #Gadget : GadgetProzedur()
    EndSelect
  EndSelect
  
EndProcedure
Ich verheddere mich sonst so oft in langen codes. ;)

Verfasst: 05.06.2009 15:08
von Little John
Kurzer hat geschrieben:dann eine entsprechende Prozedure für die Events
Sowas in der Art hatte ich auch schon im englischen Forum gesehen (ob nun mit Include-Dateien oder nicht ist nochmal ne andere Frage). Das sprach mich zunächst an, weil es sehr aufgeräumt wirkte. Allerdings denke ich führt das leicht zu diversen globalen Variablen (oder einem Haufen Parametern), so dass ich davon wieder Abstand genommen habe.

Gruß, Little John

Verfasst: 05.06.2009 16:31
von Andesdaf
so ähnlich wie Kurzer mache ich das auch.

@Kurzer: Ist dein Ava ein frosch? Oder war es eben eher übertragen
gemeint?

Verfasst: 05.06.2009 16:52
von ts-soft
Andesdaf hat geschrieben:@Kurzer: Ist dein Ava ein frosch? Oder war es eben eher übertragen gemeint?
Sei froh wenn das Miss Piggy nicht gehört hat :twisted:

Verfasst: 05.06.2009 17:12
von Kurzer
ts-soft hat geschrieben: Sei froh wenn das Miss Piggy nicht gehört hat :twisted:
Ich wollt' grad sagen... :lol:

Andesdaf, sag bloß Du kennst Kermit den Frosch nicht? :shock:

Verfasst: 05.06.2009 17:15
von Kurzer
Little John hat geschrieben: Sowas in der Art hatte ich auch schon im englischen Forum gesehen (ob nun mit Include-Dateien oder nicht ist nochmal ne andere Frage). Das sprach mich zunächst an, weil es sehr aufgeräumt wirkte. Allerdings denke ich führt das leicht zu diversen globalen Variablen (oder einem Haufen Parametern), so dass ich davon wieder Abstand genommen habe.
Es müssen dabei maximal nur diese Variablen global sein:

Code: Alles auswählen

  Event
  EventType
  EventWindow
  EventwParam
  EventlParam
  EventGadget
  EventMenu
Wo siehst Du da Gefahren oder Probleme?

Verfasst: 05.06.2009 17:17
von rolaf
Der alte rote und der befrackte grüne Frosch sprechen mir aus der Seele, ich machs mir ähnlich bei Progs mit mehreren Fenstern. Anderes war mir immer zu fuchsig. :mrgreen: