Seite 1 von 1

Webgadget - Prüfen wann seite geladen ist.

Verfasst: 12.09.2006 22:58
von K.Putt
Hallo,
ich versuche zu prüfen, wann eine Seite im Webgadget geladen ist.

Problematik :

1. Schreibt man eine Schleife, die z.B. die Adresse prüft um eine veränderung festzustellen, bleibt die Schleife hängen.

2. Benutzt man einen Thread mit niedriger Priorität funktioniert das überprüfen, leider kann man per SetgadgetText() die Adresse nicht mehr
ändern, da die seite nicht gefunden wird.
Versucht man die Überprüfung im anderen Thread durchzuführen, bleibt das Programm stecken.

3. Freaks Webgadget_Extras aus dem englischen Forum.
http://www.purebasic.fr/english/viewtop ... highlight=
Auf Seite 2 oder 3 stellt der User "yabune" fest, dass die Funktion
"Webgadget_isloaded" ebenfalls hängen bleibt.
Eine Antwort ist bisher ausgeblieben.


Ich würde selbst ins englische Forum posten, leider kommen meine Zugangslinks nicht an (habs nun 3x probiert...)

Hat jemand eine Lösung gefunden, zu prüfen, ob eine Webseite geladen ist und danach die adressen noch zu ändern (siehe 2.) ?


Hier der Code mit Thread :
(Eventuell hat jemand einen Kniff, den Thread zu beenden, so dass sich das Webgadget wieder benutzen lässt nach der Prüfung)
-Ohne Thread würde die Schleife sofort stehenbleiben !-

Code: Alles auswählen

Declare wait()
Declare window()
Declare thread()


window()


Procedure window()
 OpenWindow(0, 5, 5, 800, 500, "TEST")
   CreateGadgetList(WindowID(0))
   WebGadget(1,20,20,400,300,"www.google.de") 
   thread()
 Repeat
  Event = WaitWindowEvent()
 Until Event = #PB_Event_CloseWindow
EndProcedure

Procedure thread()
  thid = CreateThread(@Wait(), 48)
  ThreadPriority(thid, 10)
    ;Repeat    ; <- würde hier hängen bleiben
    ;Until test = 1
    ;Debug "Main Thread"
EndProcedure

Procedure Wait()
  Repeat
    adresse.s=GetGadgetText(1)
    position=FindString(adresse.s,"google",1)
    If position > 2
     test= 1
    EndIf
  Until test=1
  SetGadgetText (1,"www.purebasic.de" ); lädt nicht ^^!
EndProcedure



_____________________________________________
EDIT :

Ich habe nun Code gefunden, sicherlich interessant für jeden, der einmal auf dasselbe Problem stösst :
Aus dem Englischen Forum
http://www.purebasic.fr/english/viewtop ... adget+wait

Den wichtigen Code habe ich mal herausgefiltert, ist ziemlich wenig und ich verstehe nicht viel davon, ausser das es eine WindowsDLL benutzt und eine Funktion dort aufruft, dürfte also nur unter Windows lauffähig sein :

Code: Alles auswählen

If OpenWindow(0, 0, 0, 1000, 800, "WebGadget Edit", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0)) 
  WebGadget(0, 5, 5, 990, 790,   "www.google.com")

   ; get webgadgets IWebBrowser2 interface: (ruft die Funktion auf und bestimmt die Gadget ID))
  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)   
    ; wait For page To be loaded..
    Repeat
      While WindowEvent(): Wend
      Delay(1)
      Browser\get_Busy(@IsBusy.l)
    Until IsBusy = 0
    ;Debug "loaded"
    ; get the document interface
    Repeat
      EventID = WaitWindowEvent()
    Until EventID = #PB_Event_CloseWindow
  EndIf
EndIf
End
Funktioniert wunderbar^^.
Was aber für mich noch viel interessanter war, warum funktioniert es ohne hängenzubleiben und das ist dabei herausgekommmen :




Code: Alles auswählen

Declare window()
Declare wait()

window()

Procedure window()
OpenWindow(0, 5, 5, 800, 500, "TEST")
   CreateGadgetList(WindowID(0))
      WebGadget(1,20,20,400,300,"www.google.de") 
  wait()
Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow

EndProcedure

Procedure wait()
  Repeat
  While WindowEvent(): Wend            
;<- keine Blockade der Schleife mehr, da erst beim Ereignis im Fenster die Schleife durchgegangen wird.
      Delay(1)                                    
;Delay scheint nicht unbedingt notwendig, vielleicht bei langsamerer verbindung ?
     adresse.s=GetGadgetText(1)
     position=FindString(adresse.s,"google",1)
     If position > 2
       test= 1
     EndIf
  Until test=1
;Debug test
    SetGadgetText (1,"http://www.purebasic.de" )
EndProcedure

... Na ja, problem gelöst. :freak:

Re: Webgadget - Prüfen wann seite geladen ist.

Verfasst: 14.02.2007 11:01
von hiltwin

Code: Alles auswählen

If OpenWindow(0, 0, 0, 1000, 800, "WebGadget Edit", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0)) 
  WebGadget(0, 5, 5, 990, 790,   "www.google.com")

   ; get webgadgets IWebBrowser2 interface: (ruft die Funktion auf und bestimmt die Gadget ID))
  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)   
    ; wait For page To be loaded..
    Repeat
      While WindowEvent(): Wend
      Delay(1)
      Browser\get_Busy(@IsBusy.l)
    Until IsBusy = 0
    Debug "loaded"
    ; get the document interface
    Repeat
      EventID = WaitWindowEvent()
    Until EventID = #PB_Event_CloseWindow
  EndIf
EndIf
End
Diese Lösung gefällt mir ganz gut. Ich möchte damit auch bezwecken, mittels .php Highscores zu übertragen.

Nun wird allerdings auch ein "loaded" zurückgegeben, wenn ich keine Internetverbindung habe und der IE eine Fehlermeldungsseite aufruft.

Wie kann ich nun mit möglichst wenig zusätzlichem Code auslesen, ob meine .php-Seite nach Dekodierung der übermittelten http://www.rekordseite.de/rekordseite.p ... pruefsumme
auch die Daten korrekt übernommen hat und in die Datenbank geschrieben oder eine Datei gespeichert hat?

Mögliche Lösungsansätze wären:

1.) Die .php-Seite gibt bei richtiger Eingabe+Pruefsumme irgendwo im Quelltext oder auf der Seite ein "ok" oder "no" zurück.
2.) Die .php-Seite leitet bei richtiger Eingabe auf
www.rekordseite.de/rekordseite.php?eingabe=ok
und bei falscher auf
www.rekordseite.de/rekordseite.php?eingabe=no
weiter.

Leider habe ich nicht den Überblick, was sich einfacher auslesen lässt.

Hat jemand Tipps?

Frdl. Gruss
Hiltwin
-------------------------------------------------
Habe mich für folgende Lösung entschieden:

Die .php Seite gibt bei erfolgreicher Übermittlung ein "ok" wieder, ansonsten ist es egal, was als Fehlermeldung kommt ...

Folgendes wartet, bis "fertig geladen" gemeldet ist:

Code: Alles auswählen

WebGadget(#WG1, 1, 1, 1, 1,   link-php$) 

   ; get webgadgets IWebBrowser2 interface: (ruft die Funktion auf und bestimmt die Gadget ID)) 
  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(#WG1), #GWL_USERDATA)    
    ; wait For page To be loaded.. 
    Repeat 
      While WindowEvent(): Wend 
      Delay(1) 
      Browser\get_Busy(@IsBusy.l) 
    Until IsBusy = 0 
Debug ("loaded")
danach

http://www.purebasic.fr/german/viewtopi ... e&start=10

mit dem aktualisierten 4.0 Quelltext

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=7337 
; Author: Freak 
; Date: 26. August 2003 

; modified for PB3.80 by Freak on 07th September 2003 

Enumeration 1 
  #OLECMDID_OPEN          
  #OLECMDID_NEW        
  #OLECMDID_SAVE          
  #OLECMDID_SAVEAS            
  #OLECMDID_SAVECOPYAS    
  #OLECMDID_PRINT        
  #OLECMDID_PRINTPREVIEW        
  #OLECMDID_PAGESETUP        
  #OLECMDID_SPELL            
  #OLECMDID_PROPERTIES  
  #OLECMDID_CUT          
  #OLECMDID_COPY        
  #OLECMDID_PASTE            
  #OLECMDID_PASTESPECIAL    
  #OLECMDID_UNDO            
  #OLECMDID_REDO          
  #OLECMDID_SELECTALL        
  #OLECMDID_CLEARSELECTION 
  #OLECMDID_ZOOM            
  #OLECMDID_GETZOOMRANGE      
  #OLECMDID_UPDATECOMMANDS  
  #OLECMDID_REFRESH            
  #OLECMDID_STOP              
  #OLECMDID_HIDETOOLBARS      
  #OLECMDID_SETPROGRESSMAX    
  #OLECMDID_SETPROGRESSPOS  
  #OLECMDID_SETPROGRESSTEXT    
  #OLECMDID_SETTITLE          
  #OLECMDID_SETDOWNLOADSTATE  
  #OLECMDID_STOPDOWNLOAD      
EndEnumeration 

Enumeration 0 
  #OLECMDEXECOPT_DODEFAULT      
  #OLECMDEXECOPT_PROMPTUSER        
  #OLECMDEXECOPT_DONTPROMPTUSER    
  #OLECMDEXECOPT_SHOWHELP        
EndEnumeration 

; ----------------------------------------------------- 

; Now the code 

#WebGadget = 1 
#Button = 2 

OpenWindow(0, 0, 0, 800, 600,"WebBrowser",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 
CreateGadgetList(WindowID(0)) 

WebGadget(#WebGadget, 10, 40, 780, 550, "www.purebasic.fr") 
ButtonGadget(#Button, 10, 10, 60, 20, "Copy") 

; Fred the genius stored the Interface pointer to IWebBrowser2 in the DATA 
; member of the windowstructure of the WebGadget containerwindow, so we can get 
; that easily: 
WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(#WebGadget), #GWL_USERDATA) 

Repeat 
  Event = WaitWindowEvent() 
  If Event = #PB_Event_Gadget And EventGadget() = #Button 
    
    ; Now here's the actual copy thing, not that complicated... 
    WebObject\ExecWB(#OLECMDID_SELECTALL, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0) 
    WebObject\ExecWB(#OLECMDID_COPY, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0) 
    
    ; little test: 
    MessageRequester("", GetClipboardText(), 0) 
    text$=GetClipboardText()
  EndIf 
Until Event = #PB_Event_CloseWindow 

End 
; ExecutableFormat=Windows 
; FirstLine=1 
; EnableXP 
; EOF
und wenn die .php Seite dann als erstes "ok" ausgibt und im weiteren Code

Code: Alles auswählen

if text$="ok"
debug ("Daten erfolgreich übermittelt")
else
debug ("Daten nicht erfolgreich übermittelt")
endif
abgefragt wird, hat man die Rückmeldung, dass die .php aufgerufen und die übermittelten Daten erfolgreich eingetragen wurden ...