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

 Здравствуйте, гость ( Вход | Регистрация )   Скачать форум | Поиск по Форуму | Участники | Помощь
 Поиск по:   сайтy   
   архиву форума   
  ОтветитьНовая темаНовый опрос
ActivX, вызвать метод
« предыдущая тема | следующая тема » Подписаться на тему | Отправить тему на E-mail | Распечатать тему
Лена
Отправлено: 07.03.2007, 20:56 Цитировать


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


Группа: Участник
Сообщений: 501
Пользователь № 1148
Регистрация: 01.06.05



В 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

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

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

 
Послать сообщение E-mail адрес  Top
Admin
Отправлено: 07.03.2007, 21:57 Цитировать


Владимир


Группа: Администратор
Сообщений: 1190
Пользователь № 1
Регистрация: 17.11.02



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

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

Calendar1->AboutBox(); // работает

--------------------

Но настанет пора, и проснется народ, разогнет он могучую спину,
И на бар и царя, на попов и господ он отыщет покрепче дубину.
 
Послать сообщение E-mail адрес Домашняя страница  Top
Лена
Отправлено: 08.03.2007, 09:12 Цитировать


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


Группа: Участник
Сообщений: 501
Пользователь № 1148
Регистрация: 01.06.05



Мне хочется добавить календарь программно, поэтому я делаю так:
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
 
Послать сообщение E-mail адрес  Top
Admin
Отправлено: 08.03.2007, 12:21 Цитировать


Владимир


Группа: Администратор
Сообщений: 1190
Пользователь № 1
Регистрация: 17.11.02



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

CODE


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

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



--------------------

Но настанет пора, и проснется народ, разогнет он могучую спину,
И на бар и царя, на попов и господ он отыщет покрепче дубину.
 
Послать сообщение E-mail адрес Домашняя страница  Top
Лена
Отправлено: 09.03.2007, 10:16 Цитировать


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


Группа: Участник
Сообщений: 501
Пользователь № 1148
Регистрация: 01.06.05



Большое спасибо! Все понятно. Как раз читаю книгу по 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.
(вместо # надо скобки шаблона поставить. Почему-то форум не отображает текст между ними если поставить их в тексте сообщения)
 
Послать сообщение E-mail адрес  Top
Admin
Отправлено: 09.03.2007, 12:13 Цитировать


Владимир


Группа: Администратор
Сообщений: 1190
Пользователь № 1
Регистрация: 17.11.02



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

А удалось AboutBox заставить заработать ?


--------------------

Но настанет пора, и проснется народ, разогнет он могучую спину,
И на бар и царя, на попов и господ он отыщет покрепче дубину.
 
Послать сообщение E-mail адрес Домашняя страница  Top
Лена
Отправлено: 09.03.2007, 18:38 Цитировать


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


Группа: Участник
Сообщений: 501
Пользователь № 1148
Регистрация: 01.06.05



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
 
Послать сообщение E-mail адрес  Top
Лена
Отправлено: 12.03.2007, 10:21 Цитировать


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


Группа: Участник
Сообщений: 501
Пользователь № 1148
Регистрация: 01.06.05



C уроком разобралась. yahoo.gif
 
Послать сообщение E-mail адрес  Top
7 ответов с: 07.03.2007, 20:56 Подписаться на тему | Отправить тему на E-mail | Распечатать тему

Back to Вопросы программирования в C++Builder
ОтветитьНовая темаНовый опрос