Данная задача уже была рассмотрена в статье «Работа с объектами базы данных Access через Ole Automation на примере открытия отчёта». Однако там был приведён пример реализации на Delphi.
В C++ Builder работа с COM, в частности c Ole Automation, имеет некоторые особенности, вследствие которых для решения этой и подобных задач требуется несколько иной подход. Поэтому в этой статье рассматриваются в первую очередь особенности реализации в С++ Builder. Сама постановка задачи и её решение более подробно изложены в статье указанной выше.
В отличие от Delphi и ряда других языков программирования, включая диалекты языка C++, в C++Builder нет прямого доступа к свойствам и методам OLE объекта. Вместо этого все операции с ними выполняются посредством набора из 4х функций, которым имена свойств и методов передаются в виде строковых параметров..
- OlePropertyGet – получить свойство OLE объекта;
- OlePropertySet – задать свойство OLE объекта;
- OleProcedure – для обращения к OLE процедурам;
- OleFunction – для обращения к OLE функциям.
Поэтому если подключение к COM серверу в C++ Builder происходит ещё относительно «привычным» способом.
Variant Access; Access = CreateOleObject("Access.Application");
То для установки свойства Visible уже требуется использовать OlePropertySet.
Access.OlePropertySet("Visible", true);
Аналогичная ситуация при открытии базы данных (БД).
Access.OleFunction("OpenCurrentDatabase", WideString("C\\db.mdb"), true);
Однако, обратиться подобным образом к методу OpenReport класса DoCmd уже невозможно вследствие уже упомянутого отсутствия прямого доступа.
Поэтому, прежде чем открыть отчёт необходимо получить доступ к объекту DoCmd с помощью функции OlePropertyGet.
Variant DoCmd; DoCmd = Access.OlePropertyGet("DoCmd");
Только теперь, когда доступ к DoCmd получен можно открыть отчёт.
DoCmd.OleFunction("OpenReport", WideString("report1"), 2, 1, 1, 3, 1);
Здесь параметры для метода OpenReport также заданы таким образом, чтобы отчёт отобразился в виде формы для просмотра перед печатью.