Frage zu Fenstern
Verfasst: 31.12.2011 19:07
				
				Hallo zuasammen,
ich habe ein Problem, mit dem ich nicht voran komme.
Aus einem geöffneten Hauptfenster (mit Menü und ein paar Gadgets) rufe ich eine Prozedur auf, die einige Zeit benötigt um irgendwelche Dinge zu tun. Um dem Benutzer eine visuelle Rückmeldung zu geben, lasse ich in einem 2. kleinen Fenster eine ProgressBar anzeigen.
Wenn man nun während die Progressbar läuft in eines der Fenster klickt (manchmal auch erst nach ein paar Mal), bleibt die ProgressBar stehen und in der Titelzeile des 2. Fensters erscheint "(Keine Rückmeldung)". Das Programm arbeitet im Hintergrund aber weiter und wenn es fertig ist, kehrt es auch ins Hauptfenster zurück.
Hier mal eine Kurzfassung des Codes um zu zeigen was ich meine:
Was mache ich denn da falsch? Vermutlich ist es etwas Grundlegendes, aber ich komme nicht drauf. 
In diesem Sinne... guten Rutsch!
			ich habe ein Problem, mit dem ich nicht voran komme.
Aus einem geöffneten Hauptfenster (mit Menü und ein paar Gadgets) rufe ich eine Prozedur auf, die einige Zeit benötigt um irgendwelche Dinge zu tun. Um dem Benutzer eine visuelle Rückmeldung zu geben, lasse ich in einem 2. kleinen Fenster eine ProgressBar anzeigen.
Wenn man nun während die Progressbar läuft in eines der Fenster klickt (manchmal auch erst nach ein paar Mal), bleibt die ProgressBar stehen und in der Titelzeile des 2. Fensters erscheint "(Keine Rückmeldung)". Das Programm arbeitet im Hintergrund aber weiter und wenn es fertig ist, kehrt es auch ins Hauptfenster zurück.
Hier mal eine Kurzfassung des Codes um zu zeigen was ich meine:
Code: Alles auswählen
;**** Fenster-Test ***
; Fenster
Enumeration
  #Window_0
  #Window_1
EndEnumeration
; Menüs
Enumeration
  #MenuBar_0
  #MENU_3   ;öffnen
  #MENU_4   ;schliessen
  #MENU_5   ;ende
EndEnumeration
;Gadgets
Enumeration
  #Frame3D_0
  #Frame3D_2
  #ProgressBar
  #StatusBar
  #StatusText
  #Text_0
EndEnumeration
Procedure Open_Window_0()  ; Hauptfenster
  If OpenWindow(#Window_0, 216, 0, 800, 550, "Viewer",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Datei")
      MenuItem(#MENU_3, "Arbeiten")
      MenuItem(#MENU_4, "Schliessen")
      MenuItem(#MENU_5, "Ende")
    EndIf
    
    If CreateStatusBar(#StatusBar, WindowID(#Window_0))
      AddStatusBarField(300)
      AddStatusBarField(480)
      StatusBarText(#StatusBar, 0, "Programmstart")
      StatusBarText(#StatusBar, 1, "", #PB_StatusBar_Right)
    EndIf
    
    If CreateGadgetList(WindowID(#Window_0))
      Frame3DGadget(#Frame3D_0, 190, 0, 610, 90, "Aufnahme-Daten")
      Frame3DGadget(#Frame3D_2, 190, 90, 605, 415, "Image") 
    EndIf
  EndIf
EndProcedure
Procedure Open_Window_1()  ; Progress-Bar
  If OpenWindow(#Window_1, 216, 0, 270, 70, "Fortschrittanzeige",#PB_Window_WindowCentered, WindowID(#Window_0))
    If CreateGadgetList(WindowID(#Window_1))
      ProgressBarGadget(#ProgressBar, 10, 40, 250, 20, 0, 100, #PB_ProgressBar_Smooth)
      TextGadget(#StatusText, 20, 10, 230, 20, "Statusinformation", #PB_Text_Center)
    EndIf
  EndIf
  StickyWindow(#Window_1,1)
EndProcedure
Procedure Arbeite()
  
  Protected i
  Protected j
  
  Open_Window_1()
  
  For j = 1 To 10
    For i = 0 To 100 Step 1
      SetGadgetState(#ProgressBar, i) 
      Delay(10)
    Next
    For i = 100 To 0 Step -1
      SetGadgetState(#ProgressBar, i) 
      Delay(10)
    Next i
  Next j
  
  CloseWindow(#Window_1)
EndProcedure
Open_Window_0()
StatusBarText(#StatusBar, 0, "")
Repeat                                  ; Schleife Hauptfenster
 
  Event = WaitWindowEvent()             ; auf Ereignis warten
  WindowID = EventWindow()              ; welches Fenster?
  GadgetID = EventGadget()              ; welches Gadget?
  EventType = EventType()               ; welches Ereignis
  If WindowID = #Window_0               ; im Hauptfenster ist was passiert...
    Select Event
      Case  #PB_Event_Menu              ; Menü wurde gewählt 
        Select EventMenu()              ; welches Menü?
          Case #MENU_3                  ;  -> Arbeiten
            MessageRequester("Info", "Menü: Arbeiten")
            Arbeite()
          Case #MENU_4                  ;  -> Schliessen
            MessageRequester("Info", "Menü: Schliessen")
          Case #MENU_5                  ;  -> Ende
            MessageRequester("Info", "Menü: Ende")
            Goto Ende
        EndSelect
        
      Case #PB_Event_Gadget             ; Gadget wurde gewählt
        ;....
    EndSelect
     
  EndIf
Until WindowID = #Window_0 And Event = #PB_Event_CloseWindow ; Fenster schliessen
ende:
CloseWindow(#Window_0)
End    
In diesem Sinne... guten Rutsch!