Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) OleExSup.dll - двумерный массив для Индикатора клиента (число прочтений - 13065 )
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
OleExSup.dll - двумерный массив для Индикатора клиента
05. Августа 2011 :: 20:37
Печать  
Доброго времени суток, есть задача подрубить к 1с 7.7 индикатор клиента LPOS-II-VFD USB, есть штатная обработка на 1с8, работает замечательно, но мне, повторюсь нужно привязать на 1с7. Итак что мы имеем, получается подключиться к индикатору клиента, но при передаче строк на него есть проблема, в 1с8 используется двумерный массив
Код
Выбрать все
МассивСтрок = Новый Массив();
	МассивСтрок.Добавить(Новый Структура("Текст, БегущаяСтрока", Стр1, ТаблицаСтрок[0].БегущаяСтрока));
	МассивСтрок.Добавить(Новый Структура("Текст, БегущаяСтрока", Стр2, ТаблицаСтрок[1].БегущаяСтрока));
//далее мы пихаем это все в индикатор
Ответ = Объект.Драйвер.ВывестиСтрокуНаДисплейПокупателя(Объект.ИДУстройства, МассивСтрок); 


Тут вопросов нет
Нашел компоненту для 1с7 для создания массивов, но походу  массив нельзя/или не знаю как, впихнуть структуру или в данном случае списокЗначений для 1с7
максимум до чего дошел вот этот код
Код
Выбрать все
		    БегущаяСтрока="Истина";
	ТекстСтр1="Тест1";
	ТекстСтр2="Тест2";

	Стр1 = СоздатьОбъект("СписокЗначений");
	Стр1.ДобавитьЗначение(ТекстСтр1,"Текст");
	Стр1.ДобавитьЗначение(БегущаяСтрока,"БегущаяСтрока");

	Стр2 = СоздатьОбъект("СписокЗначений");
	Стр2.ДобавитьЗначение(ТекстСтр2,"Текст");
	Стр2.ДобавитьЗначение(БегущаяСтрока,"БегущаяСтрока");

	Измерение=2;
	Индексы=1;
 	  Массив= СоздатьОбъект("OLESafeArray");
	Массив.Создать(Массив.VarTypes.VT_VARIANT, Измерение, Индексы);
	Массив.УстановитьЗначение(0, 0, Стр1);
	Массив.УстановитьЗначение(1, 0, Стр2);

 


Но кроме того что 1с-ка тупо вылетает без ошибки ничего не выходит, плюс не знаю как правильно его передать потом в метод Объект.Драйвер.ВывестиСтрокуНаДисплейПокупателя(Объект.ИДУстройства, МассивСтрок) как в 1с8
В данном случае передать просто в метод "Массив" ник чему не приводит
Кто чем может помочь, буду очень рад, уже 2 дня ладу дать не могу Печаль((

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #1 - 06. Августа 2011 :: 04:46
Печать  
1. в восмерочном примере у тебя создается не двумерный массив, а одномерный с двумя элементами типа Структура.
аналогичный код для 7:
Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2);
Массив.УстановитьЗначение(0, Элемент1);
Массив.УстановитьЗначение(1, Элемент2);

Но в коде для 8 применена Структура. В общем случае в 7 нет аналога структуре. Подойдет ли одноименный объект из 1с++ я не знаю.

2. если все таки допускается разложить структуру во второе измерение, то код будет таким:
Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2, 2);//2 и 2 - размерность первого и второго измерения соответственно
Массив.УстановитьЗначение(0, 0, ТекстСтр1);
Массив.УстановитьЗначение(0, 1, БегущаяСтрока);
Массив.УстановитьЗначение(1, 0, ТекстСтр2);
Массив.УстановитьЗначение(1, 1, БегущаяСтрока);


3.
Вызов метода с передачей массива делается так:
OLEExSup = СоздатьОбъект("OLEExSup");
OLEExSup.ВызватьОЛЕМетод(Объект.Драйвер, "ВывестиСтрокуНаДисплейПокупателя", Объект.ИДУстройства, МассивСтрок);



ps
а вообще не плохо было бы посмотреть техническое описание метода ВывестиСтрокуНаДисплейПокупателя
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #2 - 06. Августа 2011 :: 10:31
Печать  
спасибо, в следующем будут ссылки
  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #3 - 06. Августа 2011 :: 10:31
Печать  
второй вариант вроде пробовал, но не знал как его вывести правильно на дисплей, сейчас еще раз попробую, спасибо,
а на счет тех описания, к сожалению все очень скудно, к этой библиотеке я не нашел подходящего описания, все что есть
тут и тут, там есть еещ вторая библиотека lpos_vfd_lcd.dll - ее использовать не удалось да и описания под нее для 1с нет, есть только под С и делфи, под 1с только lpos_usb_vfd


===== Добавлено

Попробовал Ваш код, вышел вот так:
Код
Выбрать все
    БегущаяСтрока="1";  
	НеБегущаяСтрока="0";
	ТекстСтр1="Тест1";
	ТекстСтр2="Тест2";

	Измерение=2;
	Индексы=2;
    Массив= СоздатьОбъект("OLESafeArray");
	Массив.Создать(Массив.VarTypes.VT_VARIANT , Измерение, Индексы);
	Массив.УстановитьЗначение(0, 0, ТекстСтр1);
	Массив.УстановитьЗначение(0, 1, БегущаяСтрока);    
	Массив.УстановитьЗначение(1, 0, ТекстСтр2);
	Массив.УстановитьЗначение(1, 1, НеБегущаяСтрока);    

	OLEExSup = СоздатьОбъект("OLEExSUP");
	//Передаем массив в метод объекта
	Ответ = OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив); 



