![]() |
![]() |
![]() |
|
Создание внешних компонент. Передача параметров. Delphi | ☑ | ||
---|---|---|---|---|
0
totparen
29.06.11
✎
11:37
|
Ребята, кто имел опыт написания ВК для 1С? Нашёл на Инфостате DLL-Loader: ВК для 1С, там есть пример написания функций на Delphi, при вызове из 1С возвращает тип "Строка".
RESULT := trim(L.Text); Внимание вопрос - каким образом возвращать в 1С тип данных "Структура"? Какой тип данных нужно прописать в delphi? |
|||
1
mic_net
29.06.11
✎
11:54
|
Попробуй в delphi через двумерные массивы
|
|||
2
Serginio1
29.06.11
✎
17:08
|
Нужно создавать его на стороне 1С
|
|||
3
H A D G E H O G s
29.06.11
✎
17:12
|
Нужно создавать через AppDispatch
|
|||
4
Serginio1
29.06.11
✎
17:13
|
То есть имея Init(pConnection: IDispatch) вызвать AppDispatch
|
|||
5
H A D G E H O G s
29.06.11
✎
17:17
|
(4) Только не в самом Ините
|
|||
6
H A D G E H O G s
29.06.11
✎
17:18
|
Качаем TestVK от Ромикса. Качаем, качаем, там хорошая, рассово верная объектная модель.
|
|||
7
Serginio1
29.06.11
✎
17:24
|
(5) Ну разумеется. Имеется ввиду
На восьмерке не вызывал но новый должен работать через. Объект=OleVariant(pConnection).AppDispatch; ТипЗначения = Объект.Тип("Структура"); КвСтр = Новый(ТипЗначения); |
|||
8
Serginio1
29.06.11
✎
17:25
|
Вернее Объект.Новый(ТипЗначения);
|
|||
9
H A D G E H O G s
29.06.11
✎
17:28
|
(7) Рускоязычные в моем Дельфи не катят.
Объект.NewObject(ТипЗначения); и никак иначе. |
|||
10
H A D G E H O G s
29.06.11
✎
17:28
|
Вернее
Объект.NewObject("Структура"); |
|||
11
Serginio1
29.06.11
✎
17:31
|
(0) Насчет ВК по сути тебе нужен только pConnection, для получения интерфейсов. Не знаю как сейчас в восьмерке но в семерке для объектов реализующих только IDIspatch была проблема с передачей в параметрах объектов 1С, оут параметров. Я лично уже лет восемь пользуюясь ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019 |
|||
12
Serginio1
29.06.11
✎
17:32
|
(9) Да давно я уже Delphi в руках не держал. На C# все проще. А я вспоминал про этот NewObject, спасибо за напоминание
|
|||
13
Serginio1
29.06.11
✎
17:33
|
(9) Почему? Помню в семерке через олеварианты любые вызовы
|
|||
14
totparen
02.07.11
✎
22:36
|
Может у кого пример кода есть, который вернёт в 1С, скажем ТабилицуЗначений?
|
|||
15
Mashinist
02.07.11
✎
23:15
|
Tab:=GetNParam(paParams,1); - из 1С передается таблица значений и она попадает в дельфи - второй параметр метода если считать от нуля...
Error:=Error+IsValueTable(Tab); - IsValueTable - функция проверяющая действительно ли передали таблицу значений дальше выполним запрос и получим датасет if Error=0 then begin q:=Sql.OpenQuery(String(GetNParam(paParams,0))); если все нормально - сконвертируем его в ТЗ if (Assigned(q)) and (sql.ErrorFlag = 0) then begin Error:=ConvertDataSetToValueTable(q,Tab); end ConvertDataSetToValueTable(q,Tab); - конфертирует DataSet - тут уже нужно смотреть что есть у кого - в таблицу значений { Переводим DataSet в таблицу значений } function TAddSQLObject.ConvertDataSetToValueTable(q: TDataSet; Tab: OleVariant): integer; var Err: integer; i,j: integer; s: string; f: TField; Str: OleVariant; begin Err:=IsValueTable(Tab); if Err = 0 then begin Tab.Очистить; if Assigned(q) then begin for i:=0 to q.FieldCount-1 do begin f:=q.Fields[i]; if Ver1C = ver1cv8 then Tab.Колонки.Добавить(f.FieldName) else Tab.НоваяКолонка(f.FieldName,VT_EMPTY,VT_EMPTY,VT_EMPTY,f.FieldName,12); end; if Ver1C = ver1cv8 then begin while not q.EOF do begin Str:=Tab.Добавить; for j:=0 to q.FieldCount-1 do begin f:=q.Fields[j]; if not(q.Fields[j].Value=null) then begin s:=f.AsString; if f.DataType=ftFloat then Str.Установить(j,StringReplace(s,',','.',[rfReplaceAll])) else Str.Установить(j,s); end; end; q.Next; end; end else begin i:=0; while not q.EOF do begin Tab.НоваяСтрока; for j:=0 to q.FieldCount-1 do begin f:=q.Fields[j]; if not(q.Fields[j].Value=null) then begin s:=f.AsString; if f.DataType=ftFloat then Tab.УстановитьЗначение(i+1,j+1,StringReplace(s,',','.',[rfReplaceAll])) else Tab.УстановитьЗначение(i+1,j+1,s); end; end; inc(i); q.Next; end; end; end else begin Err:=1; Tab.Очистить; end; end; Result:=Err; end; function TAddSQLObject.CallAsFunc(lMethodNum: Integer; var pVarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}): HResult; stdcall; var q: TDataSet; Tab: OleVariant; begin case TMethods(lMethodNum) of ..................... methOpenQuery: begin { SQL -> OpenQuery } if sql.IsConnected then begin pStatusLine.SetStatusLine('Query is executing ...'); Tab:=GetNParam(paParams,1); Error:=IsString(GetNParam(paParams,0)); Error:=Error+IsValueTable(Tab); if Error=0 then begin q:=Sql.OpenQuery(String(GetNParam(paParams,0))); if (Assigned(q)) and (sql.ErrorFlag = 0) then begin Error:=ConvertDataSetToValueTable(q,Tab); end else if sql.ErrorFlag = 0 then begin sql.ErrorFlag:=1; Error:=1; end; q.Free; end else begin sql.ErrorFlag:=1; Error:=1; end; pStatusLine.ResetStatusLine; end else begin sql.ErrorFlag:=1; Error:=1; end; pVarRetValue:=Error; end; unction TAddSQLObject.IsValueTable(Tab: OleVariant): integer; var Err: integer; begin Err:=0; try {если ошибка, считаем переменную не таблицей значений} if Ver1C = ver1cv8 then Tab.Колонки.Количество else Tab.КоличествоКолонок; except Err:=1; end; Result:=Err; end; |
|||
16
H A D G E H O G s
02.07.11
✎
23:30
|
Лениво разбирать ахтунг код.
Тебе же сказали - юзать testvk от ромикса |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |