Webgadget - kann man auf VSCROLL prüfen?

Anfängerfragen zum Programmieren mit PureBasic.
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

Webgadget - kann man auf VSCROLL prüfen?

Beitrag 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?
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Axolotl
Beiträge: 272
Registriert: 31.12.2008 16:34

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

Beitrag 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 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

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

Beitrag 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.
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

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

Beitrag 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.
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
Benutzeravatar
dige
Beiträge: 1238
Registriert: 08.09.2004 08:53

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

Beitrag 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..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
mk-soft
Beiträge: 3852
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Bei mir auch ...
OS: Windows 10,11 Pro
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

@dige & mk-soft: Ich habe mir mal ne Windows11 VM installiert die Codes angepasst.
a²+b²=mc²
Benutzeravatar
mk-soft
Beiträge: 3852
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

:allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten