Seite 1 von 1

Fenster-Probleme beim Aufbau

Verfasst: 10.01.2005 15:43
von Agent
Hallo PBler.

Ich weiß, oft diskutiert. Trotzdem frag ich hier mit einem Beispiel was an:
Kleiner code unten, soll nur ein Fenster aufmachen und ein paar Gadgets darstellen. Beim Ausführen ist aber weder der Text, noch die bilder (momentan Kommentiert) angezeigt. Das ProgressGadget wird prima angezeigt, warum? Mach ich einen generellen Fehler im Umgang mit Fenstern? Oft habe ich auch (bei mehr Gadgets) einen langsamen Fensteraufbau - man kann zuschauen, also alle 125ms ein Gadget oder so. Auch wenn ich erst das Fenster füllen lasse, und danach mit hidewindow anzeigen lasse - same problem.

Da mach ich doch generell einen Fehler oder?

Hier erstmal der Code....

Code: Alles auswählen

#winsplat=1000
#splattext=1001
#progressbar=1002
#SW_Name="test"
#SW_Version="0.0.0.01"
loadingdelay=500

; ##### Splat-Window
winsplat=OpenWindow(#winsplat,0,0,300,126,#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible,#SW_Name)  ; 
If winsplat
  If CreateGadgetList(winsplat)
    ;CatchImage(#splatlogo,?cbm_logo)
    ;SetWinBackgroundImage(winsplat,UseImage(#splatlogo))
    ;ImageGadget(#splatlogo_gadget,0,0,300,86,UseImage(#splatlogo))
    TextGadget(#splattext,0,86,300,20,#SW_Version)
    ProgressBarGadget(#progressbar,0,106,300,20,0,100)
    While WindowEvent():Wend 
    HideWindow(#winsplat,0)
  EndIf 
EndIf

SetGadgetState(#progressbar,20) : Delay(Random(loadingdelay))
SetGadgetState(#progressbar,40) : Delay(Random(loadingdelay))
SetGadgetState(#progressbar,60) : Delay(Random(loadingdelay))
SetGadgetState(#progressbar,80) : Delay(Random(loadingdelay))
SetGadgetState(#progressbar,100) : Delay(Random(loadingdelay))

Verfasst: 10.01.2005 17:00
von Laurin
Füg ganz am Ende Folgendes ein:

Code: Alles auswählen

Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
Du hast vergessen, einen Eventhandler einzubauen (WaitWindowEvent() oder WindowEvent()). Dieser nimmt Befehle wie Fenster zeichnen entgegen und läßt sie ausführen. Das fehlte komplett bei dir.

Wegen dem SetGadgetState() unten, würde ich die Schleife aber noch etwas umbauen:

Code: Alles auswählen

Fortschritt.l

Repeat
  Event = WindowEvent()
  Delay(Random(loadingdelay))

  Fortschritt+20
  SetGadgetState(#progressbar,Fortschritt)
Until Event = #PB_Event_CloseWindow Or I > 100
End
Greetz Laurin

Edit: Ich sehe gerade, du hast doch schon den Eventhandler mit eingebaut. WindowEvent() ist aber nicht gut, da es nicht darauf wartet, dass dein Fenster fertig gezeichnet ist. Nimm lieber WaitWindowEvent(). Das wartet solange, bis ein Signal an dein Fenster geschickt wird (zB Gadget zeichnen, Fenster aktualisieren etc).

Verfasst: 10.01.2005 18:22
von Agent
Hallo.

Danke für die Antwort. Ich war leider nicht ausführlich genug denke ich. Ich hatte oben schon ein waitwindowevent(). Trotzdem nix.

Meine repeat until-Schleife kommt viel später. Hier der code ist praktisch das "Loading-Fenster". Auch hier muss der Text stehen.

Es muss doch möglich sein, das Fenster fertig aufzubauen, bevor es weiter geht. Ich war der Meinung das macht Waitwindowevent(), aber Pustekuchen. Es wartet eben nicht. Führ das Beispiel aus, stell dir vor, bei jedem SETGADGETSTATE()...Würde das Programm irgendetwas machen...Init's laden, Bitmaps, Dirs was auch immer. Erst dann macht ein LoadingWindow Sinn. Aber bei mir kommt ein schöner ProgressBar, aber keine Logo (oben auskommentiert) und auch keine Versionsinfo...

Warum?
Warum aktualisiert PB mein Loadingfenster nicht bevor es weitergeht...

Verfasst: 10.01.2005 19:34
von glubschi90
Steck doch das

Code: Alles auswählen

SetGadgetState(#progressbar,20) : Delay(Random(loadingdelay)) 
SetGadgetState(#progressbar,40) : Delay(Random(loadingdelay)) 
SetGadgetState(#progressbar,60) : Delay(Random(loadingdelay)) 
SetGadgetState(#progressbar,80) : Delay(Random(loadingdelay)) 
SetGadgetState(#progressbar,100) : Delay(Random(loadingdelay)) 
einfach in einen Thread. :)

PS: Müsstest dann halt entweder eine Extra Hauptschleife für das Fenster machen, oder die vom Hauptprogramm benutzen.

Verfasst: 10.01.2005 22:04
von PMV
Hm, irgend wie versteh ich dein Problem nicht. Oder es gibt bei mir keins, wie auch immer ... ich hab dein Code mal übernommen und dann ein Image geladen. (also nicht mit Catch), alles funktioniert bei mir, das Image wird angezeigt, das Progressbar füllt sich ... alles wunderbar. Und ich kann nirgends wo was vom aufbauen des Fensters sehen :? ...

Hm, du schreibst, das Logo kannst du nicht sehen. In deinem Code sehe ich keine Sicherheitsabfrage, ob das Image überhaupt geladen werden kann ... wie wäre es mal mit so etwas. Wenn du sicher sein kannst, das CatchImage() <> #False ist, öhm, ja ... dann kannst vielleicht mir, und vielleicht auch anderen, das Problem noch mal genau schildern :D

Ich sehe nämlich keins /:->

MFG PMV

Verfasst: 11.01.2005 11:24
von Agent
Also, ich kann das Problem nachvollziehen.
Ich habe mal #PB_Window_invisible rausgenommen (und dazugehöriges hidewindow)....dann gehts bei mir auch.

Der Invisible-Parameter macht Probleme. Offensichtlich funktioniert der Fensteraufbau nicht korrekt, wenn ein Fenster als unsichtbar generiert wird.

Verfasst: 11.01.2005 11:26
von Agent
Beispiel:

Dieser Code hier (leicht modifiziert, nachdem ihr gemeckert habt), funktioniert NICHT!!

Code: Alles auswählen

#winsplat=1000
#splattext=1001
#splatlogo_gadget=1002
#splatlogo=1003
#progressbar=1004
#SW_Name="Irgendeinprogramm"
#SW_Version=" v0.0.0.01"
loadingdelay=500

; ##### Splat-Window
winsplat=OpenWindow(#winsplat,0,0,300,126,#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible,#SW_Name)  ;
If winsplat
  If CreateGadgetList(winsplat)
    ;CatchImage(#splatlogo,?cbm_logo)
    ;SetWinBackgroundImage(winsplat,UseImage(#splatlogo))
    If LoadImage(#splatlogo,"s:\sasori\pb\_bilder\cbm-logo_300x80.bmp")
      ImageGadget(#splatlogo_gadget,0,0,300,86,UseImage(#splatlogo))
      MessageRequester("BILD","geladen",0)
    Else
      MessageRequester("FEHLER","KEIN BILD",0)
    EndIf
    TextGadget(#splattext,10,86,280,20,#SW_Name+#SW_Version)
    ProgressBarGadget(#progressbar,0,106,300,20,0,100,#PB_ProgressBar_Smooth)
    WaitWindowEvent()
    HideWindow(#winsplat,0)
  EndIf
EndIf

Repeat
  If progress<=100
    progress+1
  Else
    progress=1
  EndIf
  
  
  SetGadgetState(#progressbar,progress)
  Delay(100)
  
ForEver

Hingegen dieser Code, einwandfrei arbeitet:

Code: Alles auswählen

#winsplat=1000
#splattext=1001
#splatlogo_gadget=1002
#splatlogo=1003
#progressbar=1004
#SW_Name="Irgendeinprogramm"
#SW_Version=" v0.0.0.01"
loadingdelay=500

; ##### Splat-Window
winsplat=OpenWindow(#winsplat,0,0,300,126,#PB_Window_BorderLess|#PB_Window_ScreenCentered,#SW_Name)  ;
If winsplat
  If CreateGadgetList(winsplat)
    ;CatchImage(#splatlogo,?cbm_logo)
    ;SetWinBackgroundImage(winsplat,UseImage(#splatlogo))
    If LoadImage(#splatlogo,"s:\sasori\pb\_bilder\cbm-logo_300x80.bmp")
      ImageGadget(#splatlogo_gadget,0,0,300,86,UseImage(#splatlogo))
      MessageRequester("BILD","geladen",0)
    Else
      MessageRequester("FEHLER","KEIN BILD",0)
    EndIf
    TextGadget(#splattext,10,86,280,20,#SW_Name+#SW_Version)
    ProgressBarGadget(#progressbar,0,106,300,20,0,100,#PB_ProgressBar_Smooth)
    WaitWindowEvent()
    ;HideWindow(#winsplat,0)
  EndIf
EndIf

Repeat
  If progress<=100
    progress+1
  Else
    progress=1
  EndIf
  
  
  SetGadgetState(#progressbar,progress)
  Delay(100)
  
ForEver

Einzigster Unterschied:
Beim Fenstergenerieren, fehlt das INVISIBLE und -logischerweise- auch das HIDEWINDOW.


Habt ihr damit Erfahrungen?

Verfasst: 11.01.2005 11:40
von nicolaus
versuch doch mal das hidenwindow() raus zu nehmen und an stelle desen die folgende zeile rein.

Code: Alles auswählen

  ShowWindow_(WindowID(#winsplat),#SW_SHOW)
habs jetzt nich getestet sollte aber gehen (benutze ich bei mir auch immer)

MfG Nico

Verfasst: 11.01.2005 13:05
von Mischa

Code: Alles auswählen

#winsplat=1000
#splattext=1001
#splatlogo_gadget=1002
#splatlogo=1003
#progressbar=1004
#SW_Name="Irgendeinprogramm"
#SW_Version=" v0.0.0.01"
loadingdelay=500

; ##### Splat-Window
winsplat=OpenWindow(#winsplat,0,0,300,126,#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible,#SW_Name)  ;
If winsplat
  If CreateGadgetList(winsplat)
    ;CatchImage(#splatlogo,?cbm_logo)
    ;SetWinBackgroundImage(winsplat,UseImage(#splatlogo))
    If LoadImage(#splatlogo,"s:\sasori\pb\_bilder\cbm-logo_300x80.bmp")
      ImageGadget(#splatlogo_gadget,0,0,300,86,UseImage(#splatlogo))
    Else
      MessageRequester("FEHLER","KEIN BILD",0)
    EndIf
    TextGadget(#splattext,10,86,280,20,#SW_Name+#SW_Version)
    ProgressBarGadget(#progressbar,0,106,300,20,0,100,#PB_ProgressBar_Smooth)
    HideWindow(#winsplat,0)
    
    While WindowEvent():Wend ;<--fehlte, waitwindowevent() ersetzt das nicht
  EndIf
EndIf

Repeat
  event=WindowEvent() ;<--fehlte
  If event
    ;events auswerten
    
  Else
    Delay(5)
  EndIf
  
  
  time=ElapsedMilliseconds()
  If time-timer>99
    timer=time
    If progress<100 ;<--war mit <= falsch 
      progress+1
    Else
      progress=1
    EndIf
    SetGadgetState(#progressbar,progress)
  EndIf

ForEver 

Verfasst: 11.01.2005 16:48
von Agent
Hi Mischa.

Danke das Du dich der Sache annimmst. Aber Deine Korrekturen haben (in der Repeat-Schleife) nix mit meinem Problem zu tun. Die Repeat-Schleife war nur als Zeitvertreib. das mit while-wend und waitwindowevent hab ich anders in Errinnerung...Irgendwo im Forum (evtl. im alten noch), stand genau das. Wait... entspricht while windowevent():wend.

Aber wie gesagt: Lässt man(n) das invisible weg, geht es 1a. Mit invisible leider nicht....