2009-12-07 2 views
0

Я использую этот кодTEventObject & IE вкладки дает фатальная ошибка

try 
    document := (pDisp as IWebbrowser2).Document AS IHTMLDocument2; 
    Body := Document.body; 
    Links := Document.links; 
    for i := 0 to (Links.length-1) do 
    begin 
     tmp := (Links.item(i, 0) as IHTMLElement); 
     tmp.onclick := TEventObject.Create(MyProcedure) as IDispatch; // THIS LINE 
    end; 
    except 
    on E : Exception do 
     ShowMessage(E.ClassName+' error raised, with message : '+E.Message); 
    end; 

В случае DocumentComplete в качестве веб-браузера IE, он работает нормально, но когда я открываю новую вкладку Я получаю Microsoft Internet Explorer обнаружена проблема и нужно закрыть»ошибку.

линия помеченный // эту строку в приведенном выше коде тот, который вызывает его (я заметил это, и это не показывало ошибку).

Остальная часть кода:

TEventObject = class(TInterfacedObject, IDispatch) 
    private 
    FOnEvent: TProcedure; 
    protected 
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall; 
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; 
    function GetIDsOfNames(const IID: TGUID; Names: Pointer; 
     NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; 
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; 
     Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; 
    public 
    constructor Create(const OnEvent: TProcedure); 
    property OnEvent: TProcedure read FOnEvent write FOnEvent; 
    end; 


........... 

constructor TEventObject.Create(const OnEvent: TProcedure); 
begin 
    inherited Create; 
    FOnEvent := OnEvent; 
end; 

function TEventObject.GetIDsOfNames(const IID: TGUID; Names: Pointer; 
    NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; 
begin 
    Result := E_NOTIMPL; 
end; 

function TEventObject.GetTypeInfo(Index, LocaleID: Integer; 
    out TypeInfo): HResult; 
begin 
    Result := E_NOTIMPL; 
end; 

function TEventObject.GetTypeInfoCount(out Count: Integer): HResult; 
begin 
    Result := E_NOTIMPL; 
end; 

function TEventObject.Invoke(DispID: Integer; const IID: TGUID; 
    LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, 
    ArgErr: Pointer): HResult; 
begin 
    if (Dispid = DISPID_VALUE) then 
    begin 
    if Assigned(FOnEvent) then 
     FOnEvent; 
    Result := S_OK; 
    end 
    else Result := E_NOTIMPL; 
end; 

Как я могу заставить его работать с вкладками?

ответ

1

Я нашел обходной путь:

URL := AnsiLowerCase(URL); 
    if (URL='') or (URL='about:blank') or (URL='about:tabs') then Exit; 

В кликах работает нормально на других страницах, которые не касаются: вкладки.

Смежные вопросы