WebGadget: 'Grosse' Datenmengen an Callback übermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

WebGadget: 'Grosse' Datenmengen an Callback übermitteln

Beitrag 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
a²+b²=mc²
Benutzeravatar
.:M:.
Beiträge: 44
Registriert: 29.07.2008 04:12

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Wie laeuft das denn wenn Javascript deaktiviert ist?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

edel hat geschrieben:Wie laeuft das denn wenn Javascript deaktiviert ist?
gar nicht :-)

Grüße ... Kiffi
a²+b²=mc²
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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...
Zuletzt geändert von HeX0R am 27.08.2008 18:12, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Nö, ich sollte mir ne Brille besorgen...
Antworten