C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ActivX, вызвать метод
Лена
Отправлено: 07.03.2007, 20:56


Мастер участка

Группа: Участник
Сообщений: 501



В h файле:
#include "MSACAL_TLB.h"
//в "MSACAL_TLB.h" определение для ActiveX (календарь) который находиться по адресу
C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX

//далее в форме
private:
TCOMICalendar * Calendar; //MSACAL_TLB.h

Посмотрев библиотеку типов этого календаря, вижу наличие в нем метода AboutBox();

Загружаю календарь в OleContainer:
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// MSCAL.Calendar.7 имя класса календаря
OleContainer1->CreateObject("MSCAL.Calendar.7",false);
OleContainer1->DoVerb(ovShow);
}


Хочу вызвать при нажатии кнопки метод AboutBox. Почему нельзя вызвать таким способом?
CODE

void __fastcall TForm1::OleContainer1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{

Calendar->AboutBox(); //ошибка!

}


Отредактировано Лена — 08.03.2007, 09:03

Присоединить изображение

Присоединить изображение

Admin
Отправлено: 07.03.2007, 21:57


Владимир

Группа: Администратор
Сообщений: 1190



Скорее всего как то не так добавляете.
Если установить этот компонент на вкладке ActiveX
и перенести на форму то всё работает.

Project — ImportTypeLibrary — далее Add и Install (MicrosoftCalendar Control)
и на вкладке ActiveX появляется этот компонент.
Бросаете его на форму и появляется на форме
компонент Calendar1 TCalendar;

Calendar1->AboutBox(); // работает
Лена
Отправлено: 08.03.2007, 09:12


Мастер участка

Группа: Участник
Сообщений: 501



Мне хочется добавить календарь программно, поэтому я делаю так:
Project — ImportTypeLibrary и далее Create Unit. Добовляю #include "MSACAL_TLB.h"
Проблема в том, что я не знаю как создать теперь Calendar используя объявления из "MSACAL_TLB.h"? Инициализировав программно Calendar я смогу сделать Calendar->AboutBox();

Согласно теории думала так:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Calendar = Msacal_tlb::CoCalendar::Create();
}

Однако в библиотеке типов MSACAL_TLB.h нет объявления ATL для метода Create. Вопрос как правильно инициализировать Calendar для вызова, например, метода Сalendar->AboutBox(); //?


Отредактировано Лена — 08.03.2007, 09:46
Admin
Отправлено: 08.03.2007, 12:21


Владимир

Группа: Администратор
Сообщений: 1190



Давно ничего с Tlb не делал, но разве в этом случае это реализуется
не через что-то подобное:

CODE


ICalendar *pICal;
if(SUCCEEDED(pCalendar->QueryInterface(IID_ICalendar, (void**)&pICal))){ // получить интерфейс

     ...   // как-то использовать
      pICal->Release(); // освободить
      }

Лена
Отправлено: 09.03.2007, 10:16


Мастер участка

Группа: Участник
Сообщений: 501



Большое спасибо! Все понятно. Как раз читаю книгу по COM (Трельсона http://www.bhv.ru/books/full_contents.php?id=406).
Вот еще есть способ:
Если руками добавить в файл MSACAL_TLB.h после:
CODE

typedef TCOMICalendarT<ICalendar> TCOMICalendar;
объявление:
************************************************** *******************//
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass : Calendar
// Interface: TCOMICalendar
// ************************************************** *******************//
typedef TCoClassCreatorT <TCOMICalendar, ICalendar, &CLSID_Calendar, &IID_ICalendar> CoCalendar;


то должно работать и Create. Очевидно в Builder не корректно работает Project->Import Type Library

Admin, у ваc есть эта книга?: http://www.semga.ru/ob/book_1534332.html


P.S.
(вместо # надо скобки шаблона поставить. Почему-то форум не отображает текст между ними если поставить их в тексте сообщения)
Admin
Отправлено: 09.03.2007, 12:13


Владимир

Группа: Администратор
Сообщений: 1190



Книга есть(в виде книги, не в электронном виде) и к ней диск есть.
Заключайте код в теги CODE и код должен отображаться корректно.

А удалось AboutBox заставить заработать ?
Лена
Отправлено: 09.03.2007, 18:38


Мастер участка

Группа: Участник
Сообщений: 501



QUOTE (Admin @ 09.03.2007, 12:13)
Книга есть
А удалось AboutBox заставить заработать ?

Да, спасибо, с AboutBox все ОК! smile.gif
По поводу книги:
Дело в том, что в этой книге на странице 659 описано как можно обрабатывать события, которые происходят в ActiveX. Например, в тестируемом ActiveX (календарь C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX) в интерфейсе DCalendarEvents есть события с именем Click, NewYear и др. Пример описанный в книге показывает, как клиент может принимать и обрабатывать события, которые происходят в ActivX-е. Для этого используется так называемый сток событий на основе класса TEventDispatcher и метода InvokeEvent (стр.665). Мне никак не удается переделать этот пример, чтобы обработать, например событие Click календаря. Я в технологии COM уже не много ориентируюсь, многое получается, а вот принять событие в клиенте от ActiveX-а никак не получается. sad.gif Если будет время гляньте тот пример и подскажите реализацию стока для Click из MSCAL.OCX. Очень хочется с COM разобраться. smile.gif
Лена
Отправлено: 12.03.2007, 10:21


Мастер участка

Группа: Участник
Сообщений: 501



C уроком разобралась. yahoo.gif

Вернуться в Вопросы программирования в C++Builder