Seite 1 von 2

WebGadget: 'Grosse' Datenmengen an Callback übermitteln

Verfasst: 25.08.2008 22:03
von Kiffi
Hallo,

mittels Callback kann der URL eines Webgadgets ausgelesen werden um
die GET-Parameter auszulesen. Nachfolgend ein kleines Beispiel:

Code: Alles auswählen

; based on the code from Rescator:
EnableExplicit

Procedure.l NavigationCallback(gadget,url$)
  If Left(url$,8)="cmd:data"
    MessageRequester("GET",Right(url$,Len(url$)-9))
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure

Define HTML.s

HTML + "<html><body>"
HTML + "<form action='cmd:data' method='get'>"
HTML + "<input type='text'   name='MeineTextbox' value='123' />"
HTML + "<input type='submit' value='submit'></form>"
HTML + "</body></html>"

OpenWindow(0,#PB_Ignore,#PB_Ignore,800,400,"")
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,WindowWidth(0),WindowHeight(0),"")
SetGadgetItemText(0,#PB_Web_HtmlCode,HTML)
SetGadgetAttribute(0,#PB_Web_NavigationCallback,@NavigationCallback())
SetActiveGadget(0)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
funktioniert auch sehr gut, wenn es sich bei den übertragenen Daten um
eine relativ kleine Menge handelt. Sobald ich aber Datenmengen jenseits
der 1000 Zeichen übertragen möchte, schlägt obiges Verfahren fehl. Der
Grund liegt wohl in der Längenbegrenzung des URL.

Kennt jemand von Euch ein anderes Verfahren, um die in einem
Webformular eingegebenen Werte auszulesen?

Danke im voraus & Grüße ... Kiffi

Verfasst: 26.08.2008 01:50
von .:M:.
Ich weiss nicht ob es Dich weiterbringt, aber ich habe eben mal dieses versucht - nicht an Callback, aber das spielt hier keine Rolle.
Du wirst es verstehen.
Sorry für die langen Zeilen, ich habe kaum Zeit.

Internet Explorer -> Internetoptionen -> Erweitert -> Sicherheit ->
Ausführung aktiver Inhalte * ... zulassen.

Ich habe es auf etwa 30.000 Zeichen gebracht, danach geht das System in die Knie - ich weiss aber nicht ob es an der Javascript-Schleife liegt, einfach mal Text so in die Textarea parsen...

Code: Alles auswählen

html1$="<html><head></head><body><script type='text/javascript'>function M(){var blob='Hier könnte auch Ihr Text stehen ... oder? etwa nicht? ...nein, ja, nein, doch... bla blub ;-)\n';"
html2$="for (i=1;i<12;i++){blob=blob+blob}document.getElementById('input').value=blob;document.getElementById('input').focus();"
html3$="document.getElementById('input').select();}</script><textarea id='input' cols='100' rows='20'></textarea><input type='button' value='.:M:.ove' onclick='M()'><br><br></body></html>"
html$=html1$+html2$+html3$

OpenWindow(0,#PB_Ignore,#PB_Ignore,800,400,"")
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,WindowWidth(0),WindowHeight(0),"")
SetGadgetItemText(0,#PB_Web_HtmlCode,html$)
SetActiveGadget(0)
Repeat
 If GetAsyncKeyState_(#VK_M)<>0
 text$=GetGadgetItemText(0,#PB_Web_SelectedText) :Debug text$   
 EndIf
Delay(10) 
Until WaitWindowEvent() = #PB_Event_CloseWindow

PS:
for (i=1;i<12;i++) - Eventuell musst Du den Wert verkleinern damit es bei Dir funktioniert.

Verfasst: 27.08.2008 00:38
von Kiffi
Hallo .:M:.,

danke für Deine schnelle Antwort!

GetGadgetItemText(0,#PB_Web_SelectedText) ist schon mal ein guter
Ansatz gewesen. Leider ist das in meinem Fall unpraktikabel, weil ich
mehrere Textfelder habe, es aber nur ein SelectedText gibt.

Allerdings brachte mich Deine Gedankenanregung darauf, dass ich die
Inhalte auch mit JS auslesen kann. Und freak sei Dank, es gibt sogar eine
schöne Funktion dafür:

http://www.purebasic.fr/english/viewtop ... 594#104594

:-)

Grüße ... Kiffi

Verfasst: 27.08.2008 00:57
von edel
Wie laeuft das denn wenn Javascript deaktiviert ist?

Verfasst: 27.08.2008 00:58
von Kiffi
edel hat geschrieben:Wie laeuft das denn wenn Javascript deaktiviert ist?
gar nicht :-)

Grüße ... Kiffi

Verfasst: 27.08.2008 02:09
von freak
Du kannst auch mittels COM die Daten direkt aus den Feldern lesen, das ist dann unabhängig von JavaScript.

Keine Ahnung ob ich da mal einen Code dazu gepostet habe. IHTMLDocument3 hat Methoden um einzelne Elemente zu erreichen, welche man dann über IHTMLElement und ähnliche interfaces manipulieren kann.

Such einfach mal in englischen Forum, da habe evtl mal was gepostet.
Ich kann dir auch einen Code dazu basteln, bin aber bis Ende der Woche nicht in Reichweite meines Entwicklungs-PCs.

Verfasst: 27.08.2008 14:08
von Kiffi
Hallo freak,
freak hat geschrieben:Du kannst auch mittels COM die Daten direkt aus den Feldern lesen, das ist dann unabhängig von JavaScript.
cool, stimmt ja. Das würde in der Tat schon etwas schicker sein. :-)


ich habe mich also mal hingesetzt und ein wenig ausprobiert.
Allerdings bleibe ich bei einer Sache hängen:

Ausgehend von diesem HTML

Code: Alles auswählen

<html>
	<body>
		<form id="formular">
			<input type="text" value="123" id="MeinTextFeld" />
			<div id="hallo">holla</div>
		</form>
	</body>
</html>
habe ich Deinen Code als Grundlage genommen

Code: Alles auswählen

#Window=0
#WebGadget=0

If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 300, 300, "")
  
  If CreateGadgetList(WindowID(#Window)) 
    
    WebGadget(#WebGadget, 0, 0, 300, 300, "C:\test.html")
    
    ; get webgadgets IWebBrowser2 interface:
    Browser.IWebBrowser2 = GetWindowLong_(GadgetID(#WebGadget), #GWL_USERDATA)   
    
    ; wait for page to be loaded..
    Repeat
      While WindowEvent(): Delay(1): Wend
    Until GetGadgetAttribute(#WebGadget, #PB_Web_Busy) = 0
    
    ; get the document interface
    If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
      
      ; query for IHTMLDocument3:
      If DocumentDispatch\QueryInterface(?IID_IHTMLDocument3, @Document.IHTMLDocument3) = #S_OK
        
        ; here you have a IHTMLDocument3 pointer, and can work with it...
        
        ; das funktioniert nicht. bstr ist 0
        
        If Document\getElementById("MeinTextFeld", @HTMLInputElement.IHTMLInputElement) = #S_OK
          
          If HTMLInputElement
            
            If HTMLInputElement\get_Value(@bstr) = #S_OK 
              If bstr
                Value.s = PeekS(bstr, -1, #PB_Unicode)
                Debug ">>" + Value + "<<"
                SysFreeString_(bstr) 
              Else
                Debug "bstr = 0"
              EndIf
            Else
              Debug "Element\get_Value(@bstr) != #S_OK "
            EndIf 
            
            HTMLInputElement\Release()
            
          Else 
            
            Debug "!Element"
            
          EndIf
          
        Else
          Debug "?"
        EndIf
        
        ; das funktioniert (aber leider nur mit einem DIV):
        
        If Document\getElementById("hallo", @HTMLElement.IHTMLElement) = #S_OK
          
          If HTMLElement
            
            If HTMLElement\get_innerhtml(@bstr) = #S_OK 
              If bstr
                Value.s = PeekS(bstr, -1, #PB_Unicode)
                Debug ">>" + Value + "<<"
                SysFreeString_(bstr) 
              Else
                Debug "bstr = 0"
              EndIf
            Else
              Debug "Element\get_Value(@bstr) != #S_OK "
            EndIf 
            
            HTMLElement\Release()
            
          Else 
            
            Debug "!HTMLElement"
            
          EndIf
          
        Else
          Debug "?"
        EndIf
        
        Document\Release()
        
      EndIf
      DocumentDispatch\Release()   
    EndIf
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf
EndIf

End


DataSection
  
  IID_IHTMLDocument3:  ; {3050f485-98b5-11cf-bb82-00aa00bdce0b}
  Data.l $3050F485
  Data.w $98B5, $11CF
  Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
  
EndDataSection
Das Problem: Das DIV bekomme ich mit IHTMLElement und
get_innerhtml() problemlos ausgelesen. Das Textfeld (IHTMLInputElement
und get_Value())allerdings kann ich nicht auslesen.

Vielleicht wirft Du mal Dein geschultes Auge auf den Code und kannst
erkennen, woran es liegt?

Danke im voraus & Grüße ... Kiffi

Verfasst: 27.08.2008 15:56
von HeX0R
Ich habe mich auch mal a weng damit beschäftigt, weil mich das Thema interessiert.
Wenn ich das richtig verstanden habe, müsste es so in etwa richtig sein, zumindest bekomme ich das richtige Ergebnis, bin aber ganz bestimmt kein API-Hengst...

[Edit]
Gelöscht, wegen fehlendem Hirn...

Verfasst: 27.08.2008 16:41
von Kiffi
@HeX0R: Danke für Deine Mitarbeit!

allerdings, der Inhalt der Textbox wird bei mir immer noch nicht angezeigt.
Kiffi-PB-Debugger hat geschrieben:>><<
>>holla<<
bei Dir wird folgendes angezeigt?
HeX0R-PB-Debugger hat geschrieben:>>123<<
>>holla<<
Grüße ... Kiffi

Verfasst: 27.08.2008 18:09
von HeX0R
Nö, ich sollte mir ne Brille besorgen...