2

以下代码给了我几个错误,其中两个是:

  • [错误] Unit1.pas(28):未声明的标识符:'WebBrowser1NavigateComplete2'
  • [错误] Unit1.pas(34):未声明的标识符:'WebBrowser1DocumentComplete'

我想知道它们是否没有在“使用”部分中声明。有谁知道为什么它不会编译。我从 Delphi Help 获得了代码。

也不会出现“消息框”或完成的“哔”声。

unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, OleCtrls, SHDocVw, StdCtrls, MSHTML, activex;

type
    TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
    Form1: TForm1;
    CurDispatch: IDispatch; {save the interface globally }

implementation

{$R *.dfm}
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
    if CurDispatch = nil then
    CurDispatch := pDisp; { save for comparison }
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
if (pDisp = CurDispatch) then
    begin
        Beep; {the document is loaded, not just a frame }
        showmessage('download complete');
        CurDispatch := nil; {clear the global variable }
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    WebBrowser1.Navigate('www.google.com');
end;

end.
4

2 回答 2

5

问题是,您没有声明方法。

type
    TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
    // missing declarations
    procedure WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
private
    { Private declarations }
public
    { Public declarations }
end;

似乎您只是从其他地方复制'粘贴方法:o)


手动分配事件处理程序

出于测试目的,我有一个带有单个TWebBrowser组件的简单表单,并且我编写了 2 个方法WebBrowser1DocumentCompleteHandmadeDocumentComplete.

表单代码如下所示

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
  TForm1 = class( TForm )
    WebBrowser1 : TWebBrowser;
    procedure WebBrowser1DocumentComplete( ASender : TObject; const pDisp : IDispatch; const URL : OleVariant );
    procedure HandmadeDocumentComplete( ASender : TObject; const pDisp : IDispatch; const URL : OleVariant );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.HandmadeDocumentComplete( ASender : TObject; const pDisp : IDispatch; const URL : OleVariant );
begin
  // Do something
end;

procedure TForm1.WebBrowser1DocumentComplete( ASender : TObject; const pDisp : IDispatch; const URL : OleVariant );
begin
  // Do something
end;

end.

现在看看 ObjectInspectorWebBrowser1

对象检查器

每个与事件处理程序属性匹配的已发布方法都将显示在组合框中,并且可以选择。

或者您可以通过代码分配方法

procedure TForm1.FormCreate( Sender : TObject );
begin
  // WebBrowser1.OnDocumentComplete := WebBrowser1DocumentComplete;
  WebBrowser1.OnDocumentComplete := HandmadeDocumentComplete;
end;
于 2013-07-30T07:07:58.087 回答
1

此代码正在运行。在 Xe³ 下测试。 http://i.stack.imgur.com/y3WdX.png

在此处输入图像描述

这是您的代码和我的编译代码之间的差异。

http://i.stack.imgur.com/sRITO.png

在此处输入图像描述

您必须将TWebBrowser视觉组件放置到您的表单中。

http://i.stack.imgur.com/t1CBY.png

在此处输入图像描述

在此处输入图像描述

于 2013-07-30T06:45:26.857 回答