Seite 1 von 2

Webgadget mit Progressbar Fortschritt

Verfasst: 17.12.2015 23:58
von udg
Ich möchte gern noch meinem Projekt einen Fortschrittbalken (Progressbar) hinzufügen, der
den Seitenaufbau grafisch darstellt. Leider bekomme ich immer wieder eine Fehlermeldung beim kompilieren dieser Command:
Invalid memory access (read error at address 0)

Code: Alles auswählen

WebObject\get_busy(@isBusy) 
Hier eine ganz abgespeckte Version meines Projektes.


Code: Alles auswählen

; webgadget mit downloadstream fortschrittanzeige in Progressbar
EnableExplicit

#READYSTATE_LOADING = 1
#READYSTATE_COMPLETE = 4  
Global WebObject.IWebBrowser2
Define count, event, isBusy, isReady

Procedure Main()
   
  OpenWindow(0, 10, 10, 700, 500, "WebGadget ReadyState", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    WebGadget(0, 10, 10, 680, 460, "http://google.de")
    WebObject.IWebBrowser2 = GetWindowLongPtr_(GadgetID(0),#GWLP_USERDATA)
    
    ProgressBarGadget(1, 10, 6, 500, 5, 0, 100)

EndProcedure

OpenWindow(1, 298, 150, 710, 535, "",#PB_Window_BorderLess);| #PB_Window_ScreenCentered
; Button
  ButtonGadget(1, 300, 50, 100, 50, "open Browser")

count=0
Repeat
  Event = WaitWindowEvent()
  
  ; Button
  If Event = #PB_Event_Gadget
    Select EventGadget()
      ; BTN open Browser
          Case 1
          Main()
        EndSelect    
    EndIf          
    
  ; lese downloadstream und sende zu Progressbar
   If isBusy
    WebObject\get_ReadyState(@isReady)
      Select isReady
        Case 1
          If count<90
            count=count+1
            SetGadgetState(1,count)
          EndIf
        Case 4
          SetGadgetState(1,100)
      EndSelect
    EndIf
    
  ; beim kompilieren wird hier Fehler angezeigt: Invalid memory access (read error at address 0)
    WebObject\get_busy(@isBusy) 
    

Until Event = #PB_Event_CloseWindow   
End
PS.
(nutze ich nur ein Fenster - keine 2 wie ich es jedoch brauche, funktioniert die Streaminganzeige im Progressbar)

Lauffähiger Code :

Code: Alles auswählen

; webgadget mit downloadstream fortschrittanzeige in Progressbar
EnableExplicit

#READYSTATE_LOADING = 1
#READYSTATE_COMPLETE = 4  
Global WebObject.IWebBrowser2
Define count, event, isBusy, isReady

  OpenWindow(0, 10, 10, 700, 500, "WebGadget ReadyState", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    WebGadget(0, 10, 10, 680, 460, "http://google.de")
    WebObject.IWebBrowser2 = GetWindowLongPtr_(GadgetID(0),#GWLP_USERDATA)
    
    ProgressBarGadget(1, 10, 6, 500, 5, 0, 100)

count=0
Repeat
  Event = WaitWindowEvent()

  ; lese downloadstream und sende zu Progressbar
   If isBusy
    WebObject\get_ReadyState(@isReady)
      Select isReady
        Case 1
          If count<90
            count=count+1
            SetGadgetState(1,count)
          EndIf
        Case 4
          SetGadgetState(1,100)
      EndSelect
    EndIf
    
    WebObject\get_busy(@isBusy) 

Until Event = #PB_Event_CloseWindow   
End

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 03:35
von Kiffi
schau Dir mal die Hilfe zum WebGadget() an. Insbesondere die Attribute #PB_Web_Busy, #PB_Web_Progress und #PB_Web_ProgressMax. Des weiteren noch die Eventtypen #PB_EventType_DownloadStart, #PB_EventType_DownloadProgress und #PB_EventType_DownloadEnd.

Damit bist Du in der Lage, den Ladeprozess nativ (also ohne Verwendung der Win-API) darzustellen.

Grüße ... Peter

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 17:29
von udg
danke, meinst Du das Ganze in der Form? Es füllt den Progressbar nicht :( da fehlt mir noch was an Wissen und Verständnis.

Code: Alles auswählen

EnableExplicit

Enumeration
   #Window_0
   #Webgadget
   #ProgressBar
EndEnumeration

Define Event

OpenWindow(#Window_0, 0, 0, 1024, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(#Webgadget, 10, 10, 1009, 560, "https://news.google.de/")
  ProgressBarGadget(#ProgressBar,10, 580, 790, 10,0,1000000)

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Webgadget
          Select EventType()
            Case #PB_EventType_DownloadStart
              ;Debug "DownloadStart"
              Case #PB_EventType_DownloadProgress
                GetGadgetAttribute(#Webgadget, #PB_Web_Progress)
                GetGadgetAttribute(#Webgadget, #PB_Web_ProgressMax)
              Case #PB_EventType_DownloadEnd
              ;Debug "DownloadEnd"
          EndSelect
      EndSelect
    EndSelect   
   
Until Event = #PB_Event_CloseWindow

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 18:36
von Kiffi
udg hat geschrieben:Es füllt den Progressbar nicht :(
das liegt daran, dass Du im Code nirgendwo eine Anweisung hast, um das ProgressBarGadget() zu ändern.

Ich habe jetzt den Code wie folgt abgeändert:

* Prozedur SuppressJavaScriptErrorMessages() hinzugefügt. Die bewirkt, dass das WebGadget nicht so empfindlich auf JavaScript-Fehler reagiert (entsprechende Meldungen werden hiermit unterdrückt).

* URL auf heise.de geändert. Die Seite sollte einigermaßen gehaltvoll sein, damit man auch sieht, dass sich da was im ProgressBarGadget tut.

* Tritt ein Ereignis vom Typ #PB_EventType_DownloadProgress auf, muss sowohl das Max-Attribut als auch der Wert der ProgressBar geändert werden.

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window_0
  #Webgadget
  #ProgressBar
EndEnumeration

Define Event

Procedure SuppressJavaScriptErrorMessages(WebGadget)
  
  Protected MyWebGadget.IWebBrowser2
  
  MyWebGadget = GetWindowLongPtr_(GadgetID(WebGadget), #GWL_USERDATA)
  MyWebGadget\put_Silent(#True) ; Suppress JavaScript error messages.
  
EndProcedure


OpenWindow(#Window_0, 0, 0, 1024, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
WebGadget(#Webgadget, 10, 10, WindowWidth(#Window_0) - 20, WindowHeight(#Window_0) - 50, "http://www.heise.de/")
ProgressBarGadget(#ProgressBar, 10, 570, WindowWidth(#Window_0) - 20, 20, 0, 0)

SuppressJavaScriptErrorMessages(#Webgadget)

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Webgadget
          Select EventType()
            Case #PB_EventType_DownloadStart
            Case #PB_EventType_DownloadProgress
              SetGadgetAttribute(#ProgressBar, #PB_ProgressBar_Maximum, GetGadgetAttribute(#Webgadget, #PB_Web_ProgressMax))
              SetGadgetState(#ProgressBar, GetGadgetAttribute(#Webgadget, #PB_Web_Progress))
            Case #PB_EventType_DownloadEnd
          EndSelect
      EndSelect
  EndSelect   
  
Until Event = #PB_Event_CloseWindow
Ich hoffe, dass Du damit erst einmal weiterkommst.

Grüße ... Peter

Edit: GetWindowLong_() zu GetWindowLongPtr_() geändert.

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 19:08
von ts-soft
Kleiner Seitenhieb <)
PureBasic Team Blog hat geschrieben:Do NOT use Get/SetWindowLong_() for subclassing anymore. These remain 32bit even on x64. Use Get/SetWindowLongPtr_() instead, which works correctly everywhere. There is really no need to use SetWindowLong_() over SetWindowLongPtr_() actually, so best do a search and replace and replace all of them right away.

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 19:14
von xXRobo_CubeXx
Warum erstellt MS eine neue Funktion für 64 Bit? :?:
Warum überschreibt MS die Funktion nicht so das es abwärtskompatibel ist? :?
MS Logik :freak:

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 19:31
von Kiffi
ts-soft hat geschrieben:Kleiner Seitenhieb <) [...]
Danke für den Hinweis! Habe ich oben entsprechend korrigiert.

Grüße ... Peter

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 19:33
von JMaker
Versteh ich auch nicht. Wenn Get/SetWindowLongPtr_() eh 32 und 64 Bitig ist warum nicht einfach als Get/SetWindowLong_() ?
Kann mir einer das erklären warum das so ist? Muss ja nen Grund geben, dass es technisch nicht geht. Mit Get/SetWindowLongPtr_() klappt es auch, warum nicht mit Get/SetWindowLong_() ?

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 20:02
von GPI
JMaker hat geschrieben:Versteh ich auch nicht. Wenn Get/SetWindowLongPtr_() eh 32 und 64 Bitig ist warum nicht einfach als Get/SetWindowLong_() ?
Kann mir einer das erklären warum das so ist? Muss ja nen Grund geben, dass es technisch nicht geht. Mit Get/SetWindowLongPtr_() klappt es auch, warum nicht mit Get/SetWindowLong_() ?
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Note To write code that is compatible with both 32-bit and 64-bit versions of Windows, use SetWindowLongPtr. When compiling for 32-bit Windows, SetWindowLongPtr is defined as a call to the SetWindowLong function.
Es sind zwei getrennte Funktionen, nur der Compiler übersetzt "SetWindowLongPtr" bei 32Bit automatisch in SetWindowLong.

Re: Webgadget mit Progressbar Fortschritt

Verfasst: 18.12.2015 20:08
von ts-soft
Weil ein Long nunmal 32-Bit ist und keine 64-Bit Adresse halten kann. So zumindest die Theorie :mrgreen:
Es existiert ein Macro, das die API nach LongPtr umleitet, aber wer weiß wie lange noch. Es ist zumindest auf längere
Sicht, die Version mit LongPtr zu nutzen, auch wenn es im Moment keinen Unterschied macht aber das Austauschen im
Code stellt ja keine grosse Arbeit dar.

Man sollte sich immer an eine korrekte Syntax gewöhnen, auch wenn diese vielleicht noch gar nicht nötig ist. Aber wenn ...,
dann ist der Source schon mal gewappnet :wink: