Fenster-Probleme beim Aufbau

Für allgemeine Fragen zur Programmierung mit PureBasic.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Fenster-Probleme beim Aufbau

Beitrag 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))
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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).
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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...
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
glubschi90
Beiträge: 274
Registriert: 04.09.2004 01:43
Wohnort: Würzburg

Beitrag 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.
PureBasic 4.30
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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?
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag 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 
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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....
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten