WebGadget Formular CheckBox Array

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

WebGadget Formular CheckBox Array

Beitrag von Bisonte »

Hallo.

Folgendes Problem :
Im IE ist ein Formular gegeben mit massenhaft Checkboxen.
Diese sind aber folgendermassen im QuellCode deklariert :

Code: Alles auswählen

<input type="checkbox" name="groupIDs[]" value="13" />
<input type="checkbox" name="groupIDs[]" value="29" />
usw.

Wie kann ich jetzt eine bestimmte Checkbox mit einem Haken versehen ?

Bei einer eindeutigen ID nutze ich bisher :

Code: Alles auswählen

  
; Ursprungs Code von "alter Mann", modifiziert von Bisonte
  Enumeration
    #WebInput_Button
    #WebInput_Select
    #WebInput_Input
    #WebInput_CheckBox
  EndEnumeration
Procedure.i WebGadgetInput(Gadget, Mode, ID.s, Text$ = "", Value = 0)
    
    Protected WebBrowser    .IWebBrowser2
    Protected Dispatch      .iDispatch
    Protected Document      .IHTMLDocument3
    Protected Element       .IHTMLElement
    Protected InputElement  .IHTMLInputElement
    Protected SelectElement .IHTMLSelectElement
    
    If Not IsGadget(Gadget)
      If Not GadgetType(Gadget) = #PB_GadgetType_Web
        ProcedureReturn #False
      EndIf
    EndIf
    
    WebBrowser = GetWindowLongPtr_(GadgetID(Gadget), #GWL_USERDATA)
    
    If Not ( WebBrowser\get_Document( @ Dispatch ) = #S_OK )
      Dispatch\Release()
      ProcedureReturn 
    EndIf
    If Not ( Dispatch\QueryInterface( ? IID_IHTMLDocument3 , @ Document ) = #S_OK )
      Document\Release()   
      Dispatch\Release()   
      ProcedureReturn 
    EndIf
    If Not ( Document\getElementById( ID , @ Element ) = #S_OK And Element )
      Debug "getElement Select"
      Document\Release()   
      Dispatch\Release()   
      ProcedureReturn 
    EndIf
    
    Select Mode
      Case #WebInput_Select
        
        If Not ( Element\QueryInterface( ? IID_IHTMLSelectElement , @ SelectElement ) = #S_OK)
          Element\Release()   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        If Not ( SelectElement\put_selectedIndex(Value) = #S_OK)
          SelectElement\Release()
          Element\Release()   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        SelectElement\Release()
        
      Case #WebInput_Button
        Element\click()
        
      Case #WebInput_Input
        If Not ( Element\QueryInterface( ? IID_IHTMLInputElement , @ InputElement ) = #S_OK)
          Element\Release()   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        If Not ( InputElement\put_Value( text$ ) = #S_OK )
          Element\Release()   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        InputElement\Release()   
        
      Case #WebInput_CheckBox
        If Not ( Element\QueryInterface( ? IID_IHTMLInputElement , @ InputElement ) = #S_OK)
          Element\Release()   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        If Not ( InputElement\put_checked( Bool(Value) ) = #S_OK )
          Element\Release()                                   
          Document\Release()   
          Dispatch\Release()   
          ProcedureReturn #False
        EndIf
        InputElement\Release()
        
      Default
        Element\Release()                                   
        Document\Release()   
        Dispatch\Release()  
        ProcedureReturn #False
        
    EndSelect
    
    Element\Release()                                   
    Document\Release()   
    Dispatch\Release()  
    ProcedureReturn #True
    
  EndProcedure
  DataSection
    
    IID_IHTMLRect: ; {3050F4A3-98B5-11CF-BB82-00AA00BDCE0B IHTMLRect}
    Data.l $3050F4A3
    Data.w $98B5, $11CF
    Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
    IID_IHTMLSelectElement: ; { 3050F244-98B5-11CF-BB82-00AA00BDCE0B }
    Data.l $3050F244
    Data.w $98B5 , $11CF
    Data.b $BB , $82 , $00 , $AA , $00 , $BD , $CE , $0B
    IID_IHTMLDocument3:      ; { 3050F485-98B5-11CF-BB82-00AA00BDCE0B }
    Data.l $3050F485
    Data.w $98B5 , $11CF
    Data.b $BB , $82 , $00 , $AA , $00 , $BD , $CE , $0B
    IID_IHTMLInputElement:   ; { 3050f5d2-98b5-11cf-bb82-00aa00bdce0b }
    Data.l $3050F5D2
    Data.w $98B5 , $11CF
    Data.b $BB , $82 , $00 , $AA , $00 , $BD , $CE , $0B
  EndDataSection

WebGadgetInput(#Webgadget, #WebInput_CheckBox, "agbZustimmung", "", 1)
Wie krieg ich also z.B. die CheckBox mit "Value" z.B. 12 zu fassen ?
Oder... wie kann ich mir alle HTML Elemente anzeigen lassen... (ID, Name etc.) ... wäre vielleicht auch hilfreich...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WebGadget Formular CheckBox Array

Beitrag von Kiffi »

kannst Du ein kleines lauffähiges Stückchen Code posten?
Hygge
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: WebGadget Formular CheckBox Array

Beitrag von Bisonte »

Das wird knifflig... Handelt sich um das WBB4-Forensoftware Adminpanel.
Um dort bestimmte Nutzer aufzuspüren, kann man dort per Checkboxen mehrere
Kriterien auswählen. Diese sind in so einem "<fieldset>" Tag eingeschlossen :

Code: Alles auswählen

<fieldset>
  <legend>Bedingungen</legend>
  <dl>
    <dt><label For="username">Benutzername</label></dt>
    <dd><input type="text" id="username" name="username" value="" class="medium" /></dd>
  </dl>
  
  <dl>
    <dt><label For="userID">Benutzer-ID</label></dt>
    <dd><input type="number" id="userID" name="userID" value="" class="short" /></dd>
  </dl>
    
  <label>Benutzergruppe(n)</label>
    
  <dd>
  <label><input type="checkbox" name="groupIDs[]" value="4" /> Administratoren</label>
  <label><input type="checkbox" name="groupIDs[]" value="12" /> Anwärter</label>
  ... hier kommen noch diverse weitere ...
  </dd>
</fieldset>
so etwas :

Code: Alles auswählen

<label><input type="checkbox" name="banned" value="1" /> Gesperrt</label>
bekomme ich mit der obigen Prozedur per

Code: Alles auswählen

WebGadgetInput(#Webgadget, #WebInput_CheckBox, "banned", "", 1)
mit einem Haken versehen... Da ist die "ID" eindeutig.
Aber in dem 1. "Fieldset" bekomme ich immer nur die erste Checkbox zu fassen.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WebGadget Formular CheckBox Array

Beitrag von Kiffi »

ich bin ja kein so großer Fan von diesem IWebBrowser2 - Gedönse.

Deshalb hier mal ein Alternativ-Vorschlag:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window
  #cmdCheckAdmins
  #cmdCheckAspirants
  #cmdCheckBanned
  #WebGadget
EndEnumeration

Define Html.s = "<html>" + 
                "	<fieldset>" + 
                "		<legend>Bedingungen</legend>" + 
                "		<dl>" + 
                "			<dt><label For='username'>Benutzername</label></dt>" + 
                "			<dd><input type='text' id='username' name='username' value='' class='medium' /></dd>" + 
                "		</dl>" + 
                "		<dl>" + 
                "			<dt><label For='userID'>Benutzer-ID</label></dt>" + 
                "			<dd><input type='number' id='userID' name='userID' value='' class='short' /></dd>" + 
                "		</dl>" + 
                "		<label>Benutzergruppe(n)</label>" + 
                "		<dd>" + 
                "			<label><input type='checkbox' name='groupIDs[]' value='4' /> Administratoren</label>" + 
                "			<label><input type='checkbox' name='groupIDs[]' value='12' /> Anwärter</label>" + 
                "		</dd>" + 
                "	</fieldset>" + 
                "	<label><input type='checkbox' name='banned' value='1' /> Gesperrt</label>	" + 
                "</html>" 

Procedure SetCheckboxByName(WebGadget, CheckBoxName.s, Index, Checked)
  
  Protected JS.s = "document.body.querySelectorAll(" + Chr(34) + "input[name='" + CheckBoxName + "']" + Chr(34) + ")[" + Index + "].checked=" + Checked + ";"
  
  SetGadgetText(WebGadget, "javascript:" + JS + ";void(0);")
  
EndProcedure

Procedure cmdCheckAdminsClick()
  Static Flag
  Flag = ~Flag
  SetCheckboxByName(#WebGadget, "groupIDs[]", 0, Flag)
EndProcedure

Procedure cmdCheckAspirantsClick()
  Static Flag
  Flag = ~Flag
  SetCheckboxByName(#WebGadget, "groupIDs[]", 1, Flag)
EndProcedure

Procedure cmdCheckBannedClick()
  Static Flag
  Flag = ~Flag
  SetCheckboxByName(#WebGadget, "banned", 0, Flag)
EndProcedure

If OpenWindow(#Window, 0, 0, 800, 600, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget(#cmdCheckAdmins, 0, 0, 150, 30, "(Un)Check Administratoren")
  BindGadgetEvent(#cmdCheckAdmins, @cmdCheckAdminsClick())
  
  ButtonGadget(#cmdCheckAspirants, 160, 0, 150, 30, "(Un)Check Anwärter")
  BindGadgetEvent(#cmdCheckAspirants, @cmdCheckAspirantsClick())
  
  ButtonGadget(#cmdCheckBanned, 320, 0, 150, 30, "(Un)Check Banned")
  BindGadgetEvent(#cmdCheckBanned, @cmdCheckBannedClick())
  
  WebGadget(#WebGadget, 0, 30, 800, 600, "")
  
  SetGadgetItemText(#WebGadget, #PB_Web_HtmlCode, Html)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf
Grüße ... Peter
Hygge
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: WebGadget Formular CheckBox Array

Beitrag von Bisonte »

Der Alternativorschlag klappt wunderbar :allright:

Da ich von javascript mal so gar kein Schimmer habe... hast du auch was, womit man in ein
"StringGadget" (hier ein DatePicker, wenn man in das Feld klickt) ein Datum eintragen kann, sowie
den Submit Button klickt ?

Code: Alles auswählen

; Stringgadget
<input type="date" id="lastActivityTimeStart" name="lastActivityTimeStart" value="" placeholder="von" />
<input type="date" id="lastActivityTimeEnd" name="lastActivityTimeEnd" value="" placeholder="bis" />
; Submit
<input type="submit" value="Absenden" accesskey="s" />
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: WebGadget Formular CheckBox Array

Beitrag von Kiffi »

Bisonte hat geschrieben:hast du auch was, womit man in ein "StringGadget" (hier ein DatePicker, wenn man in das Feld klickt) ein Datum eintragen kann

Code: Alles auswählen

Procedure SetInputValue(WebGadget, InputName.s, Index, Value.s)
  Protected JS.s = "document.body.querySelectorAll(" + Chr(34) + "input[name='" + InputName + "']" + Chr(34) + ")[" + Index + "].value='" + Value + "'"
  SetGadgetText(WebGadget, "javascript:" + JS + ";void(0);")
EndProcedure

SetInputValue(#WebGadget, "lastActivityTimeStart", 0, "20.03.2019")
Mir ist allerdings aufgefallen, dass das sich diese Befehle nicht unmittelbar nacheinander ausführen lassen.

Sprich, das hier:

Code: Alles auswählen

SetInputValue(#WebGadget, "lastActivityTimeStart", 0, "20.03.2019")
SetInputValue(#WebGadget, "lastActivityTimeEnd", 0, "21.03.2019")
funktioniert nicht (nur lastActivityTimeEnd wird ausgeführt). Eigentlich müsste man so eine Art Delay einbauen, oder warten, bis ein Befehl ausgeführt wurde, bevor man den nächsten ausführt. Leider weiß ich momentan nicht, wie sich das bewerkstelligen lässt.

Bisonte hat geschrieben:sowie den Submit Button klickt ?
das wird schon ein wenig schwieriger. Der Submit-Button hat keinen Namen und keine ID. Man könnte die (in Deinem HTML nicht vorhandene Form) 'submitten'. Diese bräuchte dann allerdings auch wieder einen Namen oder eine ID.

Ist die Webseite von Dir? Sprich: Kannst Du sie nach Deinen (meinen) Vorstellungen abändern? Oder ist das was externes, auf das Du keinen Einfluss hast?

Grüße ... Peter
Hygge
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: WebGadget Formular CheckBox Array

Beitrag von Bisonte »

Kiffi hat geschrieben:Ist die Webseite von Dir? Sprich: Kannst Du sie nach Deinen (meinen) Vorstellungen abändern? Oder ist das was externes, auf das Du keinen Einfluss hast?

Grüße ... Peter
Woltlab Forensoftware. Kein Einfluss drauf.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: WebGadget Formular CheckBox Array

Beitrag von hjbremer »

SetInputValue(#WebGadget, "lastActivityTimeStart", 0, "20.03.2019")
SetInputValue(#WebGadget, "lastActivityTimeEnd", 0, "21.03.2019")
funktioniert nicht (nur lastActivityTimeEnd wird ausgeführt). Eigentlich müsste man so eine Art Delay einbauen, oder warten, bis ein Befehl ausgeführt wurde, bevor man den nächsten ausführt. Leider weiß ich momentan nicht, wie sich das bewerkstelligen lässt.
Manchmal klappt es mit einem Timer dazwischen. Wenn Timer abgelaufen gibt es ein Event, welches 2.Befehl sendet.
z.B. AddWindowTimer(#mainwindow, 123, 1800)

Etliche Webseiten kann man so überlisten, wenn diese z.B. Daten im Hintergrund nachladen oder andere Sachen machen bei denen das Webgadget kein Event sendet.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten