[code] Eventloop für mehrere Fenster

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

[code] Eventloop für mehrere Fenster

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag 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
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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. ;)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Little John

Beitrag 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
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

so ähnlich wie Kurzer mache ich das auch.

@Kurzer: Ist dein Ava ein frosch? Oder war es eben eher übertragen
gemeint?
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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:
Zuletzt geändert von Kurzer am 05.06.2009 17:16, insgesamt 1-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag 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:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Antworten