AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2004, 05:58   #1  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Еще раз о подключении сканнера штрих кодов
Начало темы лежит на http://forum.mazzy.ru/index.php?showtopic=962
Очень похожая тема есть здесь http://www.axforum.info/forums/showt...EA%E0%ED%E5%F0

Но к сожалению ответа на главный вопрос "как отловить внешнее событие из другого процесса/потока в аксапте" никто не знает, создаётся впечатление что это невозможно сделать .

Одно из реальных решений - опрашивать драйвер сканнера из самой аксапты по таймеру (напр. 1 сек) на предмет наличия новых данных (благо OPOS драйвер хорошо поддерживает такой подход). Видимо придется остановится на этом варианте, но хотелось бы еще подолбить эту тему, может появились уже свежие идеи.

Есть еще одно решение - использовать сканнеры подключаемые в разьем клавиатуры. Необходимость в дровах и синхронизации с внешними событиями отпадает, но появляется новый вопрос:
Как в аксапте удобным образом перехватить поступаемые со сканнера подключаемого в разьем клавиатуры данные?

Опять же, как и в случае с COM драйвером я уже имею прекрасно работающее готовое решение в 1С - это "горячие клавиши". Я программирую сканнеры таким образом, чтобы они перед подачей самого сосканированного штрих-кода засылают в буфер клавиатуры код нажатия функциональной клавиши (в моём случае - F3), а в 1С в формах которые предполагают использование сканнера делаю невидимую кнопку, которой присваюваю hotkey F3. При нажатии на эту кнопку 1С открывает модальный диалог "введите штрих код". Поступившие из сканнера данные преспокойненько туда забиваются и последним символом поступает ENTER, который соответственно закрывает диалог и далее код в программе уже решает что делать с этим штрих-кодом. Т.о. где бы на форме не находился фокус ввода, сканирование штрих-кода приводит к корректному поступлению его в программу и автоматическому запуску самых разнообразных процедур.

Столкнувшись с трудностью отлавливания внешнего события из Axapta я начал прорабатывать этот вариант и... столкнулся с опять же непреодолимой трудностью. Оказывается (судя из этого же форума) в Axapta практически нельзя назначить горячие клавиши кнопкам! Вариант с task не предлагать, ибо все task-и по функиональным клавишам нужны в самой Axapta. Вариант когда пользователь вынужден сперва спозиционироваться на нужное поле в форме и потом только сканировать тоже не пройдет вследствии своей жуткой неудобности.

Есть ли у кого нибудь реальные наработки и решения в данной области? Что то я совсем перестал понимать как в самой Axapta разработчики предполагали подключать сканнеры (как COM, так и разьем с клавиатуры). Не верю что никто и никогда не подключал к Axapta сканнеры штрих-кодов.
Старый 23.07.2004, 09:24   #2  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Я подключал через ActiveX. Обрабатываю события по таймеру. Работает без нареканий.
Старый 23.07.2004, 10:21   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Недавно на сайте у бывших "заклятых друзей" Компании "Атол" (http://www.atol.ru/ru/download/ Драйвер сканера шк) нашел фразу про совместимость с Axapta. Попробуйте их расспросить, как да что.
Старый 23.07.2004, 10:32   #4  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
На мой взгляд, два наиболее оптимальных пути решения уже были детально разобраны на форуме:
1) через ActiveX. Наименее трудозатратный в плане разработки. В сочетании с SysFileDeployer дает неплохие результаты. Кстати, MSComm прекрасно отлавливает события - не совсем понимаю, при чем здесь таймер? Или имелась в виду задержка чтения (sleep())?
2) Работа с Com-портами из Аксы через API. Более детального ее описания, чем у George Nordic, найти сложно :-). Также обсуждение можно посмотреть на technet. Там, кстати, лежит ссылка на msdn, где описаны основные алгоритмы работы с COM на примере создания ActiveX, альтернативного MSComm. Принципиальных трудностей с реализацией также не вижу - у самого не хватило времени сделать такой механизм
Старый 23.07.2004, 11:45   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Спасибо всем за внимание, Я РЕШИЛ ПРОБЛЕМУ.
Счастья полные штаны. Перехватывать асинхронные события изве в Axapta - реально!

Цитата:
SComm прекрасно отлавливает события - не совсем понимаю, при чем здесь таймер? Или имелась в виду задержка чтения (sleep())?
Повторю свой постинг из форума маззи - надеюсь станет понятно в чём БЫЛА проблема:

