Обработка событий скриптом

  • Автор темы Автор темы James_A
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

James_A

Участник
Топикстартер
Сообщения
24
Реакции
0
Пишу скрипты на Delphi для Инди, используя COM с OLE.
Вопрос № 1: Возможна ли обработка событий, как, например, в Worde или Exelle (пользователь, допустим, сменил текущую страницу или вставил изображение).
Вопрос № 2: В Адобовском мануале, выложенном на официальном сайте описаны объекты, свойства и методы для скриптописания в JS или VBS.
Как адаптптировать эту информацию для Delphi - что ближе?
 
Ответ: Обработка событий скриптом

Переходим на С++ и начинаем использовать Adobe SDK - получаем возможность отлавливать даже движения мышью, не говоря уже о помещениях картинок и смене текущего View.
 
Ответ: Обработка событий скриптом

Strizh
Для этого надо быть очень умным. :(

James_A

1. Кое-какие события обработать можно, но для того чтобы реализовать это на Дельфи придется поизощряться и понаписать вставок на JS.

2. Свойства и методы одинаковы для скриптописания на чем угодно. Изучите также модуль сгенерерованный средой при импортировании библиотеки типов.
 
Ответ: Обработка событий скриптом

Specialist сказал(а):
Изучите также модуль сгенерерованный средой при импортировании библиотеки типов.

Прошу прощения, не понял что за модуль. Если можно с этого места поподробнее (я еще не волшебник, я только учусь). '8]

Specialist сказал(а):
Кое-какие события обработать можно, но для того чтобы реализовать это на Дельфи придется поизощряться и понаписать вставок на JS.

А не подскажете где можно надыбать примерчиков - чтобы впотьмах не рыскать?
Strizh сказал(а):
Переходим на С++ и начинаем использовать Adobe SDK - получаем возможность отлавливать даже движения мышью, не говоря уже о помещениях картинок и смене текущего View.
Попробую полопатить талмуд по SDK, но боюсь уйдет уйма времени (или крыша съедет) :)
 
Ответ: Обработка событий скриптом

James_A сказал(а):
Прошу прощения, не понял что за модуль. Если можно с этого места поподробнее (я еще не волшебник, я только учусь). '8]

RTFM.
Модуль по-умолчанию называется InDesign_TLB.pas
Подробнее RTFM:
http://forum.rudtp.ru/showpost.php?p=336143&postcount=14

James_A сказал(а):
А не подскажете где можно надыбать примерчиков - чтобы впотьмах не рыскать?

RTFM, например здесь:
http://forum.rudtp.ru/showthread.php?t=33019&highlight=%D1%EE%E1%FB%F2%E8%FF

James_A сказал(а):
Попробую полопатить талмуд по SDK, но боюсь уйдет уйма времени (или крыша съедет) :)

Съедет, да. У меня уже съехала. %)

PS
Поиск по форуму рулит.
 
Ответ: Обработка событий скриптом

Specialist сказал(а):
RTFM.
Модуль по-умолчанию называется InDesign_TLB.pas
Подробнее RTFM:
Все понял.
Только я немного по-другому использую COM - без визуального серверного компонента.
Т.е. в разделе Uses я добавляю...

USES
..., ComObj;
...

Var
...
Indi: OleVariant;
MyDoc: Variant;
...

begin
...
Indi := CreateOleObject('InDesign.Application');
If Indi.Documents.Count <> 0 then MyDoc := Indi.ActiveDocument
else MyDoc := Indi.Documents.Add();
...
и т. д.
...
end.

Здесь 'InDesign.Application' - зарегистртрованное имя класса, идентифицирующее интерфейс сервера Индизайна, причем не имеет значения CS, CS2 или CS3.
Плюс данного метода в том, что можно писать скрипты вообще без визуальных компонентов и форм, что сокращает размер скомпилированного EXE на порядок (с сотен Кб до десятка Кб).
Еще один плюс - не имеет значения работает ли экзепляр Индизайна или нет. Если не работает, то скрипт его запустит, если работает - подключится к нему.
А импортируя библиотеку по описанному Вами методу появляется путаница с классом TApplication, т. к. этот класс уже описан в модуле Forms.
Не знаю как в Delphi 7 Enterprise, а у меня (Borland Developper Studio 2006) возникает из-за этого ошибка, а при импорте переименовывать класс он не дает.
Однако InDesign_TLB.pas использовать в качестве справочного материала действительно удобнее, чем Адобовский мануал.
 
Ответ: Обработка событий скриптом

