Fehler im Webgadget?

Für allgemeine Fragen zur Programmierung mit PureBasic.
manke
Beiträge: 26
Registriert: 28.04.2007 03:04
Wohnort: Einhausen, Südhessen

Fehler im Webgadget?

Beitrag von manke »

Ich habe eine Prozedur geschrieben, die auf die Internetseite www.leo.org geht und dort die Übersetzung einer Vokabel Englisch/Deutsch anzeigt. Die Vokabel wird im String suche$ übergeben. Hier der Code:

Code: Alles auswählen

Procedure zeige_internet(suche$)
Static breite=940,hoehe=760,x=0
IFenster=OpenWindow(#PB_Any,0,0,breite+20,hoehe+40,"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 
Until event=#PB_Event_CloseWindow
x=GetGadgetAttribute(seite,#PB_Web_ScrollX)
Debug x
CloseWindow(IFenster)
EndProcedure
Leider gibt der Debugbefehl in der drittletzten Zeile stets 0 aus, auch wenn man den horizantalen Scrollbalken nach rechts bewegt hat. Auch die Umkehrung mit z.B. setgadgetattribute(seite,100), um den horizontalen Scrollbalken auf den Wert 100 zu setzen, funktioniert nicht. Der Scrollbalken bleibt stets ganz links (entsprechend einem X von 0 stehen).

Habe ich etwas falsch gemacht oder hat sich ein Käfer eingeschlichen?

Code-Tags ergänzt - Thread verschoben - Kaeru fecit
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> Habe ich etwas falsch gemacht oder hat sich ein Käfer eingeschlichen?
Ja, dieses Forum ist für Bugmeldungen und nicht für Fragen!

Könnte das mal bitte jemand verschieben?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

@manke, man sollte schon wissen was die X- oder Y-Achse ist.
Vertausche das mal.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
manke
Beiträge: 26
Registriert: 28.04.2007 03:04
Wohnort: Einhausen, Südhessen

Beitrag von manke »

Ich weiss durchaus was x- und y-Achse sind. Üblicherweise ist steht das x für die horizontale Achse. Hier aus der Online-Hilfe von PureBasic:

#PB_Web_ScrollX : Legt die horizontale Scroll-Position fest

Genau das habe ich gemacht, es funktioniert aber nicht. Aber Probieren geht über Studieren, ich bin Deinem Rat gefolgt und habe einmal die Konstante #PB_Web_ScrollY eingesetzt bzw. habe dann auch einmal einfach beide Schieber verstellt, es bleibt beim Ergebnis 0. Auch umgekehrt funktioniert die Veränderung der Scrollpositionen mit Setgadgetattribute nicht. Also vielleicht doch ein Käfer in PureBasic 4.3 (auch in 4.31 beta1 und beta2)?
Dann müsste dieser Thread wieder verschoben werden.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

erst wenn das "vielleicht" aus dem Satz genommen werden kann.

also, du hast hier ne Procedure mit nem Fenster und ner kompletten Eventschleife.

jetzt lass mich mal raten...

das ist nicht dein einziges Fenster
und
du startest die Procedure als Thread...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

folgender Code funktioniert bei mir (es muss natürlich auch ein horizontaler
Scrollbalken vorhanden sein und die URL korrekt angezeigt werden!)

Code: Alles auswählen

Procedure zeige_internet(suche$)
Static breite=400,hoehe=500,x=0
IFenster=OpenWindow(#PB_Any,0,0,breite+20,hoehe+40,"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,"http://www.leo.org")
;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
Until event=#PB_Event_CloseWindow
x=GetGadgetAttribute(seite,#PB_Web_ScrollX)
Debug x
CloseWindow(IFenster)
EndProcedure
Win11 x64 | PB 6.20
manke
Beiträge: 26
Registriert: 28.04.2007 03:04
Wohnort: Einhausen, Südhessen

Beitrag von manke »

Hallo,

das ist ein erster Ansatz: Die vorgeschlagene leicht geänderte Prozedur funktioniert tatsächlich. Wenn ich aber die von mir gewünschte URL eingeben, klappt es wieder nicht. Die Prozedur ist Teil meines Vokabeltrainers. Sie dient dazu eine deutsche, englische oder französische Vokabel übergeben zu bekommen und dann leo.org aufzurufen, um dort die Vokabel nachzusehen. Sie wird nicht als Thread aufgerufen, sondern als ganz normale Prozedur, nach deren Ende geht es ins aufrufende Fenster zurück (es gibt mehrere Stellen, die sie aufrufen). Der String "leo$" kann nur zwei Werte haben:

Code: Alles auswählen

If sprache$(1)="Französisch"
  leo$="http://dict.leo.org/frde?lang=de&lp=frde&search="
Else
  leo$="http://dict.leo.org/ende?lang=de&lp=ende&search="
EndIf
Er ist global definiert und richtet sich nach der Sprache der geladenen Lektion.

Mit diesen URLs klappt es aber nicht mit den Scrollbalken. Diese sind natürlich vorhanden und können per Hand bewegt werden. Ich würde mir aber gerne die horizontale (und wenns klappt dann auch die vertikale) Scrollpostion in einer statitschen lokalen Variablen merken und beim nächsten Aufruf der Prozedur die Scrollpositionen beibehalten. Die beiden Strings für leo$ habe ich übrigens durch Aufruf über den Firefox per Hand ermittelt und dann einfach in meinen Quelltext kopiert. Aber warum ist die Abfrage der Scrollposition abhängig von der URL?

Aber schon mal vielen Dank, jetzt bin ich schon etwas weiter und suche den Käfer eher in meinem Programm.

Code-Tags ergänzt
Andesdaf
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

stimmt. Mit den anderen URLs funktioniert das ganze nicht.
PS: Benutze in Zukunft bitte [code][/code] Tags in deinen Postings, um
Code einzufassen
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die position wird auf 0,0 zurückgesetzt, sobald die seite geladen ist.

also wenn du die scrollbars einstellst, während sie noch lädt,
hat das nach Abschluss des Ladevorgangs keine Gültigkeit mehr.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

Das Hauptproblem hier ist, dass kein lauffähiges Beispiel gepostet wurde.
Du hättest Ruckzuck sehr viel mehr helfende Hände, so aber macht sich keiner die Mühe um deine Prozedur noch das nötige rumzubasteln.
(Ausserdem ist der Code furchtbar strukturiert)

Hier mal lauffähig und (Augen/)browserfreundlicher
(schade übrigens, dass Andesdaf nicht auch gleich entsprechend eingewirkt hat, sondern diesen Spaghetticode so übernommen hat):

Code: Alles auswählen

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

Procedure zeige_internet(Suche$)
	Protected x, Event, IFenster, SuchText, SuchKnopf, Search$, Seite, Breite = 400, Hoehe = 500
	
	IFenster  = OpenWindow(#PB_Any, 0, 0, Breite + 20, Hoehe + 40, "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$)

	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
	Until Event = #PB_Event_CloseWindow

	x = GetGadgetAttribute(Seite, #PB_Web_ScrollX)
	Debug x
	CloseWindow(IFenster)
EndProcedure

zeige_internet("affe")
Ich hab mir das mal angesehen und bemerkt, dass es offensichtlich an dieser ersten Zeile im Quelltext der entsprechenden Seite liegt:

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
genauer das hier:

Code: Alles auswählen

"http://www.w3.org/TR/html4/loose.dtd"
Würde man das weglassen, zeigt dir das Attribut auch die tatsächliche Scrollbalkenposition an.
Das hilft dir aber eigentlich nicht wirklich, du kannst den Quelltext ja nicht so einfach ändern.

Ich kenn mich auch zuwenig damit aus, um jetzt mit klugen Ratschlägen daherkommen zu können, aber vielleicht findet sich ja ein anderes schlaues Köpfchen...
Antworten