Цитата:
...Спасибо огромное за совет! Действительно я еще ломал голову как внедрить COM-объект в аксапту так чтобы и аксапта могла вызывать его методы, и объект мог вызывать события в ней - интеграция с ActiveX это решает.
Однако основная проблема всё равно остаётся открытой.
Дело в том что обычные ActiveX контролы запускаются и целиком и полносью работают в рамках того же процесса и потока, в котором выполняется основная программа и поэтому никаких проблем не возникает - при возникновении Event-а метод его обработки работает как надо.
Например, если я делаю ActiveX-control, который активирует внутри себя WinAPI-шный таймер (который выполняется в рамках очереди сообщений основного потока процесса), и в Event-е пишу print "Event" - всё работает замечательно - с периодичностью 1секунда в print window выводится эта строка.

Тут же трудность состоит в том что объект драйвера выполняется в отдельном потоке и Event соответственно срабатывает в нём. А так как в это время сама аксапта может уже (и как правило так и происходит) заниматсься своими делами (реакцией на ввод, какие то внутренние циклы), то получается событие "вклинивается" в нормальный ход вещей совсем ненормальным образом.
Например если я пишу в своём ActiveX контроле инициализацию thread-а, в котором периодически пытаюсь активировать Event - приложение рушится без лишних вопросов.
Тут нужно сработать таким образом, чтобы активация событий была синхронизирована с работой основного кода аксапты. В 1С для этого специально был предусмотрен механизм внешних сообщений, вот я и подумал - а нет ли такого в аксапте тоже? Может можно хотя бы в основной поток GetMessage/DispatchMessage ложить свои сообщения?
Другими словами, если ты попробуешь сделать свой актив-х-контрол, создать в нём поток и из этого потока пытаться вызвать событие в Axapta (как это в общем то делает OPOS драйвер от Symbol) - приложение 100%-но рухнет...... если не одно НО... которое я всё таки вспомнил, слава богу опыт програмирования COM-объектов имеется.

ИТАК, данную проблему можно прекрасно разрешить если вспомнить про т.н. "apartment model". Если кого то интересует могу поподробнее объяснить.
Старый 23.07.2004, 11:49   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
конечно же интересует
с нетерпением ждем объяснений.
Старый 23.07.2004, 11:59   #7  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Туплю, наверное.... Большинство ActiveX для работы с портами так и делают - создают отдельный поток и через APIшную функцию WaitCommEvent() обрабатывают прерывания от порта, генерируя СВОЕ событие. А ты уж его обрабатывай из Аксапта как хочешь... Зачем таймер-то?
Про apartment model - плиз, плиз. Очень интересно
Старый 23.07.2004, 12:22   #8  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
Позвольте спросить, как в Аксапте обработать событие от СОМ сервера? Дайте ссылочку плз на пример кода на X++.

А про apartment threading model скорее всего имеется ввиду
это
Старый 23.07.2004, 12:26   #9  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Упс... похоже я поторопился... Хотя и приложение перестало рушится в случае если событие вызывается когда аксапта крутится в цикле GetMessage/DispatchMessage и даже регулярно обновляется окно infolog, если в обработке события писать info( "...." ), но если событие случается в момент обновления таблиц или другой какой нибудь активности, всё подвисает странным образом...

В общем любой кто когда нибудь создавал проекты ActiveX-control-ов (да и вообще COM-объектов) в средах программирования (VC++ / C++Buidler / Delphi) с первых же шагов стандарных Wizard-ов имеет возможность выбрать так называемую Threading model (можно перевести как "модель управления многопоточностью") - по умолчанию данная опция обычно стоит в Apartment режиме из 4 возможных: Single, Apartment, Free, Both. Обычно с многопоточностью программисты разбираются сами и игнорируют этот параметр (многие даже не знают что это такое).

Инфраструктура COM-объектов обеспечивает то, что для объектов с моделью многопоточности SINGLE, вызов их методов (invocation) произойдет в основном потоке программы, даже если они были вызваны из другого потока, ЧТО МНЕ И ТРЕБОВАЛОСЬ. Насколько я понимаю Windows просто складывает вызовы методов таких объектов с главную очередь сообщений программы и по в ProcessMessage вызывает их. По идее это должно было сработать, но сработало как то наполовину... сейчас еще покопаю в этом направлени...
Старый 23.07.2004, 12:34   #10  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
А ты уж его обрабатывай из Аксапта как хочешь...
Блин... ты просто попробуй сам обработать событие в аксапта из другого потока "как хочешь", и если у тебя это получится - вышли программный код, буду премного благодарен. Пока сам не попробуешь думаю не поверишь что программа рушится.

Цитата:
Зачем таймер-то?
Таймер был упомянут два раза: как пример того что активикс не рушит работу аксапты, если работает в рамках её основного потока и очереди сообщений, и как реальный солюшн проблемы, избегающей пересечений между потоками путём регулярного опрашивания драйвера сканнера на наличие новых данных через какие то интервалы времени.
Старый 23.07.2004, 12:49   #11  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
2 Alks
Так, давайте определимся, что мы обсуждаем:
1) Работу с COM-портами из Аксапта или
2) Создание АктивИкса, который может работать с портами
Старый 23.07.2004, 13:08   #12  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
О йес... Я добил его... Просто неправильно работал с SINGLE threading model - не передавал интерфейсы между потоками через ф-ии CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream. Теперь всё работает. Если кого то интересует - могу выложить исходные коды этого ActiveX-контрола на Delphi куда пожелаете.

P.S.

Кстати саму threading model как оказалось менять вовсе и не обязательно - главное самому насильно принудить программу работать в single режиме вызовом вышеупомянутых функций.
Старый 23.07.2004, 13:16   #13  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
2 Alks
Так, давайте определимся, что мы обсуждаем:
1) Работу с COM-портами из Аксапта или
Я нигде и никогда в этих форумах даже намёка не оставлял на то что хотел обсудить работу с COM-портами из ахапты. Везде писал про работу с OPOS-COM-драйвером Symbol сканнера, который из отдельного потока должен корректо вызывать событие в Axapta.

Цитата:
2) Создание АктивИкса, который может работать с портами
Нет, нет и еще раз нет! Я обсуждал создание ActiveX-а, который из отдельного потока может корректно вызввать асинхронные события в Axapta. Нужно мне это конечно для реализации обработки событий от COM-объекта, который читает данные из COM-порта, но сути проблемы ты похоже так и не понял. Чтобы понять просто попробуй создать актив-х для аксапты, который бы создавал отдельный поток в котором пытался бы вызывать событие в ахапте. Не знаю как тебе объяснить иначе.
Старый 23.07.2004, 13:27   #14  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Да понял, понял, не ругайся так

Супер, что получилось.
Я все-таки хочу попробовать научить Аксапту работать с комами напрямую.
Старый 23.07.2004, 13:35   #15  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
2 Yprit
Цитата:
Да понял, понял, не ругайся так

Супер, что получилось.
Я все-таки хочу попробовать научить Аксапту работать с комами напрямую.
А зачем? Теперь уже понятно что можно написать Active-X, который будет это делать... Да и разве можно в X++ реализовать многопоточность, которая желательна для работы с COM-портом в такой манере?

2 Diman
Цитата:
Позвольте спросить, как в Аксапте обработать событие от СОМ сервера? Дайте ссылочку плз на пример кода на X++.
рекомендую последовать первому совету Mazzy, который можно прочитать перейдя по ссылке, которую я постил тут с самого начала. Вкратце - пишем ActiveX control, который собственно и будет реагировать на внешние события через event-ы.
Старый 23.07.2004, 13:44   #16  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Изначально опубликовано Alks
Если кого то интересует - могу выложить исходные коды этого ActiveX-контрола на Delphi куда пожелаете.
Желаем-желаем! Выложите на форуме, плиз!

2 Yprit: Вряд ли получиться... я бы не рекомендовал эксперементировать.
Старый 23.07.2004, 13:49   #17  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Выложу завтра, с комментариями. Сегодня уже раб. день закончился, выгоняют.
Старый 23.07.2004, 13:50   #18  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Да и разве можно в X++ реализовать многопоточность, которая желательна для работы с COM-портом в такой манере?
Думаю, да - механизмы для этого есть. Правда, детально механизм работы с потоками в Аксапте еще не разбирал

А зачем - по нескольким причинам.
Во-первых, мне не кажется оптимальным шлепать на все формы, где мне понадобится читать из/писать в Ком-порт, АктивХ. Субъективное ИМХО - не красиво это....
Во-вторых, у меня не для всех клиентов почему-то срабатывает скачивание файлов с сервера и регистрация этого АктивХ-а на клиенте через SysFileDeployer(). Причем никакой закономерности поймать пока не могу - а ручками копировать и регистрить лень...
В-третьих, мне просто интересно
Старый 23.07.2004, 13:53   #19  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
2 Alks
Немного переформулирую вопрос:
Как подключить COM сервер в Axapta и использовать его source интерфейс?
Код обработчика события на X++ я не нашел.
Старый 24.07.2004, 14:57   #20  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Короче намучился я с этой хренью вдоволь, и решил что лучше не морочить себе голову и делать через таймер.
Привожу исходный код двух основных модулей моего ActiveX-а, который запускает поток из которого совершенно безопасно генерируется событие для Axapta. Казалось бы всё пучком, но возникли две непреодолимые для меня сейчас проблемы:
1. создание и передача "safe" указателя на интерфейс IAxBarScanner драйверу сканнера (который разумеется сам не делает CoGetInterfaceAndReleaseStream, а если пытаться сделать его в основном потоке программы сразу после CoMarshalInterThreadInterfaceInStream, то черезчур умная ф-я возвращает прямой указатель, а не маршализированный).
2. вследствии непонятной мешанины с AddRef/Relese ActiveX застревает в памяти (откуда то берутся целых 5 ссылок на него и он не уничтожается как должен был бы), в результате объекты плодятся безконтрольно и ахапта при выходе остаётся в списке задач

Думаю что всё это вопросы разрешимые, но заниматься ими уже надоело, да и сроки поджимают, времени распылятся по мелочам, когда менее элегантное решение всё таки существует нет.

PHP код:
unit AxBarScannerImpl;

interface

uses
  Windows
ActiveXClassesControlsGraphicsMenusFormsStdCtrls,
  
ComServStdVCLAXCtrlsAxBarScannerXControl_TLBSysUtils;

type
  TAxBarScanner 
= class(TActiveXControlIAxBarScanner)
  private
    { Private 
declarations }
    
FDelphiControlTStaticText;
    
FEventsIAxBarScannerEvents;
    
FTestThreadTThread;
    
procedure ClickEvent(SenderTObject);
    
procedure DblClickEvent(SenderTObject);
  protected
    { Protected 
declarations }
    
procedure DefinePropertyPages(DefinePropertyPageTDefinePropertyPage); override;
    
procedure EventSinkChanged(const EventSinkIUnknown); override;
    
procedure InitializeControloverride;
    function 
Get_AlignmentTxAlignmentsafecall;
    function 
Get_AutoSizeWordBoolsafecall;
    function 
Get_BorderStyleTxStaticBorderStylesafecall;
    function 
Get_CaptionWideStringsafecall;
    function 
Get_ColorOLE_COLORsafecall;
    function 
Get_CursorSmallintsafecall;
    function 
Get_DoubleBufferedWordBoolsafecall;
    function 
Get_DragCursorSmallintsafecall;
    function 
Get_DragModeTxDragModesafecall;
    function 
Get_EnabledWordBoolsafecall;
    function 
Get_FontIFontDispsafecall;
    function 
Get_ParentColorWordBoolsafecall;
    function 
Get_ShowAccelCharWordBoolsafecall;
    function 
Get_VisibleWordBoolsafecall;
    function 
Get_VisibleDockClientCountIntegersafecall;
    
procedure _Set_Font(const ValueIFontDisp); safecall;
    
procedure Set_Alignment(ValueTxAlignment); safecall;
    
procedure Set_AutoSize(ValueWordBool); safecall;
    
procedure Set_BorderStyle(ValueTxStaticBorderStyle); safecall;
    
procedure Set_Caption(const ValueWideString); safecall;
    
procedure Set_Color(ValueOLE_COLOR); safecall;
    
procedure Set_Cursor(ValueSmallint); safecall;
    
procedure Set_DoubleBuffered(ValueWordBool); safecall;
    
procedure Set_DragCursor(ValueSmallint); safecall;
    
procedure Set_DragMode(ValueTxDragMode); safecall;
    
procedure Set_Enabled(ValueWordBool); safecall;
    
procedure Set_Font(var ValueIFontDisp); safecall;
    
procedure Set_ParentColor(ValueWordBool); safecall;
    
procedure Set_ShowAccelChar(ValueWordBool); safecall;
    
procedure Set_Visible(ValueWordBool); safecall;
    
procedure ActivateScanData(const DataWideString); safecall;
    
procedure ShowRefCountsafecall;
  public
    
destructor Destroyoverride;
    
//procedure AfterConstruction; override;
  
end;

implementation

uses ComObj
TestThread;

TAxBarScanner }

procedure TAxBarScanner.DefinePropertyPages(DefinePropertyPageTDefinePropertyPage);
begin
  
{TODODefine property pages here.  Property pages are defined by calling
    DefinePropertyPage with the 
class id of the page.  For example,
      
DefinePropertyPage(Class_AxBarScannerPage); }
end;

procedure TAxBarScanner.EventSinkChanged(const EventSinkIUnknown);
begin
  FEvents 
:= EventSink as IAxBarScannerEvents;
end;

procedure TAxBarScanner.InitializeControl;
begin
  
// Это нужно дельфям
  
FDelphiControl := Control as TStaticText;
  
FDelphiControl.OnClick := ClickEvent;
  
FDelphiControl.OnDblClick := DblClickEvent;

  
// Создаём поток
  
FTestThread := AxTestThread.CreateTrue );

  
// Сериализуем указатель на интерфейс в поток...
  
if not SucceededCoMarshalInterThreadInterfaceInStreamIID_IAxBarScanner,
    
Self as IAxBarScanner, (FtestThread as AxTestThread).Strm ) ) then
  begin
    MessageBox
0'CoMarshal...() error''Error'MB_OK );
  
end;

  
// Если попробовать заменить эту хитрую процедуру простым присваиванием типа:
  // (FTestThread as AxTestThread).Scanner := Self as IAxBarScanner;
  // не пропуская указатель на интерфейс через ф-ии принудительного маршаллинга,
  // то аксапта неминуемо повиснет.
  // После десериализации любые вызовы к интерфейсу будут проходить через механизм
  // single threaded apartment model и, как следствие, выполнятся
  // в рамках работы основного потока программы GetMessage/DispatchMessage.

  // Активируем работу потока
  
FTestThread.Resume;
end;

// ... вырезал ненужный код генерируемый дельфи

destructor TAxBarScanner.Destroy;
begin
  
// Убиваем поток
  //_AddRef;
  //_AddRef;
  
FTestThread.Terminate;
  
FTestThread.WaitFor;
  
FTestThread.Free;

  
inherited;
end;

procedure TAxBarScanner.ActivateScanData(const DataWideString);
begin
  
if FEvents <> nil then
    FEvents
.OnScanDataData );
end;

procedure TAxBarScanner.ShowRefCount;
begin
  MessageBox
0PCharIntToStrRefCount ) ), 'RefCount'MB_OK );
end;

initialization
  TActiveXControlFactory
.Create(
    
ComServer,
    
TAxBarScanner,
    
TStaticText,
    
Class_AxBarScanner,
    
1,
    
'',
    
0,
    
tmSingle);
end
PHP код:
unit TestThread;

interface

uses
  Classes
AxBarScannerImplAxBarScannerXControl_TLBActiveX;

type
  AxTestThread 
= class(TThread)
  private
    { Private 
declarations }
  protected
    
procedure Executeoverride;
  public
    
StrmIStream;
    
ScannerIAxBarScanner// Собственно интерфейс ActiveX объекта
  
end;

implementation

uses Windows
;

procedure AxTestThread.Execute;
begin
  CoInitializeEx
nilCOINIT_APARTMENTTHREADED );
  
Strm._AddRef;
  if 
not SucceededCoGetInterfaceAndReleaseStreamStrmIID_IAxBarScannerScanner ) ) then
  begin
    MessageBox
0'CoGetIface...() error'''MB_OK );
  
end;
  
Strm := nil;

  while 
not Terminated do
  
begin
    Sleep
1000 );
    if 
not Terminated then
    begin
      Beep
300100 );
      
Scanner.ActivateScanData'Debil' );
    
end;
  
end;
  
Scanner := nil;
  
  
CoUninitialize;
end;

end
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
«Обрезание» длинных штрих-кодов gl00mie DAX: Программирование 7 17.10.2008 18:16
Подвисает сканер штрих-кодов KingPeas DAX: Программирование 0 10.10.2008 09:01
AX 4.0 + сканеры штрих кодов Vitals DAX: Прочие вопросы 11 20.06.2008 17:35
Еще раз про сканеры штрих кодов doo DAX: Программирование 14 22.12.2006 15:47
Нужен совет по сканеру штрих-кодов slava09 DAX: Программирование 5 27.01.2005 03:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:37.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.