Создание компонентов в delphi для ТS CRM

Добрый день. Захотелось попробовать создавать свои компоненты для TS CRM. Для разработки использую Delphi 7 и TS CRM 3.3.2. Создал свой COM объект подключил интерфейсы IWindowComponent, ICoreCollectionItem, ICoreObject. Указал родительский интерфейс для своего компонента IWindowComponent. Скомпилировал, зарегистрировал dll. Добавил компонент в файл WindowSettings.xml. В результате после создания окна в Администраторе TS появился мой компонент,
но при попытки добавить его в дерево объектов возникает ошибка:
Объект MyComponent.MyComponent ({095C50B4-37FD-4653-9ECE-6D8D9C718AD8}) не поддерживает интерфейс {12498E9F-2F20-4491-AAF8-F258E72BEF5B} ({12498E9F-2F20-4491-AAF8-F258E72BEF5B}).
Был бы очень благодарен если бы подсказали в чем может быть ошибка или дали ссылку на простейший пример разработки компонентов для TS.

Нравится

40 комментариев

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Добрый день. А можно узнать когда примерно Ваш специалист проконсультирует меня ?:smile:

Добрый день!

Обращение находится в департаменте разработки, решение вопроса будет предоставлено до 03.02.2014.

Спасибо Арсений. Буду ждать.

Добрый день, Сергей!

По этой ссылке статья о работе с оконными компонентами в Terrasoft: Работа с окнами (Window)
Проверьте пожалуйста, все ли обязательные поля вы определили в своем компоненте?
Так же необходимо проверить правильно ли объявлен класс компонента, вот пример:

  TCalculatorControl = class(TFrameItem, ICalculatorControl, IConnectionPointContainer)

Вы создаёте элемент управления или оконный компонент?

С ув. Величко Максим, разработчик Terrasoft 3.x

Здравствуйте Максим. Спасибо за ссылку, но работать с компонентами Terrasoft я умею.
В классе компонента интерфейсы я объявил по примеру компонентов Terrasoft.
Свойства я унаследовал от IWindowComponent.
Я пробовал создавать и элементы управления и оконный компонент.
Не понятно, что это за интерфейс {12498E9F-2F20-4491-AAF8-F258E72BEF5B}, в реестре системы он не зарегистрирован.
Пробовал создавать компонент на С# та же история.
Был бы очень благодарен за простейший пример на любом языке программирования, можно создания пустого компонента.

Добрый день, Сергей!

{12498E9F-2F20-4491-AAF8-F258E72BEF5B} - это ID интерфейса IInternalWindowComponent
Попробуйте подключить этот интерфейс, он реализован в библиотеке TSWindowLibrary.dll

Спасибо Максим. Я попробую.

Добрый день, Сергей!

Хочу поинтересоваться как у Вас успехи с компонентом? Получилось ли добавить его в дерево? Ошибка исчезла?

Здравствуйте Максим. К сожалению у меня не получилось. При подключении интерфейса IInternalWindowComponent, пишет что необъявленный идентификатор.

TMyComponent = class(TAutoObject, IMyComponent, ICoreCollectionItem, ICoreObject, IWindowComponent, IInternalWindowComponent)

У меня такое ощущение, что я пошел не в том направлении, наверно все сложнее чем мне показалось на первый взгляд. Без явного примера с одним TLB файлом тяжело реализовать компонент. Будет свободное время продолжу попытки:smile:

Спасибо за помощь.

Сергей, если что - обращайтесь!

Дмитрий, Вы можете выложить пример на Delphi для создания простого оконного компонента? Это очень актуально.

Евгений, я передал Вашу просьбу разработчикам.

Спасибо!
Жду.

Это действительно актуально. У меня есть много полезных COM библиотек, написаных на разных языках, в том числе и для телефонии, все они прекрасно работаю в Террасофт, но хотелось бы сделать их компонентами системы.
Дмитрий если разработчики согласятся выложить простейший пример создания компонента на любом из языков программирования, прошу Вас сообщить мне :smile:.

Добрый день!

Вот пример создания COM-контрола FloatDataControl:

Объявление класса контроал

  TFloatDataControl = class(TDataControl, IFloatDataControl,
    IDataControl, IBaseDataControl, IFrameItem, IFrameBaseItem,
    IWindowControl, IWindowComponent, ICoreCollectionItem, ICoreObject,
    IInternalControlWithButtons)
    ...
  protected
    function Get_Buttons(): IActionMenu; safecall;
    procedure Set_Buttons(const AValue: IActionMenu); safecall;
    function Get_ButtonsName(): WideString; safecall;
    procedure Set_ButtonsName(const AValue: WideString); safecall;
    ...
  protected
    property Buttons: IActionMenu
      read Get_Buttons write Set_Buttons;
    property ButtonsName: WideString
      read Get_ButtonsName write Set_ButtonsName;
  public
    procedure Initialize(); override;
    destructor Destroy(); override;
  end;

Объявление интерфейса IFloatDataControl

  IFloatDataControl = interface(IDataControl)
    ['{E2B975D4-6C8D-4FCA-8C80-46AB6DCECD36}']
    function Get_Buttons: IActionMenu; safecall;
    procedure Set_Buttons(const Value: IActionMenu); safecall;
    property Buttons: IActionMenu read Get_Buttons write Set_Buttons;
  end;

