delphi - 在运行时创建表单和 WebBrowser
问题描述
我正在使用 Delphi 7 并尝试在运行时创建一个WebBrowser
内部 a Form
,但无法使其工作。这是代码:
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 没有响应。我得到一个白屏,没有错误消息。
请问,我错过了什么?谢谢!
解决方案
您正在使用其ShowModal()
方法显示表单,该方法是一个同步(也称为阻塞)函数,在表单关闭之前不会退出。Navigate()
因此,当表单打开时,您永远不会拨打电话。
你有两个选择:
- 使用
Show()
而不是ShowModal()
.Show()
指示 Form 显示自身,然后立即退出,允许后续代码在 Form 打开时运行。因此,您将不得不摆脱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()
到表单OnShow
或OnActivate
事件中,例如:
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;
推荐阅读
- reactjs - 无法将状态中的数据渲染到 React 组件中
- lua - 无法更改为之前的 io 输入
- typescript - 联合类型不能作为“几种类型之一”
- python - Python数据框:添加当另一列更改时递增的列
- php - How to solve the problem of dynamic rowspan problem in table in laravel
- inno-setup - Using scripting constant in DirExistsWarning and other directives
- php - 在centos7中使用nginx + php-fpm安装nextcloud中所有这些semanage规则的目的是什么?
- shell - awk 通过 awk 命令传递 shell 变量
- angular - 在 Angular 6 组件错误中声明模型
- oracle - ORA-01036: Oracle 18 和 Oracle 19 Windows 客户端的非法变量名称/编号