Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zugriffsverletzung bei nicht sichtbarem TWebBrowser (https://www.delphipraxis.net/187551-zugriffsverletzung-bei-nicht-sichtbarem-twebbrowser.html)

Ajintaro 8. Dez 2015 15:27

Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
Hallo DP,

Eine gewisse Zugriffsverletzung nervt mich schon seit geraumer Zeit, ich kann sie auch immer wieder nachstellen:
Ich habe eine Demo-Anwendung gebaut mit nichts außer einem Pagecontrol (zwei pages) und einem TWebrowser (auf page 2).

Sobald der Browser eine Navigation durchführt und man das Programm beendet, bevor die Page fertig geladen hat gibt es eine Zugriffsverletzung, wenn der Browser nicht sichtbar ist. (TWebBrowser ist auf Page 2) Ich hatte das schon häufiger in Anwendungen mit TWebbrowser und ich konnte noch keine Lösung dafür finden.

Wie kann ich die Anwendung sauber beenden, auch wenn die Page noch nicht fertig geladen hat UND nicht sichtbar ist?

Bernhard Geyer 8. Dez 2015 15:44

AW: Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
Der IE braucht einen Windows-Handle zum richtig arbeiten.
Evtl. reicht ein .HandleNeeded-Aufruf auf.

nahpets 8. Dez 2015 15:45

AW: Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
unelegante Billiglösung:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PageControl1.ActivePageIndex = 1; // Index der Seite, auf der sich der "Übeltäter" befindet.
end;
(Alternativ: Sofern eine "Beenderoutine" vorhanden, dort den ActivePageIndex ändern.)

Eventuell beim Beenden einen von den Beiden versuchen:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  WebBrowser1.Stop;
  WebBrowser1.Quit;
end;
In einer Schleife warten, bis
Delphi-Quellcode:
WebBrowser1.Busy = false;
ist.
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Keine Ahnung, ob hier die Gefahr einer Endlosschleife besteht,
  // weil Busy beim Programmbeenden eventuell nicht mehr false werden sollte...
  if WebBrowser1.Busy then repeat
    WebBrowser1.Stop;
    WebBrowser1.Quit;
    Sleep(1000);
  until not WebBrowser1.Busy;
end;
(Alles nur so hingedaddelt und ungetestet, keine Garantie für Wirksamkeit.)

Ajintaro 8. Dez 2015 15:58

AW: Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
Hallo,

danke für die Antworten. Also
Delphi-Quellcode:
WebBrowser1.Stop;
WebBrowser1.Quit;
verursacht einen unbekannten Fehler. Nach etwas Recherche wird deutlich, dass HandleNeeded wohl das Problem löst. Allerdings bin ich mir nicht sicher wo man das platziert.

nahpets 8. Dez 2015 16:32

AW: Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
Eventuell hier?

https://groups.yahoo.com/neo/groups/...ns/topics/7329
Zitat:

I checked the code I am using for dynamically creating a form that has a
webbrowser (TEmbeddedWB) on it and all I do before the form is shown is
call handleneeded then I nav to the URL.
oder
http://stackoverflow.com/questions/2...wser-component
Zitat:

Call WebBrowser1.HandleNeeded; before navigating to an address.

Ajintaro 9. Dez 2015 10:37

AW: Zugriffsverletzung bei nicht sichtbarem TWebBrowser
 
Ah vielen Dank - man setzt es vor dem Navigate ein. Prima, das hat das nervige Problem gelöst!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr.

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