Определение контрола в IDL-файле

	// ------------------------------------------------------------------
	// ILookupDataControl (2043XX)
	// ------------------------------------------------------------------
	[
		odl,
		uuid(8670BB97-7134-4FED-A3E8-79EE08E25B6F),
		version(1.0),
		helpstring("Dispatch interface for LookupDataControl Object"),
		dual,
		oleautomation
	]
	interface ILookupDataControl : IDataControl {
		[id(204301), propget]
		HRESULT SelectWindowUSI([out, retval] BSTR* Value);
		[id(204301), propput]
		HRESULT SelectWindowUSI([in] BSTR Value);
 
		[id(204302)]
		HRESULT UnprepareDropDownList();
 
		[id(204303), propget]
		HRESULT Buttons([out, retval] IActionMenu** Value);
		[id(204303), propput]
		HRESULT Buttons([in] IActionMenu* Value);
 
		[id(204304), propget]
		HRESULT Text([out, retval] BSTR* Value);
	};

Максим извините, но разве TFloatDataControl не должен наследовать TAutoObject?

Добрый день, Сергей!

Всё верно, просто в данном примере указно наследование от TDataControl, который по иерархии наследования, наследует TAutoObject.

Так же необходимо в секции initialization добавить следующий код:

initialization
  CoInitialize(nil);

Спасибо Максим. Буду пробовать.

У меня похожая ситуация, создаю компонент для добавления его в дерево сервисов. При добавлении выдает: "Object doesn't support interface {BFA833D5-0868-426E-AABE-05C0D5AFA5D0}". Это что за интерфейс?

К сожалению мне так и не удалось полноценно внедрить компонент. Было бы не плохо если бы выложили бы подробный пример создания компонента террасофт.

Добрый день, Алексей!

{BFA833D5-0868-426E-AABE-05C0D5AFA5D0} - это ID интерфейса IInternalService.

Приятного дня!

"Вильшанский Дмитрий" написал:{12498E9F-2F20-4491-AAF8-F258E72BEF5B} - это ID интерфейса IInternalService.

В принципе это и так было понятно из сообщения об ошибки.:smile:

Это какой то скрытый интерфейс?
В TSObjectLibrary его нет...
Есть какая нибудь tlb с этими внутренними интерфейсами?

"Шмитько Алексей Анатольевич" написал:

Это какой то скрытый интерфейс?

В TSObjectLibrary его нет...

Есть какая нибудь tlb с этими внутренними интерфейсами?

Алексей, это внутренний интерфейс и он находится в библиотеке TSObject.bpl

"Вильшанский Дмитрий" написал:Алексей, это внутренний интерфейс и он находится в библиотеке TSObject.bpl

Эта библиотека простым смертным недоступна, я так понимаю?
У меня версия 3.3.2.157

Алексей, данная библиотека доступна в бинарных файлах. Ее просто необходимо подключить/добавить.

В общем для разработки это не годится :(

Не получается подгрузить TSObject.bpl, т.к конфликтует с rtl70.bpl. C динамической подгрузкой тоже ничего не получилось. Использую Delphi 7.

Я так понимаю, что TSObject.bpl это run-time пакет и просто так его не подключить хотелось бы получить инструкцию как его подключать.

У меня вообще эти интерфейсы находятся в TSObjectLibrary.dll. Это "служебные" интерфейсы для разработчиков. Я просто взял и добавил в своей Type Lib недостающий интерфейс с ID из ошибки.
И он перестал ругаться :)
Но дальше пока не стал копать.

Ну я думаю еще пару лет и Мы осилим:smile:

Здравствуйте.
Пишите, если возникнут вопросы.

Я то конечно пишу, а толку? За 2 года не получил полезной информации. Сначала пишут одно потом другое.

"Перонко Сергей Сергеевич" написал:Я то конечно пишу, а толку? За 2 года не получил полезной информации. Сначала пишут одно потом другое.

100%

"Котенко Александр" написал:Здравствуйте.
Пишите, если возникнут вопросы.

Вопросы есть :)
Вы сотрудник компании Terrasoft? Если да, то можно ли получить модуль с объявлением Internal интерфейсов?

Здравствуйте.
Исходные файлы внутренней реализации кода закрыты. Мы можем предоставить idl-файл (во вложении), в котором описаны доступные интерфейсы библиотеки TSObjectLibrary.dll. Если возникнут сложности - прикрепите пример своего компонента чтобы можно было понять в чем проблема.

Извините, но зачем предоставлять idl файл который я и так могу получить из TSObjectLibrary.dll.
Проблема заключается в том что для разработки необходимо подключить пакет TSObject.bpl. Это не возможно сделать т.к. скорей всего это run-time пакет. А необходимый интерфейс находится именно в этом пакете. Я конечно не исключаю пробелы в знаниях делфи, поэтому прикрепляю свой компонент.

:lol:
Вы или не поняли тематику данной проблемы или издеваетесь )))
Могли бы изначально написать, что ваша компания запрещает создание компонентов, которые можно интегрировать в конфигурацию в Terrasoft Administrator. И всё.
Если Вас не затруднит, то предоставьте пожалуйста пример разработки компонента, который можно добавить в конфигурацию как показано ниже.

"Шмитько Алексей Анатольевич" написал:

:lol:

Вы или не поняли тематику данной проблемы или издеваетесь )))

Могли бы изначально написать, что ваша компания запрещает создание компонентов, которые можно интегрировать в конфигурацию в Terrasoft Administrator. И всё.

Если Вас не затруднит, то предоставьте пожалуйста пример разработки компонента, который можно добавить в конфигурацию как показано ниже.


Нет издевательство было когда я написал в тех поддержку можно ли программно менять курсор мыши в террасофт на, что мне ответили "поменять его в в настройках системы windows" .

Здравствуйте!
Те компоненты, о которых Вы пишете не реализуются на уровне конфигурации. Это сугубо ядровая логика

Показать все комментарии