Если не ошибаюсь, так - реализовывать абстрактные методы-события.
## Код:
```
MODULE TestWeb;

   IMPORT
      Web := CtlSHDocVw, CtlT, StdLog;

   TYPE
      BrowserEvents = POINTER TO RECORD (Web.DWebBrowserEvents2) END;

   VAR
      w: Web.WebBrowser;
      wEvents: BrowserEvents;

   PROCEDURE (this: BrowserEvents) StatusTextChange* (Text: ARRAY OF CHAR);
   BEGIN
       StdLog.String("Statusbar text changed to " + ' "' + Text + '"');
      StdLog.Ln;
    END StatusTextChange;

   PROCEDURE (this: BrowserEvents) ProgressChange* (Progress: INTEGER; ProgressMax: INTEGER), EMPTY;
... - все абстр. методы д.б. реализованы
   PROCEDURE (this: BrowserEvents) PrivacyImpactedStateChange* (bImpacted: BOOLEAN), EMPTY;

   PROCEDURE (this: BrowserEvents) NewWindow3* (VAR ppDisp: CtlT.Object; VAR Cancel: BOOLEAN; dwFlags: INTEGER; bstrUrlContext: ARRAY OF CHAR; bstrUrl: ARRAY OF CHAR);
      (* A new, hidden, non-navigated WebBrowser window is needed. *)
   BEGIN
      StdLog.String("(NewWindow3): New WebBrowser is needed. ");
      StdLog.String("Flags = "); StdLog.Int(dwFlags);
      StdLog.String(', UrlContext = "' + bstrUrlContext + '"');
      StdLog.String(', Url = "' + bstrUrl + '"');
      StdLog.Ln;
   END NewWindow3;

   PROCEDURE Do*;
   BEGIN
      w.PUTVisible(TRUE);
      w.Navigate("http://oberoncore.ru/", NIL, NIL, NIL, NIL);
   END Do;

   PROCEDURE T1*;
   BEGIN
      w := Web.NewInternetExplorer();
      NEW(wEvents);
      CtlT.Connect(wEvents, w);
   END T1;

CLOSE
   CtlT.Disconnect(wEvents, w)
END TestWeb.
^Q TestWeb.T1
^Q TestWeb.Do
```
