|   |   | 
| 
 | delphi activeX + 1C (не NativeAPI) | ☑ | ||
|---|---|---|---|---|
| 0
    
        qeos 04.06.13✎ 09:45 | 
        ктото имеет опыт разработки компонент не используя 1CNativeLib и подобные вещи?
  т.е. интересует глобальный вопрос: как получить pConnection в компоненте? | |||
| 1
    
        ZanderZ 04.06.13✎ 09:50 | 
        а в чем проблема ?     | |||
| 2
    
        Diversus 04.06.13✎ 09:50 | ||||
| 3
    
        qeos 04.06.13✎ 09:52 | 
        (1) если создаю все через wizard то у меня нет объекта 1с, например для создания массива или запроса..     | |||
| 4
    
        ZanderZ 04.06.13✎ 09:54 | 
        в init инициализируй переменную класса и передав в нее pConnection     | |||
| 5
    
        qeos 04.06.13✎ 09:56 | 
        (2) так все работает но мне надо к примеру вернуть массив.. как? )
  (4) вот как? можно подробней? ) | |||
| 6
    
        ZanderZ 04.06.13✎ 09:59 | 
        (5) эээ как обычно http://www.delphisources.ru/pages/faq/base/delphi_com.html     | |||
| 7
    
        qeos 04.06.13✎ 10:17 | 
        (6) а может просто примером покажешь?     | |||
| 8
    
        qeos 04.06.13✎ 10:22 | 
        если я правильно понимаю, то надо изменить процедуру
  procedure Inialize; override; под мои нужды: procedure Initialize(const pConnection: IDispatch); override; но так он ругается что описани отличается от предыдущего. если же я указываю reintrodused, то у меня в эту процедуру не заходит вообще. | |||
| 9
    
        ZanderZ 04.06.13✎ 10:24 | 
        (8) я не понял ты каким образом хочешь с 1с связать то ?     | |||
| 10
    
        Кирпич 04.06.13✎ 10:33 | 
        (0) сначала учить матчасть в (6), потом смотреть доку 1С, потом смотреть сюда
  function TAddInObject.Init(pConnection: IDispatch): HResult; stdcall; begin MyConnection := pConnection; end; | |||
| 11
    
        qeos 04.06.13✎ 10:35 | 
        (9) в примерах 1с nativeAPI есть инициализация
  bool CAddInNative::Init(void* pConnection) в переделаном под delphi тоже есть такая function _Init(Obj: PV8ObjectRec; disp: pointer): boolean; stdcall; соответственно это IDispatch на 1с.. с помощью pConnection можно создавать объекты 1с. вот как это переложить на нормальный язык, я чтото никак не вкурю. по теории 1С при создании (подкгрузке) компонента вызывает процедуры инициализации. вот их-то, как я понимаю, я и должен изменить. т.к. в документации написано так: [code]Инициализация и выгрузка компоненты Для инициализации и выгрузки компоненты используется интерфейс IInitDone. Этот интерфейс наследован от IUnknown и предназначен для инициализации объекта и завершения работы с объектом. Init Синтаксис: HRESULT Init(IDispatch *pBackConnection) Параметры: <pBackConnection> Тип: IDispatch. Указатель на интерфейс 1С:Предприятия. Возвращаемое значение: E_FAIL - при инициализации произошла ошибка S_OK - инициализация прошла успешно Описание: При загрузке 1С:Предприятие инициализирует объект компоненты, вызывая метод Init и передавая указатель на IDispatch. Объект может сохранить этот указатель для дальнейшего использования. Все остальные интерфейсы 1С:Предприятия объект может получить, вызвав метод QueryInterface переданного ему интерфейса IDispatch. Объект должен возвратить S_OK, если инициализация прошла успешно, и E_FAIL при возникновении ошибки. Данный метод может использовать интерфейс IErrorLog для вывода информации об ошибках. При этом инициализация считается неудачной, если одна из переданных структур EXCEPINFO имеет поле scode, не равное S_OK. Все переданные в IErrorLog данные обрабатываются при возврате из данного метода. В момент вызова этого метода свойство AppDispatch не определено.[/code] | |||
| 12
    
        Кирпич 04.06.13✎ 10:36 | 
        можно действовать в обратном порядке, но тогда будет на годы дольше.     | |||
| 13
    
        qeos 04.06.13✎ 10:36 | 
        (10) я ж говорю: не используя nativeAPI     | |||
| 14
    
        Кирпич 04.06.13✎ 10:39 | 
        ну тебе про nativeAPI никто и не писал.     | |||
| 15
    
        qeos 04.06.13✎ 10:42 | 
        (14) при визарде никаких процедур Init нету, есть Initialize, но она описана в базовом классе и не имеет параметров.     | |||
| 16
    
        Кирпич 04.06.13✎ 10:45 | 
        (15) шо ищо за визард? если это та древняя фигня, то у TFPList есть pConnection. уже готовый     | |||
| 17
    
        Serginio1 04.06.13✎ 10:45 | 
        Посмотри http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019
  Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender. Использую 10 лет | |||
| 18
    
        qeos 04.06.13✎ 10:47 | 
        (16) вот эти визарды или как их там..
  http://my.jetscreenshot.com/5394/20130604-2kyi-48kb.jpg | |||
| 19
    
        Кирпич 04.06.13✎ 10:48 | 
        +(16)  TDM.AddInFPList.pConnection
  типа так | |||
| 20
    
        Кирпич 04.06.13✎ 10:48 | 
        (18) у блин. попутал     | |||
| 21
    
        Кирпич 04.06.13✎ 10:49 | 
        короче (10)
  или, если горит, запешитесь на прием к программисту | |||
| 22
    
        qeos 04.06.13✎ 10:51 | 
        (21) готов записаться. к кому?     | |||
| 23
    
        Кирпич 04.06.13✎ 10:52 | 
        (22) ну ко мне запишись     | |||
| 24
    
        qeos 04.06.13✎ 11:06 | 
        (23) gtalk есть? skype? icq?...etc     | |||
| 25
    
        Кирпич 04.06.13✎ 11:06 | 
        (24) есть электронная почка     | |||
| 26
    
        Кирпич 04.06.13✎ 11:06 | 
        )))) пардон. почта     | |||
| 27
    
        Кирпич 04.06.13✎ 11:08 | 
        пиши чего надо
  qxlreport кошка mail RU | |||
| 28
    
        qeos 04.06.13✎ 11:12 | 
        смысла нет почтой общаться.
  вобщем нужно победить BackConnection для XE4 не используя жесткие костыли. т.е. элегантно получить backConnection называй свою цену. | |||
| 29
    
        ЧеловекДуши 04.06.13✎ 11:13 | 
        (2) Жесть :)     | |||
| 30
    
        Кирпич 04.06.13✎ 11:14 | 
        (28) ну нет смысла так нет     | |||
| 31
    
        qeos 04.06.13✎ 11:15 | 
        (30) просто тут проще.
  если будет оплата, тогда почтой ;) | |||
| 32
    
        Кирпич 04.06.13✎ 11:17 | 
        что такое "победить BackConnection для XE4" я не понял. да и к тому же XE4 у меня нет.     | |||
| 33
    
        Кирпич 04.06.13✎ 11:18 | 
        лучше бы на mail написал.и сам заодно понял бы, чего хочешь.     | |||
| 34
    
        qeos 04.06.13✎ 11:19 | 
        [spoiler]как тут под спойлер поместить?[/spoiler]
  [спойлер]или так?[/спойлер] или так | |||
| 35
    
        qeos 04.06.13✎ 11:20 | 
        (33) jr     | |||
| 36
    
        Serginio1 04.06.13✎ 11:20 | 
        Вообще восьмерка поддерживает события, так же можно передать ссылку на модуль в которой реализовать метод с определенной сигнатурой
  v8: Вопрос по NetObjectToIDispatch | |||
| 37
    
        Serginio1 04.06.13✎ 11:26 | 
        То есть создай в свем ком объекте событие например DocumentChange и подпишись из 1С.
  Не забывай вызывать в потоке 1С. 1С совский эвент ассинхронный. msword = Новый COMОбъект("Word.Application"); ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента; Процедура ПриИзмененииДокумента() Сообщить("Документ изменен");КонецПроцедуры | |||
| 38
    
        Кирпич 04.06.13✎ 11:29 | 
        (35) Что jr?     | |||
| 39
    
        qeos 04.06.13✎ 11:32 | 
        (38) jr = ок
  отправил письмо | |||
| 40
    
        qeos 04.06.13✎ 11:33 | 
        (37) события работают.. как в компоненте создать объект 1с?     | |||
| 41
    
        Serginio1 04.06.13✎ 11:57 | 
        (40) Если тебе нужен контекст то, можешь из него передавать, что хочешь. Второй способ это V83.COMConnector
  . Ну если посмотришь мою компоненту тебе нужно только создать метод procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch); Var wnd: HWND; pExtWndsSupport:IExtWndsSupport; begin If Not Assigned(pConn) Then Begin pConn := pCon; PEvent := nil; IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent); pExtWndsSupport := nil; IDispatch(pCon).QueryInterface(IExtWndsSupport,pExtWndsSupport); If Assigned(pExtWndsSupport) Then Begin pExtWndsSupport.GetAppMainFrame(wnd); Application.Handle := wnd; pExtWndsSupport.GetAppMDIFrame(ChildWnd); end; end; end Например для семерки это obj:=OleVariant(Pconn).AppDispatch; IDispatch(obj)._AddRef; Text2:=Obj.CreateObject('Справочник.Товары'); Который вызовется при подключении. | |||
| 42
    
        Serginio1 04.06.13✎ 12:00 | 
        41 Вернее ты можешь создать компоненту которая вернет в 1с pCon, а её уже передавать в любой COM объект     | |||
