Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webbrowser Refresh mit anschließenden OnDocumentComplete (https://www.delphipraxis.net/134455-webbrowser-refresh-mit-anschliessenden-ondocumentcomplete.html)

Onkelrossie 22. Mai 2009 13:47


Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Hallo zusammen,

ich suche mich nun schon seit über 2 Stunden halb Tot aber finde
für dieses augenscheinlich kleine Problem einfach keine Lösung.

Ich benutze den TWebbrowser zum laden einer Seite. Jetzt möchte
ich wenn ich auf den Button "aktualisieren" klicke, die Seite
neu laden was ich mit Webbrowser.Refresh2 realisiert habe um
dann alle änderungen in einer Liste anzeigen zu lassen.

Dazu verwende ich das Ereigniss OnDocumentComplete welches
aber, und das ist mein Problem, nach Webbrowser.Refresh2
nicht aufgerufen wird. Lade ich eine Seite ganz normal
über Navigate dann funktioniert es; die Seite wird dann
aber nicht aktualisiert sondern nur aus dem Cache geladen.

Wäre für einen konspirativen Vorschlag sehr Dankbar.


Mit freundlichen Grüßen
Wolfgang

toms 22. Mai 2009 15:54

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Hallo

Ein Möglichkeit: Anstatt Refresh2 aufzurufen wird einfach nochmals navigiert:

Delphi-Quellcode:
WebBrowser1.Navigate(WebBrowser1.LocationURL)

hathor 22. Mai 2009 16:13

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Ich habe das in einem eigenen Programm so gelöst:

Delphi-Quellcode:
// Refresh Webbrowser in Unit WBFuncs.pas
procedure WB_Refresh(WB: TWebbrowser);
const REFRESH_COMPLETELY = 3;
var KeyState: TKeyBoardState; RefreshLevel: OleVariant;
begin
  if WB_DocumentLoaded(WB) then begin GetKeyboardState(KeyState);
    try if not ((KeyState[vk_Control] and 128) <> 0) then WB.Refresh
      else // if control key pressed then REFRESH_COMPLETELY
           // RefreshLevel specifies the refresh level.
        RefreshLevel := REFRESH_COMPLETELY;
      WB.DefaultInterface.Refresh2(RefreshLevel);
    except end; end;
end;
...
// Get the current (visible) TWebbrowser in PC1=PageControl
function TForm1.GetCurrentWB: TWebbrowser;
begin Result := nil;
  with PC1 do if ActivePage.ControlCount > 0 then
    begin if ActivePage.Controls[0] is TWebbrowser then
      begin Result := (TWebbrowser(ActivePage.Controls[0]));
      end else Result := FPrevBrowser; end;
end;
...
WB_Refresh(GetCurrentWB);

Onkelrossie 22. Mai 2009 18:27

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Danke erstmal für die Antworten!

toms:
Deine Lösung habe ich schon einmal versucht aber das Problem
ist dann das die Seite nur aus dem Cache geladen wird und nicht neu
vom Server bezogen wird. Wenn sich also etwas geändert hat muss ich
das Programm erst neu starten um diese änderung zu sehen oder
ich rufe Refresh2 auf dann muss ich die Seite nur nochmal neu laden
und ich sehe alle änderungen. Das Problem daran ist dann allerdings
wieder das kein OnDocumentComplete nach dem Refresh aufgerufen wird.
Ich kann dann zwar nach dem Refresh2 noch einmal die Seite vie Navigate
neu aufrufen aber Refresh2 läd die Seite doch schon neu nur das dann
das benötigte Ereigniss nicht aufgerufen wird.

hathor:
Deine Lösung habe ich getestet aber hat ebenfalls nicht funktioniert.
Es wird auch kein Ereigniss aufgerufen oder habe ich etwas falsch verstanden
an deinem Vorschlag?

Danke für weitere Hilfe!


Mit freundlichen Grüßen
Wolfgang

toms 22. Mai 2009 18:43

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Navigiere mit dem Flag navNoReadFromCache oder setze DLCTL_PRAGMA_NO_CACHE (siehe msdn)

Onkelrossie 22. Mai 2009 19:53

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Hallo toms,

ich habe deinen Rat befolgt und es so probiert:

Delphi-Quellcode:
//Button1
var
  Flag: OleVariant;
begin
  if WB1.Busy then WB1.Stop;
  Flag := NavNoReadFromCache;
  WB1.Navigate(WB1.LocationURL, Flag);
end;
Aber das Funktioniert nicht so richtig. Es wird zwar die Seite neu geladen
und OnDocumentComplete wird auch korrekt ausgeführt aber die
Seite ist troz änderungen immernoch die selbe wie seit dem Programmstart.
Erst wenn ich vorher Refresh2 ausführe wird die Seite scheinbar wirklich
neu geladen nur das ich nicht alle Dokumente bei OnDocumentComplete erhalte.
Was mache ich nur falsch?


Mit freundlichen Grüßen
Wolfgang

toms 22. Mai 2009 20:09

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Sorry, NavNoReadFromCache is laut msdn nicht implementiert. Bleibt also noch der Versuch mit DLCTL_PRAGMA_NO_CACHE. (z.B TEmbeddedWB/TEwbCore von bsalsa verwenden)

Onkelrossie 22. Mai 2009 20:48

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Hallo toms,

ich habe nun alles auf den EmbeddedWB umgestellt was ja recht einfach ging.
Aber kannst du mir das noch etwas genau erklären wie ich DLCTL_PRAGMA_NO_CACHE
mit dem EmbeddedWB zu verwenden habe?


Mit freundlichen Grüßen
Wolfgang

toms 22. Mai 2009 20:51

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
Bei DownloadOptions DownloadAndIgnoreCache auf True setzen.

Onkelrossie 22. Mai 2009 21:16

Re: Webbrowser Refresh mit anschließenden OnDocumentComplete
 
toms, mit dem DownloadAndIgnoreCache auf True setzen hatte ich leider keinen Erfolg.
Aber ich wenn ich CheckPageResynchronize auf True setze dann funktioniert es wunderbar.
Danke Dir aber für deine Hilfe und für den Tipp mit dem EmbeddedWB!


Mit freundlichen Grüßen
Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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