Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Pascal->TWebBrowser->Uvolňování RAM paměti

Dobrý den,
vytvářím webový prohlížeč v Turbo Delphi. Dynamicky vytvářím nové listy, na kterých se dynamicky vytvářejí komponenty TWebBrowser. Neuvolňuje se mi však po zavření listu RAM paměť.

Po vykonání TWebBrowser(FindComponent('WebBrowser'+inttostr(de letedpage))).Free; se neuvolní skoro žádná paměť.

Předpokládám tedy, že musím nejdříve smazat načtený obsah komponenty TWebBrowser a pak teprve uvolnit samotnou komponentu.

Nějaký nápad?

Děkuji

(Pro zajímavost: Po vytvoření sto dynamických listů (+WebBrowserů) s načtením stránky Google.cz program využívá okolo 500MB RAM paměti. Po provedení Free včech komponent TWebBrowser klesne využití RAM paměti asi o 5MB)

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
No, celého si ma tak trošku "domotal". (Sám som sa domotal.. :-)) Z toho čo som pochopil tak máš hl…
pme 09.02.2012 21:05
pme
Aha, ty uvolňuješ obě komponenty. Stačí přeci jenom TTabSheet ne? TWebBrowser se uvolní s ním.
Telever 09.02.2012 22:00
Telever
Skús môj uvedený kód vyššie s uvoľňovaním TTabSheet +TWebBrowser (ja som si ho samozrejme najprv vys…
pme 10.02.2012 07:38
pme
apsal jsem program v Delphi XE //Create procedure TForm1.Button3Click(Sender: TObject); var WB:TWeb… poslední
Telever 23.02.2012 18:44
Telever

No, celého si ma tak trošku "domotal". (Sám som sa domotal.. :-))

Z toho čo som pochopil tak máš hlavný Formulár a na ňom PageControl, v ktorom potom dynamicky vytváraš listy (Tabsheet) a v nich následne TWebBrowser.
Čiže ja by som to riešil asi nasledovne:
1. Vytvoril by som proceduru, kde by sa dynamicky vytvárali TabSheet+WebBrowser:

procedure MainForm.CreateTabBrowser;
var
  ts: TTabSheet;
  WB: TWebbrowser;
begin
  // Vytvoriť nový TabSheet
  ts := TTabSheet.Create(PageControl);
  try
    // Priradiť vlastnosti TTabSheet 
    ts.PageControl := PageControl;
    ts.Parent := PageControl;
    if PageControl1.ActivePageIndex > 0 then ts.PageIndex := PageControl1.ActivePageIndex + 1
    else ts.PageIndex := 0;
  
    // Vytvoriť inštanciu TWebbrowser 
    WB := TWebbrowser.Create(ts);

    // vložiť TWebbrowser na TTabSheet
    TControl(WB).Parent := ts;
    // alebo:   Ts.InsertControl(WB);

    // Priradiť vlastnosti Webbrowser 
    WB.Align := alClient;
    WB.Silent := True;
    WB.Visible := True;

    PageControl.ActivePage := ts;
    WB.Navigate(sURL);
  except
    ts.Free;
  end;
end;

2. potom by som si vytvoril procedúru, kde by som zatváral napr. aktívny list aj s následným zrušením WebBrowsera:

procedure mainForm.CloseTab(Sender: TObject);
begin
  if PageControl.ActivePage.Controls[0] is TWebbrowser then
  begin
    (TWebbrowser(PageControl.ActivePage.Controls[0])).Free;
     PageControl.ActivePage.Free;
  end;
end;

apsal jsem program v Delphi XE

//Create
procedure TForm1.Button3Click(Sender: TObject);
var
  WB:TWebBrowser;
begin
   WB:=TWebbrowser.Create(Nil);
   TControl(WB).Parent:=form1;
   WB.Align:=alClient;
   WB.Silent:=True;
   WB.Visible:=True;
end;
//Navigate
procedure TForm1.Button1Click(Sender: TObject);
begin
  (Form1.Controls[form1.ControlCount-1] as TWebBrowser).navigate('google.com');
end;
//Free
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Controls[form1.ControlCount-1].Free;
end;

Po ukončení se však uvolní jen 2MB. Nemůže to být ještě něčím jiným ve Windows?

Zpět do poradny Odpovědět na původní otázku Nahoru