2013-07-03 19 views
2

如果我用下面的部件的形式WebBrowser1: TMyWebBrowser;上,如果我把表格OnDocumentComplete = WebBrowser1DocumentComplete上,該TMyWebBrowser.DocumentComplete不能使用,即使WebBrowser1DocumentComplete程序是虛火。OnDocumentComplete不會觸發組件

我可以觸發TMyWebBrowser.DocumentComplete的唯一方法是有OnDocumentComplete = nil

有人可以解釋我爲什麼? 感謝 山姆

type 
    TMyWebBrowser = class(TWebBrowser) 
    private 
    { Private declarations } 
    protected 
    { Protected declarations } 
    procedure DocumentComplete(ASender: TObject; 
     const pDisp: IDispatch; var URL: OleVariant); 
    public 
    { Public declarations } 
    Completed: Boolean; 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    procedure NavigateUntilCompleted(URL: String); 
    published 
    { Published declarations } 
    End; 

procedure Register; 

implementation 


procedure Register; 
begin 
    RegisterComponents('Sam', [TMyWebBrowser]); 
end; 

constructor TMyWebBrowser.Create(AOwner: TComponent); 
begin 
    inherited; 
    onDocumentComplete := DocumentComplete; 
end; 

procedure TMyWebBrowser.DocumentComplete(ASender: TObject; 
     const pDisp: IDispatch; var URL: OleVariant); 
    begin 
     // check that the event is raised for the top-level browser (not frames or iframes) 
     if pDisp = TMyWebBrowser(ASender).ControlInterface then 
     begin 
     Completed := TRUE; 
     end; 
     inherited; 
    end; 
+1

OT檢查:我會親自重寫'InvokeEvent'方法例如['這種方式'](http://pastebin.com/m8HMzgtX)。 – TLama

回答

0

您可以一種以上的方法不分配到一個事件,但你嘗試分配2和覆蓋的第一個。

類定義

constructor TMyWebBrowser.Create(AOwner: TComponent); 
begin 
    inherited; 
    // set OnDocumentComplete event 
    onDocumentComplete := DocumentComplete; 
end; 

,並在你的代碼

var 
    LMyWebBrowser : TMyWebBrowser; 
begin 
    LMyWebBrowser := TMyWebBrowser.Create(nil); 
    // now overwriting the value set by constructor 
    LMyWebBrowser.onDocumentComplete := WebBrowser1Complete; 
end; 

你可以自己用

var 
    LMyWebBrowser : TMyWebBrowser; 
begin 
    LMyWebBrowser := TMyWebBrowser.Create(nil); 
    // check 
    if Assigned(LMyWebBrowser.OnDocumentComplete) then 
    ShowMessage('OnDocumentComplete is already set!'); 
end;