## Код:
```
IMPORT
      Excel := CtlExcel9, CtlT, OleViews, StdLog, Views,
      TextMappers, TextModels, TextViews, Dialog, WinOle;
      
VAR
      value: REAL;
      cell: CtlT.Any;
      sheet: Excel.Worksheet;
      range: Excel.Range;
      book: Excel.Workbook;
      view: Views.View;


   PROCEDURE RunExcel*;
   BEGIN
      view := OleViews.NewObjectView("Excel.Sheet");
      IF view # NIL THEN
         book := Excel.This_Workbook(OleViews.AutoObject(view));
         sheet := Excel.This_Worksheet(book.Worksheets().Item(CtlT.Int(1)));
         range := sheet.Range(CtlT.Str("A1"), NIL);
         range.PUTFormula(CtlT.Str("...ссылка на DDE-сервер"))
      END;
   END RunExcel;      
   
   PROCEDURE GetValue*;
   BEGIN
      cell := sheet.Range(CtlT.Str("A1"), CtlT.Str("A1")).Value();
      value := cell(CtlT.RealT).val
   END GetValue;
```


процедура RunExcel создает ячейку Excel и приконнекчивает ее к DDE-серверу, а GetValue считывает значение из этой ячейки. Все работает. Но я ни как не могу разобраться: как отследить, что значение ячейки изменилось...

в модуле (Ctl)Excel9 есть такие конструкции:
## Код:
```
WorkbookEvents* = POINTER TO ABSTRACT RECORD (CtlT.OutObject) END;

PROCEDURE (this: WorkbookEvents) SheetChange* (Sh: CtlT.Object; Target: Range), NEW, ABSTRACT;

PROCEDURE (this: WorkbookEvents) Invoke* (id, n: INTEGER; VAR par: CtlT.ParList; VAR ret: CtlT.Variant);
   BEGIN
      CASE id OF
      ...............................
      
      | 1564: ASSERT(n = 2, 11); this.SheetChange(CtlC.VarObj(par[1]), ThisRange(CtlC.VarAny(par[0])))
      
      ...............................
      END
   END Invoke;
```


вот не могу понять как мне прикрутить/связать SheetChange к/с GetValue

ЗЫ: Я уже задавал подобный вопрос, был "отослан" к книжкам по COM и в MSDNКниги, какие нашел, читал, по M$ лазил, но так и не разобрался с обратным вызовом