在运行时创建表单和 WebBrowser

Posted

技术标签:

【中文标题】在运行时创建表单和 WebBrowser【英文标题】:Create Form and WebBrowser at runtime 【发布时间】:2020-11-13 19:01:27 【问题描述】:

我正在使用 Delphi 7 并尝试在运行时在 Form 内创建 WebBrowser,但无法使其工作。代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm;
  Brws: TWebBrowser;
begin
  Form := TForm.Create(nil);
  try
    Form.Width := 500;
    Form.Height := 500;
    Form.BorderStyle := bsDialog;
    Form.Position := poScreenCenter;
    Form.Caption := 'Select the Option';
    Brws := TWebBrowser.Create(Form);
    Brws.ParentWindow := Form.Handle;
    TWinControl(Brws).Parent := Form;
    Brws.Align := alClient;
    Brws.AddressBar := False;
    Brws.MenuBar := False;
    Brws.StatusBar := False;
    Application.ProcessMessages;
    if Form.ShowModal = mrOk then
      Brws.Navigate('https://www.google.com');
  finally
    Form.Free;
  end;
end;

结果就像 WebBrowser 没有响应。我得到一个白屏并且没有错误消息。

请问,我错过了什么?谢谢!

【问题讨论】:

表单以Form.ShowModal 显示,并一直等到它关闭才能在您的代码中继续,这样您就不会在表单可见时导航到任何地方。 【参考方案1】:

您正在使用其ShowModal() 方法显示表单,该方法是一个同步(也称为阻塞)函数,在表单关闭之前不会退出。因此,当表单打开时,您永远无法拨打Navigate() 的电话。

你有两个选择:

使用Show() 而不是ShowModal()Show() 向表单发出信号以显示自身,然后立即退出,从而允许后续代码在表单打开时运行。因此,您将不得不摆脱try...finally,而是使用表单的OnClose 事件在表单关闭时释放它,例如:
procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm;
  Brws: TWebBrowser;
begin
  Form := TForm.Create(Self);
  Form.Width := 500;
  Form.Height := 500;
  Form.BorderStyle := bsDialog;
  Form.Position := poScreenCenter;
  Form.Caption := 'Select the Option';
  Form.OnClose := BrowserFormClosed;

  Brws := TWebBrowser.Create(Form);
  TWinControl(Brws).Parent := Form;
  Brws.Align := alClient;
  Brws.AddressBar := False;
  Brws.MenuBar := False;
  Brws.StatusBar := False;

  Form.Show;
  Brws.Navigate('https://www.google.com');
end;

procedure TForm1.BrowserFormClosed(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;
否则,如果您想继续使用ShowModal(),请将对Navigate() 的调用移至Form 的OnShowOnActivate 事件中,例如:
procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm;
  Brws: TWebBrowser;
begin
  Form := TForm.Create(nil);
  try
    Form.Width := 500;
    Form.Height := 500;
    Form.BorderStyle := bsDialog;
    Form.Position := poScreenCenter;
    Form.Caption := 'Select the Option';
    Form.OnShow := BrowserFormShown;

    Brws := TWebBrowser.Create(Form);
    TWinControl(Brws).Parent := Form;
    Brws.Align := alClient;
    Brws.AddressBar := False;
    Brws.MenuBar := False;
    Brws.StatusBar := False;

    Form.ShowModal;
  finally
    Form.Free;
  end;
end;

procedure TForm1.BrowserFormShown(Sender: TObject);
var
  Form: TForm;
  Brws: TWebBrowser;
begin
  Form := TForm(Sender);
  Brws := TWebBrowser(Form.Components[0]);
  Brws.Navigate('https://www.google.com');
end;

【讨论】:

以上是关于在运行时创建表单和 WebBrowser的主要内容,如果未能解决你的问题,请参考以下文章

如何在winforms应用程序启动时运行两个表单?

保存在运行时创建的标签

Qt使用UI表单创建自定义小部件[关闭]

Django 和 ajax 形式。表单运行,但我没有收到确认消息

如何在运行时使用 VBA 将按钮添加到 MS Access 表单并将代码添加到 _Click() 事件

我想在更改时保存表单,并使用 laravel 和 Jquery 创建一个动态表单