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!