When form was shut, it will bring out error.
Posted: Wed Jul 03, 2019 2:41 pm
If I didn't use sleep(1000) in FormClose procedure. When form was shut, it will bring out 'violation error'.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure TIinformSearchFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
FVisitor := TCefFastCookieVisitor.Create(CookieVisitorProc)//获取cookies
end;
procedure TIinformSearchFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//showmessage('');
sleep(1000) ;
Action := caFree;
end;
procedure TIinformSearchFrm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TIinformSearchFrm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction);
begin
if (browser <> nil) and (Chromium1.BrowserId = browser.Identifier) then
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
aAction := cbaDelay;
end;
end;
procedure TIinformSearchFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TIinformSearchFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
if (Chromium1.BrowserId = 0) then // The main browser is being destroyed
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
end;