| 43
    
        Serginio1 04.06.13✎ 12:01 | 
        И тогда тебе вообще не нужно заморачиваться с ВК.     | |||
| 44
    
        qeos 04.06.13✎ 12:05 | 
        (41) вообще ничего не понял.. надо пообедать сходить мож мозг остынет..     | |||
| 45
    
        qeos 04.06.13✎ 14:04 | 
        (41) где твоя компонента?     | |||
| 46
    
        qeos 04.06.13✎ 14:05 | 
        (45) а..     | |||
| 47
    
        Serginio1 04.06.13✎ 14:06 | 
        Я тебе в 17 ссылку на неё давал     | |||
| 48
    
        qeos 04.06.13✎ 14:14 | 
        (47) дада...
  но это все не то.. чтото здесь я упускаю.. у меня все работает прекрасно кроме того что нету этого BackConnection.. | |||
| 49
    
        Serginio1 04.06.13✎ 14:23 | 
        Как это нет. PEvent := nil;
  IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent); Это что? Эта компонента тебе дает возможность просто писать ком объект. От тебя требуется только реализовать метод procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch); А вот из этого pCon получай что тебе нужно. IAsyncEvent = interface(IUnknown) ['{AB634004-F13D-11D0-A459-004095E1DAEA}'] procedure SetEventBufferDepth(lDepth: Integer); safecall; procedure GetEventBufferDepth(var plDepth: Integer); safecall; procedure ExternalEvent(const bstrSource, bstrMessage, bstrData: WideString); safecall; procedure CleanBuffer; safecall; end; | |||
| 50
    
        Serginio1 04.06.13✎ 14:25 | 
        Из него же получай свой BackConnection
  obj:=OleVariant(Pconn).AppDispatch; IDispatch(obj)._AddRef; Номенклатура:=Obj.Справочники.Номенклатура.СоздатьОбъект(); | |||
| 51
    
        qeos 04.06.13✎ 14:38 | 
        (50) ты на аське есть?     | |||
| 52
    
        Serginio1 04.06.13✎ 15:03 | 
        нет     | |||
| 53
    
        qeos 04.06.13✎ 15:10 | 
        (52) жаль..
  тогда пару вопросов. для получения backConnection, как минимум, достаточно реализовать только IInitDone? | |||
| 54
    
        qeos 04.06.13✎ 15:24 | 
        (49) взял твой пример из папки AddinTypeInfo
  в 1С я должен создать объект     попытка
 окошко из ProbaWind открывается. как мне вызвать InitFrom1C? что в параметрах писать? | |||
| 55
    
        qeos 04.06.13✎ 15:26 | 
        я уже близко к разгадке )) только не пропадай сейчас -_-     | |||
| 56
    
        Serginio1 04.06.13✎ 16:02 | 
        (55) Ты не весь пример показал. Это ты создаешь компоненту.
  Затем из компоненты ты должен загрузить свой ком объект тест.LoadOleObject(ПрогИДТвоегоКомОбъекта); А внутри Ком объекта ты должен реализовать то что написал в 41. Посмотри примеры | |||
| 57
    
        Serginio1 04.06.13✎ 16:04 | 
        Для понимания 41 вот объявление класса. 
  TAddinTypeInfo = class(TAutoObject, IAddinTypeInfo) Pconn:Idispatch; ChildWnd:HWND; PEvent:IAsyncEvent; У меня очень много работы. Так, что появляться буду не часто. | |||
| 58
    
        Кирпич 04.06.13✎ 16:06 | 
        (0) смотри почту. там простой пример. вроде работает     | |||
| 59
    
        qeos 04.06.13✎ 16:34 | 
        оказывается правильный вариант был такой:
      Если ПодключитьВнешнююКомпоненту("test.test100500") Тогда
 а вот теперь вопрос еще сложнее.. а если у меня компонента должна встраиваться в форме, то ПодключитьВнешнююКомпоненту я все равно эе должен делать гдето в коде? | |||
| 60
    
        qeos 04.06.13✎ 16:37 | 
        *же     | |||
| 61
    
        Serginio1 04.06.13✎ 16:41 | 
        Если тебе нужны создавать окна, то тебе нужны родительские окна
  IDispatch(pCon).QueryInterface(IExtWndsSupport,pExtWndsSupport); If Assigned(pExtWndsSupport) Then Begin pExtWndsSupport.GetAppMainFrame(wnd); Application.Handle := wnd; pExtWndsSupport.GetAppMDIFrame(ChildWnd); Для контейнеров нужно реализовывать другие интерфейсы и они с ВК никак не связаны. | |||
| 62
    
        Serginio1 04.06.13✎ 16:43 | 
        56 это выглядит так
  Загружаем ВК TypeInfo = СоздатьОбъект("AddIn.AddInFromITypeInfo"); Затем загружаем КОМ объект в котором реализован метод procedure TAddinTypeInfo.InitFrom1C(const pCon: IDispatch); TypeInfo.LoadOleObject("AddinTypeInfo.AddinTypeInfo"); | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |