Добрый день. Захотелось попробовать создавать свои компоненты для 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" .

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

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

Сегодня немного расскажу о новой версии Terrasoft 3.4.0, некоторых ее особенностях по сравнению с предыдущей версией (3.3.2) и о методах перехода с 3.3.2 на 3.4.0.

Новое ядро Terrasoft 3.4.0

Было сделано очень много работы. Некоторые задачи давно уже планировали, некоторые появились по ходу работы. Обо всем рассказать не смогу, остановлюсь только на крупных, наиболее значимых вещах.

Ядро Terrasoft. Все началось с того, что в Delphi 2009 наконец-то появился полноценный, «нативный» юникод. Поэтому было решено перейти с Delphi 7 на последнюю версию, на тот момент это был Delphi 2010. А в процессе перехода появилась следующая версия: Delphi XE, переход на который уже занял несколько дней. И вот релиз Terrasoft 3.4.0 вышел при использовании самой новой версии Delphi. Таким образом значительно упростится переход на следующую версию (Delphi XE2), которая уже поддерживает компиляцию приложений под х64. А с этим уже не за горами и Terrasoft x64.

Главной целью перехода была полная поддержка юникода. Автоматически исправились все ошибки с юникодом в Terrasoft. Теперь при работе с русским языком не обязательно использовать русские региональные настройки, что раньше было обязательным условием. Можно использовать несколько языков для ввода, хранения и отображения информации. Полноценным стало использование юникода в отчетах Fast Report. Появилась возможность запускать Terrasoft используя юникодный логин.

Так как теперь все «родные» компоненты Delphi полностью поддерживают юникод, то стало возможным не использовать промежуточные компоненты, которые приходилось писать поверх стандартных (чтобы обеспечить ввод и отображение юникода). Вследствие этого уменьшилось почти в два раза использование GDI Objects: значение после запуска у 3.3.2 – 1564, 3.4.0 – 881. Также на 30% уменьшилось потребление памяти.

При переходе на новую Delphi решили полностью переписать компонент Layout. В конфигурации он представлен в виде Frame и FrameGroup, а также всех других компонентов, которые его поддерживают: DataGrid, WindowContainer, PageControl и т.д. Именно он управляет автоматическим размещением и выравниванием компонентов на формах. И вместе с этим заново реализована отрисовка ScrollBar в компонентах Terrasoft. Таким образом, исправили большое количество старых ошибок и, благодаря этому, значительно улучшилась отрисовка интерфейса. Лучше всего это можно увидеть при изменении размеров окон, сворачивании/разворачивании главного окна.

В новой версии была произведена оптимизация и переработка библиотек. В библиотеку TSWindowLibrary.dll включена часть TSDskObjectLibrary.dll, полностью вся TSDskWindowLibrary.dll и TSReportLibrary.dll. Пакеты компонентов теперь представлены с помощью: TSCoreComponents.bpl, TSComponentsExtra.bpl, TSComponents.bpl и Terrasoft.bpl. Благодаря этому при работе с не визуальными COM-объектами Terrasoft, подгружается только необходимый минимум: TSObjectLibrary.dll и TSCoreComponents.bpl. Как следствие уменьшилось потребление памяти при работе Service Desk Web-формы.

Переход с Terrasoft 3.3.2

Главным требованием при разработке 3.4.0 было обеспечить полную обратную совместимость с 3.3.2. Поэтому если у вас есть 3.3.2 и вы хотите использовать новое ядро 3.4.0, то это можно сделать максимально быстро. Например, у вас продукт Terrasoft XRM и вы хотите перейти на бинарные файлы 3.4.0.53.

План действия таков:

  1. В таблице tbl_DatabaseInfo меняете используемую версию:
    UPDATE [tbl_DatabaseInfo] SET
          [DatabaseMajorVersion] = 3
          [DatabaseMinorVersion] = 4
          [DatabaseReleaseVersion] = 0
          [DatabaseBuildVersion] = 53
  2. Регистрируете новые бинарные файлы
  3. Запускаете Менеджер лицензий: TSClient.exe /wnd=wnd_LicenseManager
  4. На закладке «Продукт» к своему продукту (в данном случае Terrasoft XRM) добавляете два новых модуля: Dictionary и JobManager (скриншот)
  5. Перезаказываете лицензии в тех. поддержке

Все, больше ничего делать не нужно.

Пакеты перехода на 3.4.0

Помимо нового ядра, много удобных вещей было реализовано в конфигурации:

  1. Мастер настроек (Implementation Wizard)
  2. Поиск и слияние дублей
  3. Планировщик задач
  4. Раздел Справочники
  5. Wizard пользовательских запросов
  6. Wizard графиков
  7. Настройка рабочих мест

Подробнее можете почитать тут: Новая функциональность версии 3.4

Чтобы перенести все новые конфигурационные функции нужно делать полноценный переход. А это уже нужно делать с помощью пакетов перехода. Новые пакеты перехода всегда делаем по требованию, для этого вам нужно обратиться в техническую поддержку и указать вашу текущую версию, используемый продукт и СУБД. Уже с октября мы начинаем отгружать первые пакеты перехода.

Нравится

Поделиться

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

Почти в каждом COM-объекте Terrasoft есть методы по умолчанию. В описании интерфейса эти методы имеют нулевой id. Например, ComponentsByName в IWindow, Values в IDataset или ItemsByName в IDataFields и т.д.
А доступ к этим методам выполняется быстрее, если обращаться к ним именно как методам по умолчанию.

Т.е вместо Window.ComponentsByName('EditName') использовать Window('EditName'), вместо Dataset.Values('FieldName') использовать Dataset('FieldName') и т.д.

Для доказательства во вложении два сервиса. В примере тестирование 1 000 000 обращений к компоненту окна двумя способами.
Результаты теста:

  • через Self.ComponentsByName('Edit'): 12,1 с
  • через Self('Edit'): 8,1 с

Таким образом использование свойств по умолчанию дает ускорение в 1,5 раза.

P.S. Навеяно блогом Артема: Dataset(Название_поля>)

Нравится

Поделиться

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