Fehler im Webgadget?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

@hexor,
der Code funzt. Er zeigt mir die korrekt die Positionen der Scrollbalken an.

Code: Alles auswählen

Procedure zeige_internet(suche$)
Static breite=540,hoehe=360,x=0
IFenster=OpenWindow(#PB_Any,0,0,breite+20,hoehe+140,"Suche nach:",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
suchtext=StringGadget(#PB_Any,3,3,550,28,suche$) :suchknopf=ButtonGadget(#PB_Any,560,3,78,28,"Search")
search$=leo$+suche$
seite=WebGadget(#PB_Any,0,32,breite,hoehe,search$)
SetGadgetText(seite,search$):SetGadgetAttribute(seite,#PB_Web_ScrollX,x)
Repeat
  event=WaitWindowEvent()
  If event=#PB_Event_Gadget
   Select EventGadget()
    Case suchtext
    Case suchknopf
      search$=leo$+GetGadgetText(suchtext)
      SetGadgetText(seite,search$)
    EndSelect
  ElseIf event=#PB_Event_SizeWindow; Fenstergröße wurde geändert
    breite=WindowWidth(IFenster)-20:hoehe=WindowHeight(IFenster)-40
    ResizeGadget(seite,#PB_Ignore,#PB_Ignore,breite,hoehe)
  EndIf
  y=GetGadgetAttribute(seite,#PB_Web_ScrollY)
  x=GetGadgetAttribute(seite,#PB_Web_ScrollX)
  Debug Str(x) + " / " + Str(y)
Until event=#PB_Event_CloseWindow

CloseWindow(IFenster)
EndProcedure

zeige_internet("http://leo.org" )
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
HeX0R
Beiträge: 3070
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 »

Ist schon frustrierend, wenn man sich soviel Mühe gibt und den nächsten Poster interessiert es nicht...

Die gewünschte Seite ist nunmal nicht http://leo.org (die meine angemerkte Zeile auch nicht im Quelltext hat), sondern http://dict.leo.org!
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

hm. dict.leo.org geht nicht.
Es müsste also an der von HeX0R beschriebenen Zeile im Code liegen
Win11 x64 | PB 6.20
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Fehler im Webgadget?

Beitrag von Rudi »

HeX0R hat den Fehler gefunden. Hatte das gleiche Problem mit einer Seite, in welcher folgender Eintrag ganz oben steht:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Habe diese Seite herunter geladen und versucht offline die Scrollposition zu ermitteln. Das ging aber erst nachdem ich die oben genannte Zeile gelöscht hatte.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Fehler im Webgadget?

Beitrag von PureLust »

Moin, moin, ...

nachfolgender Code behebt zwar nicht Dein Problem mit dem Setzen der ScrollPosition, aber Du hattest ja auch nicht geschrieben was Du eigentlich mit Deinem kleinen Proggy wolltest.
Also bin ich mal davon ausgegangen, dass es Dir darum ging das Suchergebnis von Leo zu zentrieren.

Durch HeXOR bin ich auf die Idee gekommen, die Tabelle mit dem Suchergebnis einfach aus dem HTML-Code aus zuschneiden und alleine für sich anzuzeigen.
Die Ausgabe ist zwar nicht mehr besonders schick, da sämtliche Styles fehlen, aber vielleicht reicht's Dir ja.

Code: Alles auswählen

Global leo$ = "http://dict.leo.org/ende?lang=de&lp=ende&search="

Procedure.s LeoErgebnisAusschneiden(HTMLCode.s)
	Protected n, TableTagPos.i = 1, InputTag1.i, InputTag2.i
   HTMLCode = Mid(HTMLCode, FindString(UCase(HTMLCode),">WERBUNG</A>",1)+10)
   HTMLCode = Mid(HTMLCode, FindString(UCase(HTMLCode),"</TABLE>",1)+10)
   If FindString(LCase(HTMLCode),">kein w&ouml;rterbucheintrag vorhanden<",1)
   	; Kein Suchergebnis gefunden
   	HTMLCode = Mid(HTMLCode, FindString(UCase(HTMLCode),"<TABLE",1))
      HTMLCode = Left(HTMLCode, FindString(UCase(HTMLCode),"</TABLE>",1)+7)
   Else
   	; Ergebnis wurde gefunden
	   HTMLCode = Mid(HTMLCode, FindString(UCase(HTMLCode),"</TABLE>",1)+10)
	   For n = 1 To 6
	   	TableTagPos = FindString(UCase(HTMLCode),"</TABLE>",TableTagPos)+7
	   Next n
	   HTMLCode = Left(HTMLCode, TableTagPos)
	   InputTag1 = FindString(UCase(HTMLCode),"<INPUT",1)-1
	   InputTag2 = FindString(UCase(HTMLCode),"</TD>",InputTag1)-1
	   HTMLCode = Left(HTMLCode, InputTag1) + "&nbsp;" + Mid(HTMLCode, InputTag2)
	EndIf
	ProcedureReturn HTMLCode
EndProcedure

Procedure DummyWebCallBack()
	; Hier könntest Du bei Bedarf auf eine User-Navigation reagieren
EndProcedure
	
Procedure zeige_internet(Suche$)
	Protected x, Event, IFenster, SuchText, SuchKnopf, Search$, Seite
	Protected Breite = 600, Hoehe = 500
	Protected HTMLCode.s, TableTagPos.i
   
	IFenster  = OpenWindow(#PB_Any, 0, 0, Breite, Hoehe, "Suche nach:", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
	WindowBounds(IFenster,400,400,#PB_Ignore,#PB_Ignore)
	AddKeyboardShortcut(IFenster, #PB_Shortcut_Return, 77)
   SuchText  = StringGadget(#PB_Any, 3, 3, WindowWidth(IFenster) -91, 28, Suche$)
   SuchKnopf = ButtonGadget(#PB_Any, WindowWidth(IFenster) -85, 3, 83, 28, "Search")
   Search$   = leo$ + Suche$
   DummyWebGadget = WebGadget(#PB_Any, -100, 0, 90, 90, Search$)
   Seite     = WebGadget(#PB_Any, 0, 35, Breite-2, Hoehe-37, "")
   SetGadgetAttribute(Seite, #PB_Web_NavigationCallback, @DummyWebCallBack())
   
   ; Warten bis die Seite fertig geladen wurde
   While GetGadgetAttribute(DummyWebGadget, #PB_Web_Busy) : WindowEvent() : Wend
   ; Die Events einfach abzufangen ist natürlich etwas unsauber ... solltest Du anders lösen
   ; Nach dem Ausschneiden der Tabelle mit den Ergebnissen wird der HTML-Code in das sichtbare Gadget geschrieben
   SetGadgetItemText(Seite, #PB_Web_HtmlCode, LeoErgebnisAusschneiden(GetGadgetItemText(DummyWebGadget, #PB_Web_HtmlCode)))
   SetActiveGadget(SuchText)
   
   Repeat
    	Event=WaitWindowEvent()
    	EventGadget = EventGadget()
    	If Event = #PB_Event_Menu And EventMenu() = 77
    		Event = #PB_Event_Gadget
    		EventGadget = SuchKnopf
    	EndIf
      If Event = #PB_Event_Gadget
         Select EventGadget
            Case SuchText
            
            Case SuchKnopf
               Search$ = leo$ + GetGadgetText(SuchText)
               SetGadgetText(DummyWebGadget, Search$)
               Delay(100)
               While GetGadgetAttribute(DummyWebGadget, #PB_Web_Busy) : WindowEvent() : Wend
               ; Hier abermals die unsaubere Event-Lösung ... solltest Du wie gesagt was dran ändern
               SetGadgetItemText(Seite, #PB_Web_HtmlCode, LeoErgebnisAusschneiden(GetGadgetItemText(DummyWebGadget, #PB_Web_HtmlCode)))
               SetActiveGadget(SuchText)
         EndSelect
      ElseIf Event = #PB_Event_SizeWindow; Fenstergröße wurde geändert
         ResizeGadget(SuchText, #PB_Ignore, #PB_Ignore, WindowWidth(IFenster) -91, #PB_Ignore)
         ResizeGadget(SuchKnopf, WindowWidth(IFenster) -85, #PB_Ignore, #PB_Ignore, #PB_Ignore)
         ResizeGadget(Seite, #PB_Ignore, #PB_Ignore, WindowWidth(IFenster) -2, WindowHeight(IFenster) - GadgetY(Seite)-2)
      EndIf
   Until Event = #PB_Event_CloseWindow
;    x = GetGadgetAttribute(Seite, #PB_Web_ScrollX)
;    Debug x
   CloseWindow(IFenster)
EndProcedure

zeige_internet("affe")
Gruß und FF,
PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Fehler im Webgadget?

Beitrag von hjbremer »

aus dem englischen Forum

betrifft: GetGadgetAttribute(webgadgetnr, #PB_Web_ScrollY)

http://www.purebasic.fr/english/viewtop ... eb_ScrollY
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