![]() |
Scrollen im TWebBrowser
Hallo liebe Programmiergemeinde,
mich plagt zur Zeit ein Problem, bei welchem ich bisher keine vernünftige Lösung finden konnte. Allerdings programmiere ich auch noch nicht lange :roll: Ich brauche eine Anweisung, mit der ich bei einem Dokument, welches in der WebBrowser-Komponente geladen ist, ganz nach unten scrollen kann. Nun habe ich dieses Beispiel gefunden ( ![]()
Code:
Als ich dies nun probieren wollte, meckerte der Compiler bei dem Variablentyp "TWBPosition", weshalb ich diesen Typ durch Byte ersetzt und die function entsprechend geändert habe.
function WB_ScrollTo(WB: TWebBrowser; Position: TWBPosition): Boolean;
var ParentW: OLEVariant; begin Result := WB.Document <> nil; if Result then begin ParentW := WB.OleObject.Document.ParentWindow; case Position of wbPosBottom: ParentW.ScrollTo(0, ParentW.Screen.Height); wbPosTop: ParentW.ScrollTo(0, 0); wbPosRight: ParentW.ScrollTo(ParentW.Screen.Width, 0); end; end; end; // Example: Scroll to the bottom of the document: procedure TForm1.Button1Click(Sender: TObject); begin WB_ScrollTo(WebBrowser1, wbPosBottom); end; Nur funktioniert diese function zwar oftmals, aber leider nicht immer :( Manchmal scrollt der WebBrowser nur ein kurzes Stück des Dokumentes. Auf der Suche nach Alternativen bin ich dann auf diese Anweisung gestoßen ( ![]()
Code:
Diese Anweisung testweise in eine ButtonClick-Procedure implementiert ergab wiederrum Compilerfehler bei "IHTMLWindow2" und "IHTMLDocument2" – beide Begriffe werden nicht erkannt.
procedure TForm1.sbScrollToBottomClick(Sender: TObject);
var scrollpos: Integer; pw : IHTMLWindow2; Doc: IHTMLDocument2; script: WideString; begin Doc := WebBrowser1.Document as IHTMLDocument2; pw := IHTMLWindow2(Doc.parentWindow); scrollPos := pw.screen.height; pw.scrollBy(0, scrollpos); end; An dieser Stelle bin ich mit meinem Latein am Ende, vielleicht wißt ihr ja einen Rat ? |
Re: Scrollen im TWebBrowser
Ich hab das Scrollen normalerweise mit einer Textmarke erledigt. Du speicherst die Seite lokal in den temporären Dateien, lädst den Code, und fügst am Ende des HTML-Codes noch den Anker
Code:
hinzu.
<a name="MyAppScroller"></a>
Dann rufst du die entsprechende Seite so auf:
Code:
Greetz
[url]http://blablabla.com/test.htm#MyAppScroller[/url]
alcaeus [add]Achja, herzlich willkommen in der DP :dp:[/add] |
Re: Scrollen im TWebBrowser
Ziemlich kreativ :mrgreen:
Wenn man mit der Seite lokal arbeiten möchte ist die Methode gut benutzbar, allerdings möchte ich eine Seite im Internet scrollen und bei einer solchen hat man leider keine Zugriffsmöglichkeit. Es sei denn man hackt den server und lädt seine Version auf den Webspace, das aber wäre dann wohl ein bisschen zuviel Aufwand um nichts weiter als eine Seite zu scrollen :wink: |
Re: Scrollen im TWebBrowser
Äh? wenn du sie im Browser nazeigen kannst, dann kannst du sie auch über HTTP runterladen und speichern. Muss allerdings sagen alcaeus Methode gefällt mir auch nicht besonders. ;)
|
Re: Scrollen im TWebBrowser
hast du activex und mshtml eingebunden? bei mir funktionieren beide Versionen!
|
Re: Scrollen im TWebBrowser
Also ein bissl Wissen hab ich mir ja zum Glück dank des netten Wetbewerbs angeeignet, unteranderem vieles zum TWebBrowser.
Und hier ist die gekürzte Variante für den Zugriff auf die ScrollPosition.
Code:
Also ab Document/Body ist das JavaScript-Syntax (überall nachlesbar - z.B. selfHTML)
OleVariant(WebBrowser1.Document as IHTMLDocument2).Document.ScrollTo(0, 0);
OleVariant(WebBrowser1.Document as IHTMLDocument2).Body.ScrollTop := 0; OleVariant(WebBrowser1.Document as IHTMLDocument2).Body.ScrollLeft := 0; ... OleVariant(WebBrowser1.Document as IHTMLDocument2).Document.ScrollBy(x, y); Das Funktioniert 100%ig, aber wenn nicht, dann schau mal was du davon noch brauchst - hier mal ein Ausschnitt meines Uses-Bereichs: XMLDOM, XMLIntf, MSXMLDOM, XMLDoc, IdHTTP, OleCtrls, SHDocVw, ActiveX, MSHTML... |
Re: Scrollen im TWebBrowser
@Luckie:
Downloaden kann ich sie schon, allerdings stimmen, aufgrund der relativen Adressierung, dann die Beziehungen zwischen der Seite und allen anderen, welche ebenfalls auf dem Server liegen, nicht mehr. @jAcK oRsEn: Unter Einbindung der mshtml-uses funktioniert nun auch die zweite der Möglichkeiten, welche ich eingangs gepostet habe. :dancer: Leider mit dem selben Ergebnis, allerdings konnte ich den Fehler reproduzieren. Bei normalen Webseiten u.ä. funktionieren beide Möglichkeiten einwandfrei, bei dem Öffnen von Threads wird jedoch in manchen Foren gespeichert, welches der letzte gelesene Beitrag war. Öffnet man nun diesen Thread und versucht an das untere Ende des Dokumentes zu gelangen, bleibt regelmäßig ein Abstand zur Unterkante. :( Das Hochscrollen geht dagegen fehlerlos. @himitsu: Die Befehle funktionieren auf jeden Fall erstmal, bei der genannten Problematik klappt es allerdings auch nicht (zuverlässig nach unten scrollen). Ich hatte es so versucht:
Code:
OleVariant(WebBrowser1.Document as IHTMLDocument2).Body.ScrollTop := WebBrowser1.OleObject.Document.ParentWindow.Screen.Height;
OleVariant(WebBrowser1.Document as IHTMLDocument2).Body.ScrollLeft := 0; @All: Eine, wenn auch sehr rustikale, Möglichkeit welche ich man benutzen kann, ist es dem Dokument den Fokus zu übergeben und die Eingabe der Taste "Ende" zu simulieren. Dabei habe ich bisher noch keine Fehler entdecken können. Allerdings habe ich bisher keine vernünftige Anweisung herausbekommen, um dem Dokument, welches innerhalb des Webbrowsers angezeigt wird, den Fokus zuzuweisen. Und mit einem simulierten Mausklick zu arbeiten ist ein bisschen :oops: Vielleicht weiß ja einer eine Möglichkeit, bitte posten. :bounce1: Neben diesem habe ich noch ein kleines weiteres Problem, welches aber eigentlich simpel sein müsste. Na ja, eben müsste. Es geht um eine schlichte Umleitung wiederum mit dem TWebBrowser. Laut der Hilfe von Delphi müsste eigentlich folgendes funktionieren:
Code:
Wie gesagt, die Delphihilfe spricht davon, dass das Verändern des Strings URL zum Umleiten genügen müsste. Nur tut es das bei mir nicht, die ursprünglich angeforderte Webseite wird normal geladen. :wall:
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool); begin URL := 'http://www.google.de'; end; |
Re: Scrollen im TWebBrowser
Delphi-Quellcode:
Feststellung: ParentW.Screen.Height wird maximal 864 Gross, egal wie Gross (Hoch) das geladene Dokument ist.
function WB_ScrollTo(WB: TWebBrowser; Position: TWBPosition): Boolean;
var ParentW: OLEVariant; begin Result := WB.Document <> nil; if Result then begin ParentW := WB.OleObject.Document.ParentWindow; case Position of wbPosBottom: ParentW.ScrollTo(0, ParentW.Screen.Height); wbPosTop: ParentW.ScrollTo(0, 0); wbPosRight: ParentW.ScrollTo(ParentW.Screen.Width, 0); end; end; end; // Example: Scroll to the bottom of the document: procedure TForm1.Button1Click(Sender: TObject); begin WB_ScrollTo(WebBrowser1, wbPosBottom); end; Wie kann man zuverlaessig ganz nach unten scrollen? |
Re: Scrollen im TWebBrowser
Delphi-Quellcode:
Du musst also ParentW.Screen.Height durch MaxInt ersetzen.
WebBrowser1.OleObject.Document.ParentWindow.ScrollTo(0,MaxInt);
So müsste es funktionieren. Ich hoffe ich konnte dir helfen. |
Re: Scrollen im TWebBrowser
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz