Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TWebBrowser zur Laufzeit löschen (https://www.delphipraxis.net/190751-twebbrowser-zur-laufzeit-loeschen.html)

Jef 3. Nov 2016 10:48

TWebBrowser zur Laufzeit löschen
 
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?

Aviator 3. Nov 2016 10:52

AW: TWebBrowser zur Laufzeit löschen
 
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
Delphi-Quellcode:
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.

Darlo 3. Nov 2016 11:02

AW: TWebBrowser zur Laufzeit löschen
 
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?

Jef 3. Nov 2016 11:13

AW: TWebBrowser zur Laufzeit löschen
 
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.

Jef 3. Nov 2016 11:31

AW: TWebBrowser zur Laufzeit löschen
 
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.

Darlo 3. Nov 2016 11:57

AW: TWebBrowser zur Laufzeit löschen
 
Zitat:

Zitat von Jef (Beitrag 1352511)
[...] bekomme ich eine Zugriffsverletzung, wenn ich das Form wieder laden will.

Zitat:

Zitat von Jef (Beitrag 1352518)
[...] 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?

Jef 3. Nov 2016 12:23

AW: TWebBrowser zur Laufzeit löschen
 
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.

Aviator 3. Nov 2016 12:42

AW: TWebBrowser zur Laufzeit löschen
 
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.

Darlo 3. Nov 2016 12:58

AW: TWebBrowser zur Laufzeit löschen
 
Probier mal die HTML-Datei zu verlassen.
Delphi-Quellcode:
  form3.WebBrowser1.Stop;
  form3.WebBrowser1.URL := '';
  form3.WebBrowser1.Navigate;

Jef 3. Nov 2016 13:49

AW: TWebBrowser zur Laufzeit löschen
 
Zitat:

Zitat von Darlo (Beitrag 1352538)
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.


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