2013-07-03 2 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' например ['this way'] (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; 
Смежные вопросы