Очень приятное впечатление. Вдвойне приятно наличие исходников. Сам хотел заморочится в сторону черепашьей графики ибо дочке уже 8 лет и пора бы ей уже программировать и кодить.
Добрый день! Не могу получить координаты мыши на управляемых формах, игнорируется внешнее событие.
&НаКлиенте
Перем Драйвер, Мышь;
//В форме в " ВнешнееСобытие" прописал
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
стр=1; //поставил точку останова что бы посмотреть "Данные" но в неё не заходить
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии()
ПодключитьКомпоненту();
КонецПроцедуры
&НаСервере
Процедура ПодключитьКомпоненту()
Попытка
Адрес = ПоместитьВоВременноеХранилище(Обработки.РедакторОконУФ.ПолучитьМакет("NativeDraw_2_3"));
Если ПодключитьВнешнююКомпоненту(Адрес, "КомпонентаРисования", ТипВнешнейКомпоненты.Native) Тогда
Драйвер = Новый("AddIn.КомпонентаРисования.NativeDraw");
Драйвер.Ввод_УстановитьПерехват();
Драйвер.Ввод_АктивироватьПерехватМыши();
Мышь = Новый СписокЗначений;
Мышь.Добавить("ДвижениеМыши");
Мышь.Добавить("НажатиеЛевойКнопкиМыши");
Мышь.Добавить("ОтпусканиеЛевойКнопкиМыши");
Для каждого Элемент Из Мышь Цикл
Драйвер.Ввод_ЗадатьПерехватДействияМыши(Элемент.Значение, Ложь);
КонецЦикла;
Сообщить(Драйвер.Версия); // сообщение выводится
Иначе
Отказ = Истина;
КонецЕсли;
Исключение
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Показать
Кто знает почему не срабатывает точка останова на УФ ? Второй день мучаюсь!!!
С уважением, Андрей.
(16) гыук320, так беглым взглядом пробежался, объект Драйвер при завершении процедуры ПодключитьКомпоненту "разрушается" и соответственно срабатывает ф-ия деинициализации всего в компоненте. Т.е. в процедуре эта переменная как бы локальная у вас.
Надо вам переменную драйвер хранить в другом месте. Позднее постараюсь сделать пример с управляемыми формами
(16) гыук320, я тут тыкал-тыкал, замучился, но решение оказалось простым, в твоём случае нужно процедуру ПодключитьКомпоненту() исполнять на клиенте
вот так, как предлагаю:
ДД. Библиотека огонь. Сама идея очень красивая.
Но столкнулся в своей задаче (хотелке) с небольшой трудностью. Я хочу масштабировать графики в зависимости от изменения размера формы. Сможете подсказать как, это можно реализовать....
можно конечно через задержки, но данное решение не красивое. Может имеет смысл к библиотеке дописать инструментарий, например вызов внешнего события при изменении размера формы...(если конечно такое возможно)
(22) Потому что с точки зрения объектного программирование это правильный подход. Произошло событие - вызове процедуру. Не нужно в каждой форме писать кучу одинакового кода по отлавливанию тех или иных событий, если нужно событие обработать оно просто вызывается.
p.s. мне до сих пор не понятно, почему в 1С не делают некоторых событий у объектов. Иногда хочется сделать бантик для пользователя, а приходиться отказывать потому что нужно наворотить просто уйму сложного и не понятного кода.
(20) Natalex95, сделал такую штуку как отлов событий окон. Если окно переместилось или изменило размер, то придёт событие (предварительно вы должны установить перехват и указать какое окно вам нужно отслеживать).
(28) Steelvan, используйте как хотите, только саму по себе компоненту не продавайте. Ну и не должно быть публикаций с вашей стороны, где вы как просто раздаёте компоненту, так и продаёте за $m c примером.
А какую-нибудь полезную обработку, где вы используете компоненту - пожалуйста.
Тоже делал библиотеку для рисования, но после того как подрубил к 1С .NET по методу Сергея Смирнова - просто пользую классы Grafics и Bitmap из 1С напрямую
(30) oleg_km, да видел, прикольно, круто и интересно. Но это нужен .NET и, на мой взгляд, как-то код выглядит не красиво. Кроме того, компонента ещё включает таймер, ввод, хуки, окна ...
Большое спасибо за вашу огромную работу, которая пригодится мне лично для моей задачи.
На рынке есть товарищи, которые сделали внешнюю компоненту для работы с графикой из 1с.
НО! Они продают ее за деньги. БОЛЬШИЕ!
Это неправильно не мой взгляд. Такая политика обречена.
ПерваяСистема, я поддерживаю вашу политику. Открытость вашей внешней компоненты, возможность дополнять ее своими функциями.
Мне пока перечисленных функций хватает.
В скором времени планирую написать пару игрушек в 1с с помощью вашей компоненты.
У меня предложение к вам. Пожалуйста, упакуйте ваши материалы в 1 архив и выложите. Пусть он будет условно за 5 sm. На мой взгляд, ваша работа стоит и больше.
Внешнюю компоненту предлагаю выложить БЕСПЛАТНО.
Кто хочет - пусть пользуют, Кому надо, скачают ваши примеры за sm.
Отключил попытку. Выскочило описание ошибки. Во всех обработках, при подключении внешней компоненты одна и та-же ошибка:
{Форма.Форма.Форма(373)}: Ошибка при вызове метода контекста (ПодключитьВнешнююКомпоненту)
Если ПодключитьВнешнююКомпоненту(Адрес, "КомпонентаРисования", ТипВнешнейКомпоненты.Native) Тогда
по причине:
Использование синхронных методов на клиенте запрещено!
Открыл типовую конфигурацию БП 2.0 - все обработки запускаются нормально.
В пустой тестовой конфигурации ни одна обработка не запускается.
Автор, просьба объяснить странное поведение.
Как я понимаю, в типовой конфигурации при старте какие-то типовые вещи что-то делают возможным подключение внешних компонент?
(36) pvlunegov, а не это новый прикол от 1С
решается так
в свойствах конфигурации в категории "Совместимость" нужно установить подходящее свойство для "режим использования синхронных вызовов".
Ну или юзать НачатьПодключениеВнешнейКомпоненты
Я открывал ваши обработки в обычном режиме. Дело в том, что обработки заработали только в типовой конфигурации, в пустой ничего не запускается.
ПерваяСистема, ваш совет по поводу синхронных вызовов сработал, заработало!
Хорошо бы было в ваших обработках добавить управляемые формы, с дублированием функционала, но это так, плюшка.
Самое главное, что все работает.
НЕпонятное поведение - после запуска обработки "Буфер обмена", в которой более новая версия dll, обработка "Танк" перестала работать. Пишет ошибку
"{Форма.Форма.Форма(465)}: Метод объекта не обнаружен (Ввод_УстановитьПерехват)
ND.Ввод_УстановитьПерехват();
"
Пробовал прямо в обработке заменить файл dll на более свежую версию, не работает все равно.
Помогает только очистка кеша.
Просьба пояснить, как быть. Как использовать все функции всех обработок? Включены ли все эти функции в самую свежую версию dll?
Или нужно использовать под каждую функцию свою версию dll ?
(39) pvlunegov, ну пример "Танк" самый винрарный, там все ф-ии под старую dll, которая вшита в обработку. Подключение компоненты из макета вот так вот глючит да. Для 1с это одна и та же компонента ...
Чтобы все примеры работали под новую компоненту, надо все старые переписать. Там изменений очень мало
Как понять, вшита в обработку?
В обработке танк, используется макет, в котором двоичный файл dll.
Если его заменить, будет другая версия dll "вшитая" в обработку. Верно?
Таким образом, если заменить макет на файл новой версии dll, мы "обновим" версию dll "вшитую" в обработку. Верно?
Или может, в обработке используется старый синтаксис функций, которые в новой версии dll либо отсутствуют, либо заменены?
Как же вы пишите вашу dll, если новые версии не поддерживают старый синтаксис?
А как же ключевое понятие совместимости версий, краеугольный камень всего здания поддержки dll ?
Прошу вас ответить на мои вопросы и исправить эти косяки.
Вы просите денег за вашу dll поэтому я, как потребитель, имею право требовать определенные базовые вещи.
Или может, в обработке используется старый синтаксис функций, которые в новой версии dll либо отсутствуют, либо заменены?
- Да
Как же вы пишите вашу dll, если новые версии не поддерживают старый синтаксис?
А как же ключевое понятие совместимости версий, краеугольный камень всего здания поддержки dll ?
- Понимаете, предыдущая версия мне показалась недостаточно логичной и с неверной архитектурой. Зачем мне обеспечивать обратную совместимость для небольшого числа человек, которые скачали компоненту. Ради нескольких людей я должен таскать старый и плохой код из версии в версию.
Прошу вас ответить на мои вопросы и исправить эти косяки.
Вы просите денег за вашу dll поэтому я, как потребитель, имею право требовать определенные базовые вещи.
(43) Dvornik, единственное или не единственное, подключение компонент на 8.2 и 8.3 не отличается.
Единственное, в 8.3.6 они там что то сделали с памятью и я переделал. Но работает и там и там
Возник вопрос по буферу обмена. Если в буфере не картинка, то следующий код ломает буфер обмена, пока я 1С не закрою.
Выглядит так:
1. копирую строку из текстового редактора
2. жму кнопку в 1С (код ниже)
После этого я ни в одном приложении не могу ни ставить ту строчку из буфера, ни скопировать что-то новое.
3. закрываю 1С Предприятие (не просто обработку, а предприятие полностью)
Все опять работает
Если же в буфере картинка, то работает на УРА
Изобр = Драйвер.Изображение_Создать("БуферОбмена");
Если СокрЛП(Изобр) = "" Тогда
Возврат;
КонецЕсли;
Ширина = Драйвер.Изображение_ПолучитьШирину(Изобр);
Высота = Драйвер.Изображение_ПолучитьВысоту(Изобр);
Холст = Драйвер.Холст_Создать(Ширина, Высота, 0);
Драйвер.Рисование_Изображение(Холст, Изобр, 0, 0, Ширина, Высота, 0, 0, 0);
двоичныеДанные = Драйвер.Холст_ДвоичныеДанные(Холст);
КартинкаИзБуфера = Новый Картинка(двоичныеДанные);
изБуфера = ПоместитьВоВременноеХранилище(двоичныеДанные);
Драйвер.Изображение_Удалить(Изобр);
Драйвер.Холст_Удалить(Холст);
Показать
Драйвер - внешняя компонента
изБуфера - переменная формы типа строка для отображения картинки на экране
(51) monkbest, нормально всё, я взял обработку заменил компоненту на новую 2.6.1, при копировании текста ничего не ломается и не виснет, платформа 8.3.8
(55) не понял, а в каком из примеров какие версии библиотеки?
было бы неплохо в именах файлов для скачивания написать версии dll
я скачал Пример "Изображения: Буфер обмена" и Пример "Танк"
собственно в первой ошибка проявляется, я сохранил макет на жесткий диск и в свойствах файла на закладке "подробно" увидел 2.5.0.0
где взять 2.6.1?
(52) Dvornik, можно, берёшь картинку (не файл, а объект), кладёшь во временное хранилище, получаешь адрес, этот адрес приравниваешь к декорации (она строка)
(52) Dvornik, вот рабочий код по отображению картинки:
на форме переменная формы строка неограниченной длины "изБуфера", которую я поместил на форму, у поля указал вид "полеКартинки"
Все работает с dll 2.5, с 2.6.1 зависает при инициализации как у Вас
Изобр = Драйвер.Изображение_Создать("БуферОбмена");
Если СокрЛП(Изобр) = "" Тогда
Сообщить("не то");
Возврат;
КонецЕсли;
Ширина = Драйвер.Изображение_ПолучитьШирину(Изобр);
Высота = Драйвер.Изображение_ПолучитьВысоту(Изобр);
Холст = Драйвер.Холст_Создать(Ширина, Высота, 0);
Драйвер.Рисование_Изображение(Холст, Изобр, 0, 0, Ширина, Высота, 0, 0, 0);
двоичныеДанные = Драйвер.Холст_ДвоичныеДанные(Холст);
изБуфера = ПоместитьВоВременноеХранилище(двоичныеДанные);
Драйвер.Изображение_Удалить(Изобр);
Драйвер.Холст_Удалить(Холст);
Скачал dll отдельно, там был 2.6.1.
Заменил в своей обработке (с 2.5 она в принципе работала, но падала, если в буфере обмена не картинка)
При открытии стало зависать намертво, т.е. 2.6.1 не инициализируется, а 2.5 инициализируется в УФ на ура
УФ, 1С:Предприятие 8.3 (8.3.7.1860)
Прилепил саму обработку
Вот код инициализации:
&НаСервере
Функция ПолучитьМакетСКомпонентой()
Возврат ПолучитьОбщийМакет("NativeDraw_2_6_1");
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Попытка
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ПутьККомпоненте = "ОбщийМакет.NativeDraw_2_6_1";
#Иначе
Макет = ПолучитьМакетСКомпонентой();
Каталог = КаталогВременныхФайлов();
ПутьККомпоненте = Каталог + "NativeDraw_2_6_1.dll";
Макет.Записать(ПутьККомпоненте);
#КонецЕсли
//Макет = ПолучитьМакетСКомпонентой();
//Адрес = ПоместитьВоВременноеХранилище(Макет);
//УстановитьВнешнююКомпоненту("ОбщийМакет.NativeDraw_2_5");
Если ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "КомпонентаРисования", ТипВнешнейКомпоненты.Native) Тогда
Драйвер = Новый("AddIn.КомпонентаРисования.NativeDraw");
Иначе
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
(66) Dvornik, не знаю, кажется, что дело не в винде и не в платформе. Я пробовал на 8.3.5 8.3.6 и 8.3.7, win 7 и win 10, с установленным VS 2015 и без.
Сдается мне, что проблема в разрядности. Автор писал, что она 32.
В мануалах написано, что надо в архив класть файл манифеста и версии компонент разной разрядности и ОС.
Еще в мануалах написано, что для работы Native в тонком клиенте (УФ) надо вызвать метод УстановитьВнешнююКомпоненту(...), этот метод материться, что компонента не та
Пробовал исходники скомпилить по 64, но студия меня послал лесом с кучей errrr. Не силяен в этой IDE и не знаю, что надо переделать в проекте, чтобы сделать 64х компоненту для теста.
Но эта версия не дает ответа на вопрос о том, почему 2.5 работает, в итоге 6sm$ выкинул на ветер, т.к. хотел реализовать в своей базе багтрекере вставку принтскринов. 2.5 плохо работает с буфером, 2.6.1 не работает
(67) monkbest, опишите какая винда какая конфигурация (или самописная?) какая платформа (желательно чтобы последняя) попробую у себя создать такие же условия
А я попробовал и в файловом варианте и в 8.2, и в 8.3, и в серверном, и на разных компьютерах. К слову на всех 64-разрядная система. Ошибка, можно сказать, та же, "установка не выполнена."
(71) Добрый день!
А можете выложить пример для управляемых форм.
Пока на управляемых формах заработала компонента из примера ""Тест компоненты", да и то частично.
объект создается, а на любую попытку нарисовать что-то программно ругается:
{Форма.ФормаУпраляемая.Форма(36)}: Ошибка при вызове метода контекста (Рисование_Треугольник)
Драйвер.Рисование_Треугольник(Холст, 170, 619, 81, 757, 262, 753, 1, Драйвер.Рисование_ПолучитьЦвет(200, 255, 0, 0));
по причине:
Неверный аргумент
Добрый день.
(79) newdigger, так вы рисуйте линии потолще, мне подошло.
(75) sherbv, у меня версия 2.6 не взлетела, жду решения. Windows 10 поставить не могу.
проблема, как заметил newdigger :
при подключении компоненты версии 2.6.1 намертво виснет на ПодключитьВнешнююКомпоненту. (платформы пробовал 8.2 и 8.3)
Еще, при подключении компоненты версии 2.6.1 намертво виснет на ПодключитьВнешнююКомпоненту.
Хотя при подключении компоненты, которая входит в макет обработки NativeDraw_ТестКомпоненты.epf - не виснет.
ОС Windows Server 2008 R2 (под учеткой администратора)
1C 8.3.8.1784
Толстый клиент
Режим: Серверный (сжатие: усиленное)
Заметил еще одну неприятную особенность.
Строка моего кода:
ЭлементыФормы.Холст.Картинка = Новый Картинка(Драйвер.Холст_ДвоичныеДанные(Холст));
Здесь возникает утечка памяти. Если постоянно перерисовывать картинку, то при каждом проходе этой строки выделяется память.
Я думал, что что-то делаю не так. Но в примере с танком тоже идет утечка памяти.
(82) newdigger, та да, только это не утечка, но то есть это со стороны 1С такая фигня, но она полностью очищается если памяти не хватает (вызывается сборщик мусора), это всё на стороне платформы
(85) и все таки, у Вас есть какие-нибудь соображения по поводу того, что компонента не загружается на Windows Server 2008 R2?
У меня, например, Visual Studio 2015 предлагает компиляцию только на две платформы - W8 И W10. Может быть с этим связано?
(86) newdigger, ага, ща попробовал на 7ке, действительно виснет, перекомпилил на Visual Studio 2015 - Windows XP (v140_xp) и вроде заработало, кстати сделал отрисовку многоугольников
(87) не заработала в режиме управляемого приложения.
1С:Предприятие 8.3 (8.3.6.2237) Бухгалтерия предприятия, редакция 3.0 (3.0.42.37) Win 7 максимальная х64
Вот одна из попыток запуска (Модуль управляемого приложения, ПриНачалеРаботыСистемы):
АдресВнешнейКомпоненты = ПоместитьВоВременноеХранилище("ОбщиеМакеты.NativeDraw_2_6");
Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,"КомпонентаРисования");
#Если ТонкийКлиент Тогда
Если Не Результат Тогда
НачатьУстановкуВнешнейКомпоненты(,АдресВнешнейКомпоненты);
Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,"КомпонентаРисования");
КонецЕсли;
#КонецЕсли
Показать
В этом варианте закинул dll в зип вместе с манифестом и загрузил в общий макет. Пляшу долго уже. При запуске в тонком клиенте выдает:
"Установка внешней компоненты не выполнена. В процессе установки произошла ошибка. Возможно, отсутствует компонента для используемого клиентского приложения."
При запуске в толстом клиенте виснет намертво, а если подождать пару минут, так еще и конфигуратор зависает.
(90) у меня vc_redist.x64 стоит версии 14.0.23.506 (твоя ссылка на более раннюю версию). Попробовал исходники компилировать, слишком много ошибок критических выдает 2_6_2. Жаль нет времени пока разбираться. Но я прям ОЧЕНЬ хочу этот продукт в рабочем виде xD
(94) я их не качал, зачем тратить драгоценные денюшки, коле всё остальное не работает xD
Качал танк и ввод, взлетел только танк в обычном приложении, ввод не взлетел ни в каком
(95) pvb2003, примитивы самые последние с библиотекой 2.6.2, они работают как и в обычном, так и в "необычном" приложении. Остальные старые версии, потом будут обновлены
У меня нет возможности проверить на Win 7.
Я пробую на Windows Server 2008 R2. Тут вообще странная картина. Запускаю - работает. Закрываю 1С, открываю заного, открываю форму, где используется компонента - зависает. И так постоянно - то работает, то зависает. От чего зависит - не пойму. Работаю под учеткой админа.
Хотя есть одна зависимость - запускаю 1С в режиме совместимости с Windows XPSP3. Если запускать без режима совместимости, то виснет всегда.
Для надежности запускал на двух серверах - картина одинаковая.
(97) newdigger, сервер x64?
Я не поленился и запустил на виртуалке Windows 7 (x32), потестировал пример "Примитивы". Просто установил голую Windows 7, установил 1С, открыл обработку как обычном приложении, так и в управляемом. Пробовал закрыть 1С, снова открыть, несколько раз переоткрыть. Всё работает, ничего не виснет, платформа 8.3.8, никаких доп драйвер и паков не устанавливал