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 Problem mit dynamischem Erstellen und Freigeben (https://www.delphipraxis.net/19523-problem-mit-dynamischem-erstellen-und-freigeben.html)

Thunderchild 5. Apr 2004 07:09


Problem mit dynamischem Erstellen und Freigeben
 
Hallo,

ich habe einen Frame, in dem sich eine WebBrowser-Kompo befindet. Im Hauptfenster sitzt ein TabControl. Die Tabs erstelle uch zur Laufzeit und fülle sie mit je einem Frame.
Schon mal richtig geraten - es geht um einen Mehrfensterbrowser.

Leider habe ich folgendes Problem:
häufig - jedoch nicht immer - bekomme ich, nachdem ich einen Reiter geschlossen habe - Zugriffsverletzungen, sobald ich irgendwo hinins Hauptfenster klicke.

Ich verwende folgenden Code zum Erstellen einer TabSeite:
Delphi-Quellcode:
procedure Tfm.abAddBrowserWindowExecute;
var sheet:tTabSheet; browser:tWebBrowser;
    f:TfBrowser; // die Instanz des Frames
    item:tTreeNode;
begin
  sheet:=TTabSheet.Create(fm); // fm=Hauptformular (FormMain)
  sheet.PageControl:=pcBrowser;
  pcBrowser.ActivePage:=sheet;

  f:=TfBrowser.create(sheet);
  f.Parent:=sheet;
  f.Align:=alClient;
  with f.Browser do begin
    OnTitleChange:=TitleChange;
    OnBeforeNavigate2:=BeforeNavigate;
    OnDownloadBegin:=DownloadBegin;
    OnDownloadComplete:=DownloadComplete;
    OnNewWindow2:=NewWindow;
    OnProgressChange:=ProgressChange;
    if cbNewBrowserIsOffline.checked then Offline:=true
  end;
  // Eintrag in Übersichtsliste für die Seite
  item:=tvBrowserSheets.Items.AddNode(nil,nil,'',nil,naAdd);
end;
Zum Schließen des Tabs habe ich Folgendes fabriziert:
Delphi-Quellcode:
procedure CloseBrowserWindow(index:integer);
var pc:tTabSheet; f:tfBrowser;
begin with fm do try
  pc:=pcBrowser.Pages[index];
  if index=pcBrowser.PageCount-1 then pcBrowser.ActivePageIndex:=index-1;
  f:=(pc.Controls[0] as tfBrowser);
  f.Free;
  pc.Free;
  pcBrowser.Visible:=pcBrowser.PageCount>0;
  tvBrowserSheets.Items.Delete(tvBrowserSheets.Items[index]); // Listeneintrag dazu löschen
except halt
end end;
Ich nehme stark an, daß ich da einen Fehler mit dem Erzeugen/Freigeben gemacht habe. Findet jemand den Fehler? Ich habe zum Test mal das f.Free hier oben weg gemacht (da ja ein Owner bei seiner Auflösung dafür sorgt, daß seine "Kinder" auch gelöscht werden), aber da kams immer noch.

Gruß an die Frau

Thunderchild 6. Apr 2004 16:39

Re: Problem mit dynamischem Erstellen und Freigeben
 
Ich habe noch weiter getestet. Mittlerweile konnte ich das Problem (hoffentlich) etwas eingrenzen; sobald ich das TabControl verlasse (also ein anderes Control den Fokus bekommt), erhalte ich die Zugriffsverletzung.
So langsam glaube ich, es hat mit der angezeigten Seite zu tun. Als Beispiel www.ebay.de; hier kommt der Fehler. Aber auf anderen Seiten kommt er nicht.

Ich habe bei anderen Threads, wo es um tWebBrowser ging, immer wieder das OLEDocument im Code gesehen. Muß ich darüber den WebBrowser freigeben, nicht über free?

Außerdem: woran erkenne ich, daß das Browserfenster von der angezeigten Seite geschlossen würd, zum Beispiel ein PopUp, das sich per Javascript schließt? Ein OnClose gibt es nämlich nicht.


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