James_A сказал(а):
Все понял.
Только я немного по-другому использую COM - без визуального серверного компонента.

Рад за вас.

James_A сказал(а):
Плюс данного метода в том, что можно писать скрипты вообще без визуальных компонентов и форм, что сокращает размер скомпилированного EXE на порядок (с сотен Кб до десятка Кб).

Это не свойство вашего метода. Мой метод это тоже позволяет. Да и вообще надо KOL юзать. :)

James_A сказал(а):
Еще один плюс - не имеет значения работает ли экзепляр Индизайна или нет. Если не работает, то скрипт его запустит, если работает - подключится к нему.

Статью мою вы не читали.

James_A сказал(а):
А импортируя библиотеку по описанному Вами методу появляется путаница с классом TApplication, т. к. этот класс уже описан в модуле Forms.

Эта проблема решаема.

Не знаю как в Delphi 7 Enterprise, а у меня (Borland Developper Studio 2006) возникает из-за этого ошибка, а при импорте переименовывать класс он не дает.

Этого не требуется.

Однако InDesign_TLB.pas использовать в качестве справочного материала действительно удобнее, чем Адобовский мануал.

Дело вкуса.
 
Ответ: Обработка событий скриптом

Абсолютно согласен - кому как удобно. Хотел бы вернуться к теме.
Обнаружил пару объектов Behavior и Behaviors, там есть свойство Event. Не пойму что это за звери и к чему они вообще.
Может к ним можно как нить прикрутить обработчик?
 
Ответ: Обработка событий скриптом

James_A сказал(а):
Обнаружил пару объектов Behavior и Behaviors
Как мне помниться, это для button(s), а button(s) для интерактивных pdf(s).
 
Ответ: Обработка событий скриптом

Понятно. Никогда не пользовал - поэтому не знаю.
Может самому в InDesign_TLB.pas попробовать обработчик написать? Что-то меня JS не вдохновляет.
 
Ответ: Обработка событий скриптом

По ходу дела такая затыка вышла.
Как определить принадлежность выделенного объекта?
в VBS, например, есть функция TypeName(), в JS - .constructor.name, а в Delphi как?
 
Ответ: Обработка событий скриптом

James_A сказал(а):
По ходу дела такая затыка вышла.
Как определить принадлежность выделенного объекта?
в VBS, например, есть функция TypeName(), в JS - .constructor.name, а в Delphi как?

А в дельфи хитро. Я делал однострочную вставку на JS которая возвращала мне имя конструктора, но есть способ более изящный... хотя может и менее изящный... Короче дело вкуса.

Код:
//-----------Функция получения типа объекта в InDesign-------------------------- 
//-------------------Подарена Богданом bogv------------------------------------- 
function GetTypeName(InDesInterface: IDispatch): string; 
var PointerToTypeInformation: ^ITypeInfo; 
    TypeInfo: ITypeInfo; 
    InDesLib: ITypeLib; 
    PointerToTypeString: PWideString; 
    TypeString: WideString; 
    IndexOfInterface: integer; 
    TemporaryResult: string; 
begin 
  InDesInterface.GetTypeInfo(0,0,PointerToTypeInform  ation); 
  TypeInfo:=ITypeInfo(PointerToTypeInformation); 
  PointerToTypeString:=AllocMem(1000); 
  TypeInfo.GetContainingTypeLib(InDesLib,IndexOfInte  rface); 
  InDesLib.GetDocumentation(IndexOfInterface,Pointer  ToTypeString,nil,nil,nil); 
  TypeString:=PointerToTypeString^; 
  TemporaryResult:=TypeString; 
  FreeMem(PointerToTypeString); 
  Result:=TemporaryResult; 
end;


В uses надо добавить ActiveX

Не забудьте поблагодарить автора.
 
Ответ: Обработка событий скриптом

Классно рулит 'cooll)'
Правда, пока не понял почему. Полистаю справку ActiveX - разберусь.
Огромное спасибо SPECIALISTу, отдельное спасибо Богдану.

Кстати, пробовал обрабатывать события путем перехвата API функцией сообщений Индизайновского окна. Пришел к выводу, что все-таки некоторые можно обрабатывать, но при высоком уровне вложенности объектов это такой кошмар получается.
 
Ответ: Обработка событий скриптом

James_A сказал(а):
Классно рулит 'cooll)'
Правда, пока не понял почему. Полистаю справку ActiveX - разберусь.

Да я сам толком не понимаю как это работает. Не юзал. Вроде как-то по библиотеке типов ищет.
 
Статус
Закрыто для дальнейших ответов.