|
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"); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |