Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Scrollen im TWebBrowser (https://www.delphipraxis.net/23154-scrollen-im-twebbrowser.html)

Ungeübter 29. Mai 2004 18:30


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 (http://www.swissdelphicenter.ch/de/showcode.php?id=1186):

Code:
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;
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.

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 (http://www.delphipages.com/threads/t...14257&G=114227):

Code:
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;
Diese Anweisung testweise in eine ButtonClick-Procedure implementiert ergab wiederrum Compilerfehler bei "IHTMLWindow2" und "IHTMLDocument2" – beide Begriffe werden nicht erkannt.

An dieser Stelle bin ich mit meinem Latein am Ende, vielleicht wißt ihr ja einen Rat ?

alcaeus 29. Mai 2004 18:33

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:
<a name="MyAppScroller"></a>
hinzu.
Dann rufst du die entsprechende Seite so auf:
Code:
[url]http://blablabla.com/test.htm#MyAppScroller[/url]
Greetz
alcaeus

[add]Achja, herzlich willkommen in der DP :dp:[/add]

Ungeübter 29. Mai 2004 19:30

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:

Luckie 29. Mai 2004 19:32

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. ;)

jAcK oRsEn 30. Mai 2004 00:02

Re: Scrollen im TWebBrowser
 
hast du activex und mshtml eingebunden? bei mir funktionieren beide Versionen!

himitsu 30. Mai 2004 00:38

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:
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);
Also ab Document/Body ist das JavaScript-Syntax (überall nachlesbar - z.B. selfHTML)

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...

Ungeübter 31. Mai 2004 20:07

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:
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;
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:

toms 23. Jan 2005 10:08

Re: Scrollen im TWebBrowser
 
Delphi-Quellcode:
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;
Feststellung: ParentW.Screen.Height wird maximal 864 Gross, egal wie Gross (Hoch) das geladene Dokument ist.
Wie kann man zuverlaessig ganz nach unten scrollen?

cgimda 23. Jan 2005 18:43

Re: Scrollen im TWebBrowser
 
Delphi-Quellcode:
WebBrowser1.OleObject.Document.ParentWindow.ScrollTo(0,MaxInt);
Du musst also ParentW.Screen.Height durch MaxInt ersetzen.

So müsste es funktionieren. Ich hoffe ich konnte dir helfen.

toms 23. Jan 2005 22:52

Re: Scrollen im TWebBrowser
 
Zitat:

Zitat von cgimda
Delphi-Quellcode:
WebBrowser1.OleObject.Document.ParentWindow.ScrollTo(0,MaxInt);
Du musst also ParentW.Screen.Height durch MaxInt ersetzen.
So müsste es funktionieren. Ich hoffe ich konnte dir helfen.

Danke, das hat so funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz