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