Delphi XE3 и Crystal Reports

Некоторое время назад (фактически, почти 5 лет назад) здесь был опубликован пример, показывающий метод отображения Crystal Reports в Delphi 2007 с использованием средства просмотра отчетов ActiveX. Я обнаружил, что он также работает в Delphi XE3. Фрагмент, по которому у меня есть вопрос, выглядит следующим образом:

for i := 1 to oRpt.Database.Tables.Count do begin
oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'username';
oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'password';
end;

Мой вопрос: поскольку oRpt является вариантом, а не типизированным, как мне найти свойства средства просмотра отчетов и установить их значения внутри процедуры, которая отображает или печатает отчет?


person bcorll    schedule 20.02.2013    source источник


Ответы (1)


Прочтите документацию. :-)

Есть два способа подключиться к серверу ActiveX: во время компиляции (раннее связывание) или во время выполнения (позднее связывание). Там [статья на MSDN более подробно объясняется.

Раннее связывание - это то, что используется при использовании типизированных переменных (например, при использовании TWordApplication или TExcelApplication из палитры компонентов). Библиотека типов используется для определения поддерживаемых типов и интерфейсов, а методы можно найти с помощью DispInterface из v-таблицы; затем компилятор может проверить, существуют ли функции, проверить на наличие опечаток и тому подобное, а также выяснить, что доступно для завершения кода и анализа кода).

Доступ к серверу ActiveX в качестве варианта (как показывает фрагмент кода) - late binding. Компилятору ничего не известно до тех пор, пока код не будет на самом деле выполнен, после чего предпринимаются попытки вызвать методы через интерфейс IDispatch, и в этот момент он либо завершается успешно, либо терпит неудачу. Поскольку компилятор ничего не знает о том, что может содержать ваш вариант, во время разработки или компиляции невозможно узнать, какие методы и типы доступны.

Поскольку ваш код использует позднее связывание, нет никакого способа узнать, какие свойства могут быть доступны, кроме чтения документации (или, конечно, методом проб и ошибок, что на самом деле не вариант). (Другой альтернативой является использование раннего связывания, если для сервера ActiveX доступна библиотека типов, после чего вы прекращаете использовать вариант и переключаетесь на интерфейс, который компилятор может использовать для определения того, что вам доступно.)

person Ken White    schedule 20.02.2013
comment
Спасибо, Кен. Я бы RTFM, если бы нашел! - person bcorll; 21.02.2013