Изменить:
Не обращайте внимания на этот ответ. Оставив его в образовательных целях.
Почему актерский состав IAdviseSink(Self)
?
Если вы объявили интерфейс в объявлении класса формы:
TForm1 = class(TForm, IAdviseSink)
...
end;
, ты не должен был.
Тот факт, что вы используете приведение (и жесткое приведение, которое просто говорит компилятору замолчать), может указывать на то, что вы этого не сделали. И это может привести к тому, что механизм диспетчеризации обнаружит, что ваша форма не реализует IAdviseSink и, следовательно, не имеет ничего для вызова метода OnSave.
Объяснение, почему вышеупомянутое не является проблемой:
Я не понял комментария Сертака «Но тогда код не скомпилируется». Он имел в виду, что IAdviseSink
не является частью объявления класса формы, строка
doc_ole_obj.Advise(IAdviseSink(Self), Connection);
может вызвать [Ошибка DCC] Unit1.pas (41): E2010 Несовместимые типы: 'IAdviseSink' и 'TForm1'
* * * * * * * * * * * * * * * * IAdviseSink(Self)
, очевидно, не является простым жестким приведением типа TForm(SomePointer)
, который в основном говорит компилятору замолчать и рассматривать SomePointer как TForm. Затем приведение интерфейса побуждает компилятор проверить, поддерживает ли приведенный экземпляр интерфейс. Не знал этого. Узнайте что-то новое каждый день.