Но к сожаление 1с-ка ответила вот этим
Код
Выбрать все
Ответ = OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив);
{C:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\РАБОЧИЙ СТОЛ\POSUA\ИНДИКАТОРКЛИЕНТА.ERT(96)}: Недопустимый объект 


Под драйвером у меня идет как и в 1с8
ПодключитьВнешнююКомпоненту("Addin.lpos_usb_vfd")
Драйвер=СоздатьОбъект("AddIn.lpos_usb_vfd_extension")

Если поможет то вот тут обработки и билиотеки
а вот тут есть описание, которое прилагается на сайте вендора


Помогите кто чем может


Рассматриваю вариант, переноса 1с7-самописной на 1с8.1 или 8.2, если есть возможность автоматизировать данный вопрос, то пожалуйста поделитесь опытом, всем спасибо заранее
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #4 - 06. Августа 2011 :: 14:52
Печать  
попробуй в качестве элемента массива применить Структуру из 1с++

Стр1=создатьОбъект("Структуру");
Стр1.Вставить("Текст",ТекстСтр1);
Стр1.Вставить("БегущаяСтрока", 1);

Стр2=создатьОбъект("Структуру");
Стр2.Вставить("Текст",ТекстСтр2);
Стр2.Вставить("БегущаяСтрока", 1);

Массив= СоздатьОбъект("OLESafeArray");
Массив.Создать(Массив.VarTypes.VT_VARIANT, 2);
Массив.УстановитьЗначение(0, Стр1);
Массив.УстановитьЗначение(1, Стр2);

OLEExSup.ВызватьОЛЕМетод(Драйвер, "ВывестиСтрокуНаДисплейПокупателя", "1", Массив)
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #5 - 06. Августа 2011 :: 17:17
Печать  
на выводе опять недопустымый объект, значит я обречен?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #6 - 07. Августа 2011 :: 07:51
Печать  
AddIn.lpos_usb_vfd_extension - это объект регистрируемый внешней компонентой. Этот объект скорей всего заточен под 8 и видимо может работать только с восмерошными массивом и структурой.
Есть некий ole-объект AddIn.lpos_usb_vfd, но интерфейс его не известен и вскрыть его у меня не получилось.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #7 - 07. Августа 2011 :: 08:21
Печать  
можно еще попытаться поработать напрямую с LPOS_VFD_LCD.dll вызывая WINAPI функции посредством вреппера
http://forum.script-coding.com/viewtopic.php?id=5341
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #8 - 07. Августа 2011 :: 08:48
Печать  
Не знаком с такими дебрями, но я так понял вызвать метод можно вот так?
Код
Выбрать все
    Скрипт=СоздатьОбъект("DynamicWrapperX");
	Скрипт.Register("LPOS_VFD_LCD.dll", "ВывестиСтрокуНаДисплейПокупателя", "1", Массив);
	res = Скрипт.ВывестиСтрокуНаДисплейПокупателя("1",Массив);	  // ?????.
 




Только с другими методами


Только что нашел описание метода вывестиСтрокуНаДисплейПокупателя
Там типа массива стоит IDispatch [IN] это о чем говорит?


Пробовал создать такое
Код
Выбрать все
	Скрипт=СоздатьОбъект("DynamicWrapperX");
	Скрипт.Register("LPOS_VFD_LCD.dll", "Send_Str", "i=s","r=s");
	Ответ = Скрипт.Send_Str(ТекстСтр1,0,20);
 


Не понял что впихивать в параметры функции, что не пихаю матюкается на неизвестную ошибку или неверный тип данных
Как работать с такими костылями?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #9 - 07. Августа 2011 :: 13:44
Печать  
исходя из описания LPOS_VFD_LCD.dll
функция объявлена так:
long WINAPI send_str (void* str, char row, len);
как мне кажется ее регистрировать нужно так:
Скрипт.Register("LPOS_VFD_LCD.dll", "send_str", "i=pcc","r=l");
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #10 - 07. Августа 2011 :: 13:54
Печать  
не понял зачем передаются такие параметры, но в любом случае драйвер выдал такуюже ошибку на этой строк "неизвестная ошибка"
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #11 - 07. Августа 2011 :: 18:50
Печать  
Вот такая конструкция работает без ошибок?

Код
Выбрать все
Процедура Сформировать()
	Wrap = СоздатьОбъект("DynamicWrapperX");
	Wrap.Register("c:\Temp\LPOS_VFD_LCD.dll", "send_str", "i=sll", "r=l");
	Сообщить(Wrap.send_str("zzzzzz", 0, 3));
КонецПроцедуры 

  
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #12 - 07. Августа 2011 :: 19:07
Печать  
Неизвестная ошибка на строке Wrap.Register("c:\Temp\LPOS_VFD_LCD.dll", "send_str", "i=sll", "r=l");
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #13 - 07. Августа 2011 :: 19:18
Печать  
dll в c:\Temp ?
  

1&&2&&3
Наверх
 
IP записан
 
madvovik
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 05. Августа 2011
Re: OleExSup.dll - двумерный массив для Индикатора клиента
Ответ #14 - 07. Августа 2011 :: 19:25
Печать  
да
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать