AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TWebBrowser zur Laufzeit löschen

Ein Thema von Jef · begonnen am 3. Nov 2016 · letzter Beitrag vom 3. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
Jef

Registriert seit: 8. Sep 2013
Ort: München
40 Beiträge
 
Delphi 10.3 Rio
 
#1

TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 10:48
Hallo Forum!

Wenn ich ein Form zur Laufzeit löschen möchte, mache ich das so:
Code:
if assigned(Form) then
  begin
    Form.DisposeOf;
    Form := nil;
  end;
Wenn aber ein TWebbrowser, der eine lokale html-Datei lädt, auf dem Form lag, bekomme ich eine Zugriffsverletzung, wenn ich das Form wieder laden will.

Der TWebbrowser scheint nicht vollständig gelöscht zu sein. Weiß jemand, wie ich das Problem lösen kann?
Sebastian
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 10:52
Die Fragestellung lässt doch sehr zu wünschen übrig.

Aber wenn du eine Form "zerstörst", dann musst du sie vor dem erneuten Aurufen mit Form := TForm.Create wieder erstellen.

Wenn das jetzt nicht das ist was du suchst, dann wäre eine aussagekräftigere Beschreibung angeraten. Evtl. auch ein bisschen SourceCode aus deinem Programm wo der Fehler auftritt.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 11:02
Hi,

zeig doch mal den Code der die Zugriffsverletzung auslöst. Interessanter ist in der Tat wie du das Form erzeugst/aufrufst, anstatt der Code des freigebens.
Wo knallt es genau? Beim Erzeugen, Anzeigen oder beim Laden des Webbrowserinhalts?
Philip
  Mit Zitat antworten Zitat
Jef

Registriert seit: 8. Sep 2013
Ort: München
40 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 11:13
Ich rufe das Formular folgendermaßen auf:
Code:
begin
  if not (Assigned(Form)) then
  Application.CreateForm(TForm, Form);
end;
Das funktioniert alles wunderbar, es können also alle möglichen FMX-Komponenten drin liegen.

Außer eben ein TWebbrowser. Wenn ein TWebbrowser drin liegt gibt es einen Absturz, wenn der oben genannte Code ausgeführt wird.
Sebastian
  Mit Zitat antworten Zitat
Jef

Registriert seit: 8. Sep 2013
Ort: München
40 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 11:31
Also das Szenario ist so:

Ich habe ein Startformular (nur dieses Form ist geladen). Von dort komme ich mit dem genannten Code auf ein Formular 1 (wird neu geladen) und von dort aus wird ein weiteres Formular 2 (neu) geladen, in dem der Webbrowser liegt. Der Webbrowser zeigt eine lokale html-Datei an. Zwischen Forumular 1 und 2 kann hin und her wechseln. Hier wird nicht gelöscht. Wenn ich zum Startformular zurückgehe, wird der obige Code aufgerufen, der Formular 1 und 2 aus dem Speicher nimmt. Dann kommt die Zugriffsverletzung.
Sebastian
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 11:57
[...] bekomme ich eine Zugriffsverletzung, wenn ich das Form wieder laden will.
[...] der Formular 1 und 2 aus dem Speicher nimmt. Dann kommt die Zugriffsverletzung.
Beim Freigeben oder beim Laden? Ist der TWebbrowser auf dem Form oder wird er dynamisch erzeugt?
Hast Du schonmal ausprobiert keine Datei in den Webbrowser zu laden? Knallt es dann auch, oder wirklich nur wenn die Datei geladen ist?
Hast Du schonmal probiert den Webbrowser temporär mal zu löschen. Knallt es dann auch?
Philip
  Mit Zitat antworten Zitat
Jef

Registriert seit: 8. Sep 2013
Ort: München
40 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 12:23
Ich bekomme die Zugriffsverletzung nicht, wenn ich das Formular wieder laden will, sondern schon vorher, wenn das Startformular wieder erscheint.
Der Webbrowser ist nicht dynamisch erzeugt, sondern liegt auf dem Form.

Meinst Du mit temporär löschen zur Laufzeit löschen? Da weiß ich nicht, wie das geht. Wenn ich aber im Designer den TWebbrowser lösche, funktioniert alles.

UND: Wenn der Webbrowser keine html-Datei lädt, passt auch alles. Erst, wenn Daten geladen werden und dann das Form mit dem Browser freigegeben wird, knallt es.
Sebastian
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 12:42
Hi,

die Ansätze die Darlo genannt hat solltest du natürlich mal überprüfen.

Ich würde aber mal den Debugger anwerfen und schauen, wo es knallt. Einfach mal auf "Anhalten" klicken und schauen in welcher Zeile er stehen bleibt. Eventuell noch den StackTrace zu rate ziehen. Dann siehst du, woher der fehlgeschlagene Aufruf kommt. Dann kannst du somit immer weiter vorne anfangen zu debuggen und findest dann schlussendlich den Übeltäter.

Aber da das anscheinend beim Laden der HTML Datei passiert, vermute ich, dass wohl irgendwas im Constructor der Form ausgeführt wird.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 12:58
Probier mal die HTML-Datei zu verlassen.
Delphi-Quellcode:
  form3.WebBrowser1.Stop;
  form3.WebBrowser1.URL := '';
  form3.WebBrowser1.Navigate;
Philip
  Mit Zitat antworten Zitat
Jef

Registriert seit: 8. Sep 2013
Ort: München
40 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: TWebBrowser zur Laufzeit löschen

  Alt 3. Nov 2016, 13:49
Probier mal die HTML-Datei zu verlassen.
Delphi-Quellcode:
  form3.WebBrowser1.Stop;
  form3.WebBrowser1.URL := '';
  form3.WebBrowser1.Navigate;
Das funktioniert leider nicht.

Was ich gefunden habe: NavNoReadFromCache
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  Flags: OLEVariant;

begin
  Flags:=4; // NavNoReadFromCache
  WebBrowser1.Navigate('http://www.example.com', Flags);
end;
Das scheint ein guter Ansatz zu sein. Flags: OLEVariant; ist bei mir jetzt eine globale Variable im Startformular. Wenn im Formcreate ich eine html lade und davor Flags:=4; setze, gibt es keine Fehlermeldung, wenn später alles freigegeben wird.
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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