|
Аналог типа данных VBA Enum в 1С | ☑ | ||
---|---|---|---|---|
0
nikitaz
14.04.20
✎
23:29
|
Добрый день.
В VBA есть тип данных Enum. Например: Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2 = 1 End Enum Какой аналог Enum в 1с? Мне нужна эта информация при работе с COM-объектом CorelDraw, а именно для вызова процедуры COM-объекта, в которой параметры имеют тип Enum. Просто подставлять числа в качестве параметров не получается - пишет несоответствие типов. |
|||
1
080808Ник
14.04.20
✎
23:51
|
(0) так и пишешь:
КомСЭнамом = новый сом объект; КомСЭнамом.ТвояПроцедура(КомСЭнамом.SecurityLevel2); |
|||
2
H A D G E H O G s
14.04.20
✎
23:55
|
"Просто подставлять числа в качестве параметров не получается - пишет несоответствие типов."
получается. |
|||
3
nikitaz
15.04.20
✎
11:16
|
(1) Да, спасибо, так и есть.
CorelApp = Новый COMОбъект("CorelDraw.Application"); Сообщить (CorelApp.cdrAlignDistributeH.cdrAlignDistributeHAlignCenter); cdrAlignDistributeH - это и есть переменная с типом Enum. (2) Фу, как не красиво. |
|||
4
nikitaz
15.04.20
✎
11:28
|
(1) Не, не находит свойство. Это он завис прошлый раз, я думал, что отработал нормально )
Какой вообще правильный путь к этому свойству? CorelApp.Application.Имя_переменной.Значение_Переменной? или CorelApp.Application.Значение_Переменной? Вот такой это выглядит в VBA CorelApp.ActiveDocument.Pages(1).Layers(2).Shapes(6).AlignAndDistribute(cdrAlignDistributeHDistributeCenter,cdrAlignDistributeVDistributeCenter,cdrAlignShapesToCenterOfPage) |
|||
5
H A D G E H O G s
15.04.20
✎
11:36
|
(4) Посмотри в отладчике VBA, по точке останова значения перечислений в числовом виде и используй их в 1С. Это работает
|
|||
6
H A D G E H O G s
15.04.20
✎
11:37
|
Ну или
msgbox(cdrAlignDistributeHDistributeCenter) msgbox(cdrAlignDistributeVDistributeCenter) msgbox(cdrAlignShapesToCenterOfPage) |
|||
7
nikitaz
15.04.20
✎
12:17
|
(5) Я понимаю, о чем Вы говорите. Я документацию посмотрел по Корелу.
Syntax: Enum cdrAlignDistributeH Name Value Description cdrAlignDistributeHNone 0 Specifies no horizontal alignment and distribution cdrAlignDistributeHAlignRight 1 Specifies right alignment cdrAlignDistributeHAlignLeft 2 Specifies left alignment Но при вызове из 1с процедуры с указанием числовых параметров, например вот так, как ниже, возвращается ошибка "Несоответствие типов". shp.AlignAndDistribute (0, 1, 3) Проблема, видимо, в том, что в 1с нету типа числа integer. А процедура требует тип Integer. Как привести к этому типу в 1с - ума не приложу. Поэтому решил поискать путь к самой константе. Но пока безуспешно. |
|||
8
H A D G E H O G s
15.04.20
✎
12:46
|
(7) Покажите весь код
|
|||
9
nikitaz
15.04.20
✎
13:09
|
|
|||
10
H A D G E H O G s
15.04.20
✎
13:17
|
Скинь файлик с шаблоном, можно прямо на [email protected]
|
|||
11
Serginio1
15.04.20
✎
14:14
|
Вообщето есть Новый COMSafeArray(<ТипЭлемента>, <<разм0>,...,<размN-1>>)
Параметры: <ТипЭлемента> (обязательный) Тип: Строка. Определяет тип элемента COMSafeArray. Тип элемента задается строкой и может принимать одно из следующих значений: VT_I4 - знаковое целое 4 байта; Можно создать 1 элемент и засунуть в него значение. Но ввообще то enum в сом это отдельный тип |
|||
12
nikitaz
15.04.20
✎
16:50
|
(11) Сейчас попробую через COMSafeArray.
Вот у меня вопрос основной - как достучаться до переменной типа Enum в COM объекте? Не могу я до нее добраться никак. Вот так пробовал: CorelApp.Application.Имя_Переменной.Значение_Переменной CorelApp.Имя_Переменной.Значение_Переменной CorelApp.Значение_Переменной CorelApp.Application.Значение_Переменной |
|||
13
nikitaz
15.04.20
✎
17:02
|
(11) На скорую руку через SafeArray не вышло. Есть есть возможность - напишите, пожалуйста, пример для моего случая.
Мне нужно в метод AlignAndDistribute передать из 1с три значения Integer. Т.е. shp.AlignAndDistribute (0, 1, 3) Т.е. создание массива, добавление трех элементов 0, 1, 3 и передача значений в метод AlignAndDistribute |
|||
14
dezss
15.04.20
✎
17:10
|
(13) Показывай как делал.
|
|||
15
nikitaz
15.04.20
✎
17:14
|
(14) Делал через ж..., потому что надо читать документацию. Собственно, как обычно.
|
|||
16
dezss
15.04.20
✎
17:23
|
(15) Ты создал массив из 2-х элементов (нумерация же с 0 вроде должна быть).
Потом пихаешь в 1, 2 и 3 элемент массива (2 и 3 вроде даже нет) значения. Ну как-то не очень выглядит))) |
|||
17
nikitaz
15.04.20
✎
17:37
|
(16) Спасибо! Переделал. Уже легче, но к элементам нельзя обратиться вот так просто, насколько я понимаю.
Вот ошибка: {ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Получение элемента по индексу для значения не определено shp.AlignAndDistribute (Массив[0],Массив[1],Массив[2]) |
|||
18
v77
15.04.20
✎
17:47
|
(0) Да ну нафиг. Всю жизнь числами передавали
|
|||
19
nikitaz
15.04.20
✎
17:50
|
(18) Excel.Application принимает числа из 1с, CorelDraw.Application - нет.
|
|||
20
nikitaz
15.04.20
✎
17:58
|
Вот текст ошибки дословно:
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (AlignAndDistribute) shp.AlignAndDistribute (3,0,2) по причине: Типы не совпадают (3) |
|||
21
v77
15.04.20
✎
17:59
|
(19) Да прям
|
|||
22
nikitaz
15.04.20
✎
18:03
|
Самое идиотское, что в VBA вот этот код отрабатывает без ошибок
CorelApp.ActiveDocument.Pages(1).Layers(3).Shapes(8).AlignAndDistribute 3, 0, 2 |
|||
23
v77
15.04.20
✎
18:15
|
А если так :)
shp.AlignAndDistribute (Цел(3),Цел(0),Цел(2)) |
|||
24
nikitaz
15.04.20
✎
18:25
|
(23) Пробовал уже
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (AlignAndDistribute) shp.AlignAndDistribute (Цел(3),Цел(0),Цел(2)) по причине: Типы не совпадают (3) |
|||
25
v77
15.04.20
✎
19:02
|
Щас проверил. 1С передает тип vt_i4
|
|||
26
v77
15.04.20
✎
19:08
|
В справке Corel для C++ и C# стоит int
всё должно работать |
|||
27
nikitaz
15.04.20
✎
19:11
|
(25) А как проверили? Научите, плиз.
Вот именно, что должно работать... Но выдает ошибку. Причем вот это, например, отрабатывает нормально: CorelApp.Application.CreateDocumentFromTemplate (Справочники.ПутиКИнформацииНаСервере.ШаблонЭскиза.ПолныйПуть) Справочники.ПутиКИнформацииНаСервере.ШаблонЭскиза.ПолныйПуть - строка. Вот ссылка на этот метод AlignAndDistribute https://community.coreldraw.com/sdk/api/draw/20/m/shape.alignanddistribute |
|||
28
Serginio1
15.04.20
✎
19:29
|
shp.AlignAndDistribute (Массив.GetValue(0),Массив.GetValue(1),Массив.GetValue(2))
По умолчанию в 1С вроде как VT_I4 ну и понятие Integer это знаковое попробуй VT_I1 - знаковое целое 1 байт; VT_I2 - знаковое целое 2 байта; VT_I4 - знаковое целое 4 байта; VT_I8 - знаковое целое 8 байт; VT_INT - знаковое целое; VT_UI1 - беззнаковое целое 1 байт; VT_UI2 - беззнаковое целое 2 байта; VT_UI4 - беззнаковое целое 4 байта; VT_UI8 - беззнаковое целое 8 байт; VT_UINT - беззнаковое целое; |
|||
29
v77
15.04.20
✎
19:35
|
(28) А чо толку. 1С прочитает из массива в свое значение и отправит в AlignAndDistribute как VT_I4
|
|||
30
v77
15.04.20
✎
19:35
|
Хотя щас попробую
|
|||
31
Serginio1
15.04.20
✎
19:35
|
https://en.wikipedia.org/wiki/Enumerated_type#Visual_Basic/VBA
Enumerated datatypes in Visual Basic (up to version 6) and VBA are automatically assigned the "Long" datatype and also become a datatype themselves: Попробуй VT_I8 VT_INT |
|||
32
Serginio1
15.04.20
✎
19:37
|
Проще тогда написать на бейсике дллку или другом языке и дернуть через Ком
|
|||
33
v77
15.04.20
✎
19:45
|
Да не в бабине дело
|
|||
34
v77
15.04.20
✎
19:47
|
Фокус с массивом не прокатывает кстати
|
|||
35
v77
15.04.20
✎
19:54
|
А попробуй shp.AlignAndDistribute(3,3,2)
|
|||
36
Serginio1
15.04.20
✎
20:03
|
Работа 1С в внешними COM-объектами
Смотри другой аналог либо пиши на васике дллку |
|||
37
H A D G E H O G s
15.04.20
✎
20:10
|
Киньте пример, где не нужен какой то файл или с файлом
|
|||
38
nikitaz
15.04.20
✎
20:37
|
(35) Попробовал. Та же ошибка.
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute) shp.AlignAndDistribute(3,3,2) по причине: Типы не совпадают (3) (36) Ссылка битая. (37) Я сбросил кореловский файл на почту выше. Могу сбросить обработку. Но, в принципе, код я написал выше полностью. Мужики, это смешно, но вот этот метод работает. shp перемещается на экране куда нужно, ошибок нет. shp.SetPosition (10,30) |
|||
39
Serginio1
15.04.20
✎
21:17
|
Работа 1С в внешними COM-объектами там почему то склеилась ссылка
Суть в том, что с типами в 1С беда, а в VBA конвертация типов которая должна быть автоматом То есть нужно искать аналог этой функции с простыми типами |
|||
40
nikitaz
15.04.20
✎
21:34
|
(39) Спасибо!
Как минимум радует, что это не только я индеец, но 1с тоже |
|||
41
nikitaz
15.04.20
✎
21:44
|
Но все-таки может как-то можно добраться до этих Enum констант через точку?
|
|||
42
v77
15.04.20
✎
23:59
|
Короче, раскопал я. Enum тут вабще не причем. Параметры по умолчанию в OLE Corel не работают. Нужно передавать все параметры и всё будет работать. Если в параметрах структуры, то создавать структуры методами типа Application.CreateStructPaletteOptions()
Application.CreateStructCreateOptions() и т.д. |
|||
43
v77
16.04.20
✎
00:18
|
так вот попробуй
AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено) |
|||
44
v77
16.04.20
✎
10:24
|
Автор, ты бы хоть доложил о результатах и спасибу сказал. Полдня на тебя убили вчера и ни ответа ни привета.
|
|||
45
nikitaz
16.04.20
✎
12:42
|
(44) Спасибо огромное за помощь! Только добрался до компа обратно.
К сожалению, имеем вот такое {ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute) shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено) по причине: Типы не совпадают (0) Попробовал Неопределено поменять на 0 (так как последний параметр, если копнуть глубже, заканчивается типом Real), не вышло {ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute) shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,0) по причине: Типы не совпадают (0) Логику я понял. Сейчас погоняю с разными параметрами, отпишусь. |
|||
46
nikitaz
16.04.20
✎
12:45
|
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
shp.AlignAndDistribute(3,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1) по причине: Типы не совпадают (9) |
|||
47
nikitaz
16.04.20
✎
12:46
|
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
shp.AlignAndDistribute(3,1,2,1,1) по причине: Типы не совпадают (5) |
|||
48
nikitaz
16.04.20
✎
12:47
|
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
shp.AlignAndDistribute(3) по причине: Неверное число параметров |
|||
49
nikitaz
16.04.20
✎
12:48
|
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,Неопределено,1) по причине: Типы не совпадают (1) |
|||
50
v77
16.04.20
✎
12:58
|
да шош такоя
|
|||
51
v77
16.04.20
✎
13:04
|
А так
AlignAndDistribute(3,0,2,0,Ложь,2,0,0,NULL) |
|||
52
v77
16.04.20
✎
13:35
|
Короче, ему нужно в последний параметр засунуть вместо Неопределено Rect
Application.CreateRect(0,0,0,0) или пустой IDispatch и будет работать |
|||
53
v77
16.04.20
✎
13:36
|
Как в 1с создать пустой IDispatch я не знаю
|
|||
54
nikitaz
16.04.20
✎
13:37
|
{ВнешняяОбработка.CorelTest.Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (AlignAndDistribute)
shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,NULL) по причине: Типы не совпадают (0) |
|||
55
nikitaz
16.04.20
✎
13:38
|
Стоп, есть идея. Последний параметр - это класс. Сейчас создам класс и передам этой скотине
|
|||
56
nikitaz
16.04.20
✎
13:40
|
Отработало!!!!
v77, спасибо громадное за помощь! RectClass = Новый COMОбъект("CorelDraw.Rect"); shp.AlignAndDistribute(3,0,2,0,Ложь,2,0,0,RectClass) |
|||
57
v77
16.04.20
✎
13:52
|
(56) только в цикле не надо такое делать :)
|
|||
58
Serginio1
16.04.20
✎
13:57
|
NULL это DBNull, аналог null это неопределено
|
|||
59
v77
16.04.20
✎
13:58
|
(58) мы в курсе. просто методом тыка тыкали
|
|||
60
v77
16.04.20
✎
13:59
|
Там надо именно IDispatch подсунуть
|
|||
61
nikitaz
16.04.20
✎
14:25
|
(57) Эт понятно. Главное сдвинуть с места паровоз этот. Дальше легче ))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |