본문 바로가기

프로그래밍/Chromium(CEF4Delphi)

[Chromium] CEF4Delphi - 웹브라우저 컨테이너 폼 Closing Process

Chromium 웹브라우저를 임베딩한 VCL Form의 Closeing 절차

개요 

  TChromium 또는 TCEFWindowParent가 올려진 TForm에 대해 다음 절차로 Closeing 처리를 해 주어야 함

처리방법

폼에 전역변수 선언

    FCanClose : boolean;  // TChromium.OnBeforeClosed 에서 TRUE로 세팅
    FClosing  : boolean;  // TForm.OnClose에서 TRUE로 세팅

1. TForm.OnCloseQuery 이벤트 핸들러에서 폼이 Closing되기 전에 Chromium.CloseBrowser(true)를 호출하고 CanClose=false로 처리하여 TChromium이 해제되기 전에 폼이 해제 되는 것을 방지

 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := FCanClose;

  if not(FClosing) then
    begin
      FClosing := True;
      Visible  := False;
      Chromium1.CloseBrowser(True);
    end;
end;

 

2. Chromium.OnClose 이벤트 핸들러에서 TCEFCEFWindowParent.Free 호출하고,  TChromium.OnBeforeClose를 발생 시킴

 


procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
...

procedure TForm1.BrowserDestroyMsg(var aMessage : TMessage);
begin
  CEFWindowParent1.Free;
end;
...

procedure TForm1.Chromium1Close(Sender: TObject;
  const browser: ICefBrowser; var aAction : TCefCloseBrowserAction);
begin
  PostMessage(Handle, CEF_DESTROY, 0, 0);
  aAction := cbaDelay;
end;

 

3. TChromium.OnBeforeClose 이벤트 핸들러에서 TForm에게 WM_CLOSE 메시지 또는 Form.Close 재호출 처리

 

procedure TForm1.Chromium1BeforeClose(Sender: TObject;
  const browser: ICefBrowser);
begin
  FCanClose := True;
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;