Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сделать activex [Delphi]


nastya ©   (2006-01-11 18:16:00) 

(Кинула вопрос в конференцию начинающих, но там не ответили, помогите подсказкой, если вам не сложно).

У меня есть класс (не компонент). Подскажите, пожалуйста, примерную последовательность действий(с подробностями разберусь сама), для того, чтобы оформить его как activeX. Чтобы получался невизуальный activeX, который можно кинуть на форму и пользоваться его методами.
Пыталась использовать стандартный ActiveXControl, но он наследует от готового компонента (м.б. я недопоняла).


Romkin   (2007-02-21 11:04:00) [1]

Если не родственники - сделай основной объект, который через методы/свойства выдает нужный интерфейс. Тип свойства - IDispatch, а выдаваться будет конкретный заказанный интерфейс.
Так, например, сделан метод Add у книги Excel - добавить-то можно разные вещи, не только лист. Выдает IDispatch.


i_hate_vb   (2007-02-20 12:49:00) [2]

да так и сделаю, понаследую их друг за другом...

просто "идеологически" оно не очень красиво - не родственники они! ;)


Romkin   (2007-02-20 11:28:00) [3]

Ты не учитываешь, что интерфейсы также можно наследовать друг от друга.
Тебя же не удивляет, что TAutoObject реализует и IDispatch, и интерфейс-потомок от него ;)


i_hate_vb   (2007-02-19 16:14:00) [4]

> Опять ты? :)

угу :)

пожалуюсь - "зачем":

конвертируем файл в че-то; при этом у этой задачи есть настрйоки:
1) имя исходного файла
2) свойства файла (read only), читаются после загрузки п. 1

3) папка, куда ложить результ
4) имя файла, который получится
5) диапазон кадров для обработки (с/по)

6) заголовок окна
7) размер окна
8) что-то-еще

конвертируем файл в что-то другое; у этой задачи настройки такие
1) имя исходного файла
2) свойства файла (read only), читаются после загрузки п. 1

3) папка, куда ложить результ
4) имя файла, который получится
5) диапазон кадров для обработки (с/по)

6) кодек для видео
7) кодек для аудио
8) битрейцт видео
9) что-то еще

получается, что мне для первого случая нужно описать интерфейс, который полностью описывает пункты 1-8 первого прмиера, для второго случая - интерфейс, который полностью описывает пункты 1-9 второго примера, при этом ведь п. 1-2, 3-5 совпадают, все свойства по идее часто можно оставлять "как есть"

так что я сделал кучку интерфейсов "по темам":
пункты 1-2:
ISourceReader
 source_filename: string;
 frames: integer;
 width: integer;
 height: integer;
end;

пункты 3-5:
ITaskProps
 dest_folder: string;
 dest_name: string;
 frame_from: integer;
 frame_to: integer;
end;

все конверторы имеют общего предка
IBaseBuilder
 make;
end;

конвертация в ехе
IEXEMaker = interface (IBaseBuilder)
 caption: string;
 size: size_enum;
end;

конвертация в видео
IVideoMaker = interface (IBaseBuilder)
 video_codec: string;
 video_butrate: integer;
 audio_codec: string;
 audio_bitrate: integer;
end;

плюс интерфейс для событий
IBaseBuilderEvents
 on_video
 on_error
 on_succ
end;

делаю кокласс для конвертации в ехе - реализует интерфейсы ISourceReader (default), IBuilderEvents (source, default), ITaskProps, IExeMaker

В реализации сделал класс
 TSourceReaderAX = class(TActiveXControl, ISourceReader, ITaskProps)

от него хочу наследовать все конверторы... и все ж отлично работает, если б не этот *** vb

вижу пока один вариант - каждый интерфейс конвертации описать полностью; задумка была, что вдруг что-то будет в функционал добавлятся - добавлю в поближе к базовому интерфейсу и все; а теперь надо будет всех везде помнить...


Romkin   (2007-02-19 13:33:00) [5]

i_hate_vb   (16.02.07 13:07) [3] Опять ты? :)
Зачем тебе для каждой конвертации свой интерфейс? Интерфейс должен быть один, а коклассов - для кадой конвертации свой.
По поздему связыванию доступен только один интерфейс, default.


i_hate_vb   (2007-02-16 13:07:00) [6]

бодаюсь примерно с такой же ситуацией

[quote]А Вы уверены, что Вам нужен именно ActiveX? Может быть, будет достаточно обычного COM-объекта, реализующего потомка IDispatch?[/quote]

сделал обычный сом-объект, тестовые примеры на делфи работают отлично как при создании обьектов руками, так и с сгенерированным компонентом-врапером

а с visual basic-ом одни траблы, кричат "дай активх, мы его положим на форму и не будем гемороится"

и вот как сделать невизуальный активХ? показывать то нечего

кроме траблы с событиями есть еще такая трабла: базовый класс реализует неск. интерфейсов ("загрузить файл", "сказать, что файл правильный" и т.д.); смысл возни - конвертация загруженного файла, для каждого направления конвертации свой интерфейс

на делфи все просто - создал базовый объект, загрузил в него настройки исходного файла, потом QueryInterface с IID нужного интерфейса, заполнил где надо свойства и сделал Make - "та-дам!" все класс

при этом интерфейсов конвертации много, так что я переопределяю QueryInterface и для нужных IID создаю обьекты, реализующие эти интерфейсы

а в этом *** vb все ж не как у людей - в мою QueryInterface никогда управление не попадает и vb ругается, что не найден интерфейс

вот они и плачут, просют активХ...


DSKalugin   (2006-01-12 14:23:00) [7]

Скорей всего, вы хотите из имеющего класса сделать компонент, а не ActiveX, потому что на форму в большинстве случаев ложатся компоненты, а не ActiveX-ы


Набережных С.   (2006-01-11 21:42:00) [8]


> Подскажите, пожалуйста, примерную последовательность действий(с
> подробностями разберусь сама)

Милая девушка, примерная последовательность занимает в MSDN с десяток немаленьких топиков, и это действительно только "примерная последовательность", без описания каких-либо тонкостей. Боюсь, что без чтения книг или внимательного изучения MSDN, используя TActiveXControl в качестве примера, Вам никак не обойтись.

> Чтобы получался невизуальный activeX, который можно кинуть
> на форму и пользоваться его методами.

А Вы уверены, что Вам нужен именно ActiveX? Может быть, будет достаточно обычного COM-объекта, реализующего потомка IDispatch? А чтобы кидать на форму, можно его после регистрации импортировать в Delphi стандартными средствами среды - Project/Import type library и выставить галкку Create Component wrapper.


Наверх

Титульная страница Поиск, карта сайта Написать письмо