Seite 1 von 1

Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 10.08.2025 22:33
von EmmJott
Guude!

Würde gerne das Webgadget als Textanzeige verwenden. Dazu müsste ich jedoch prüfen, ob die vertikale Scrollleiste angezeigt wird, um ggf. das Fenster so weit zu vergrößern, bis die Scrollleiste verschwindet.

Quasi so:
while "Scrollleiste vorhanden"
resizegadget (#pb_ignore, #pb_ignore, #pb_ignore, gadgetheight(gadget)+20)
wend

Wie kann ich feststellen, ob die Scrollleiste angezeigt wird? Und ginge das auch pfiffiger?

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 11.08.2025 17:18
von Axolotl
Ja, weiß nicht ob das so klappt, weil aus dem Gedächtnis gekoded und nicht kompiliert
Entschuldige mich schon mal im Voraus.

Code: Alles auswählen

Procedure IsScrollBarVisible(Gadget, ScrollStyle=#WS_VSCROLL) ; BOOL 
  Protected result 

  If ScrollStyle = #WS_VSCROLL or ScrollStyle = #WS_HSCROLL     ; vertical scroll bar or  horizontal scroll bar 
    If (GetWindowLongPtr_(GadgetID(Gadget), #GWL_STYLE) & ScrollStyle) 
      result = #True
    EndIf
  EndIf 
  ProcedureReturn result 
EndProcedure 

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 12.08.2025 09:50
von EmmJott
Hi,

wäre so schön elegant gewesen, wenn's funktionieren würde. Aber

Code: Alles auswählen

GetWindowLongPtr_(hWnd, #GWL_STYLE)
liefert beim Webgadget immer 0, beim ListIcongadget beispielsweise würde es funktionieren.

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 12.08.2025 14:02
von Kiffi
hier ein kleiner Demo-Code, der Dir weiterhelfen sollte:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window
  #WebViewGadget
EndEnumeration

Procedure NewWebGadgetViewHeight(JsonParameters$)
  
  Debug "NewWebGadgetViewHeight: "+JsonParameters$
  
  Debug "(Hier dann das Resize des Fensters)"
  
  ProcedureReturn UTF8("")
  
EndProcedure

OpenWindow(#Window, 100, 100, 400, 400, "Hello", #PB_Window_SystemMenu)

WebViewGadget(#WebViewGadget, 0, 0, 400, 400, #PB_WebView_Debug)

BindWebViewCallback(#WebViewGadget, "NewWebGadgetViewHeight", @NewWebGadgetViewHeight())

Define html$ = ~"<!DOCTYPE html>\n" +
               ~"<head>\n" +
               ~"</head>\n" +
               ~"<body>\n" +
               ~"<div>\n" +
               ~"    <button data-textlen=\"100\">Short Text</button>\n" +
               ~"    <button data-textlen=\"300\">Medium Text</button>\n" +
               ~"    <button data-textlen=\"600\">Long Text</button>\n" +
               ~"</div>\n" +
               ~"<div id=\"output\">Hier erscheint der Text...</div>\n" +
               ~"<script>\n" +
               ~"\n" +
               ~"document.querySelectorAll(\"button\").forEach(btn => {\n" +
               ~"    btn.addEventListener(\"click\", () => {\n" +
               ~"        let textlen = btn.getAttribute(\"data-textlen\");\n" +
               ~"        fetch(`https://fakeapi.net/lorem/${textlen}`)\n" +
               ~"            .then(response => response.text())\n" +
               ~"            .then(text => {\n" +
               ~"                let out = document.getElementById(\"output\");\n" +
               ~"                out.textContent = text;\n" +
               ~"                window.NewWebGadgetViewHeight(out.offsetHeight);\n" +
               ~"            })\n" +
               ~"            .catch(err => {\n" +
               ~"                document.getElementById(\"output\").textContent = \"Fehler beim Laden des Textes.\";\n" +
               ~"                console.error(err);\n" +
               ~"            });\n" +
               ~"    });\n" +
               ~"});\n" +
               ~"</script>\n" +
               ~"</body>\n" +
               ~"</html>\n"

SetGadgetItemText(#WebViewGadget, #PB_WebView_HtmlCode, html$)

Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow
// Edit: Code angepasst

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 12.08.2025 20:34
von EmmJott
Hallo Kiffi,

besten Dank für den Input. Das Beispiel funktioniert, aber das Javascript-Gedöhns ist zu hoch für mich. Ich kann es nicht so umbauen, wie ich es bräuchte. Wenn ich das Button- und das LoremIpsum-Gedöhns durch einen einfachen Text ersetze, funktioniert das Script anscheinend nicht mehr.

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 13.08.2025 01:19
von Kiffi
Ohne "Gedöhns" wirst Du da recht wenig machen können.

Das von mir erstellte Beispiel war vielleicht ein wenig oversized, sollte aber verdeutlichen, wie das im Prinzip abläuft.

Hier eine vereinfachte Version (Du musst nur den Inhalt von Text in der Procedure WebViewGadgetIsReady() ändern)

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window
  #WebViewGadget
EndEnumeration

Procedure WebViewGadgetIsReady(JsonParameters$)
  
  Protected Text.s = "Lorem ipsum Morbi erat ex, lacinia nec efficitur eget, sagittis ut orci. Etiam in dolor placerat, pharetra ligula et, bibendum neque. Vestibulum vitae " + 
                     "congue lectus, sed ultricies augue. Nam iaculis elit nec velit luctus, vitae rutrum nunc imperdiet. Nunc vel turpis sit amet lectus pellentesque " + 
                     "tincidunt. Proin commodo tincidunt enim, at sodales mi dictum ac. Maecenas molestie, metus quis malesuada dictum, leo erat egestas lacus, sit " + 
                     "amet tristique urna magna a diam. Donec ultricies dui sit amet mi ornare egestas. Phasellus ultricies lectus non interdum pellentesque. Cras nisi "  + 
                     "tellus, feugiat sed enim quis, tristique interdum lacus. Sed vel pharetra arcu, ac fermentum neque. Morbi mollis sollicitudin varius. Ut sit amet " 
  
  Text + Text
  
  
  Protected Script.s = "let out = document.getElementById('output');" +  
                       "out.textContent = decodeURIComponent('" + URLDecoder(Text) + "');" +  
                       "window.NewWebGadgetViewHeight(out.offsetHeight);"
  
  WebViewExecuteScript(#WebViewGadget, Script);
  
  ProcedureReturn UTF8("")
  
EndProcedure

Procedure NewWebGadgetViewHeight(JsonParameters$)
  
  Debug "NewWebGadgetViewHeight: "+JsonParameters$
  Debug "(Hier dann das Resize des Fensters)"
  ProcedureReturn UTF8("")
  
EndProcedure

OpenWindow(#Window, 100, 100, 400, 400, "Hello", #PB_Window_SystemMenu)

WebViewGadget(#WebViewGadget, 0, 0, 400, 400, #PB_WebView_Debug)

BindWebViewCallback(#WebViewGadget, "WebViewGadgetIsReady", @WebViewGadgetIsReady())
BindWebViewCallback(#WebViewGadget, "NewWebGadgetViewHeight", @NewWebGadgetViewHeight())

Define Html.s = "<html><body><div id='output'/><script>document.addEventListener('DOMContentLoaded', () => { window.WebViewGadgetIsReady() });</script></body></html>"

SetGadgetItemText(#WebViewGadget, #PB_WebView_HtmlCode, Html)

Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow
// Edit: Code angepasst

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 14.08.2025 12:50
von dige
Seltsam, bei Kiffi's erstem Beispiel crasht PB 6.21 (Windows, x86&x64) hart ohne Debugger catch, sobald ich auf einen der Buttons der Webseite klicke.

Beim zweiten Beispiel wird nichts gerendert. Die Seite bleibt weis..

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 14.08.2025 13:12
von mk-soft
Bei mir auch ...
OS: Windows 10,11 Pro

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 14.08.2025 14:09
von Kiffi
@dige & mk-soft: Ich habe mir mal ne Windows11 VM installiert die Codes angepasst.

Re: Webgadget - kann man auf VSCROLL prüfen?

Verfasst: 14.08.2025 15:12
von mk-soft
:allright: