Цитата:
Изначально опубликовано George Nordic
Согласен! Хотя, по идее, должны 
Что-то мы, действительно, увлеклись спором, хотя согласны практически во всем
Я аж изначальную тему забыл 
Да, Alks, а не подилитесь ли кодиком, как Вам удалось подключить сканер к Axapte? На будущее, для следующих так сказать поколений 
С Уважением,
Георгий.
Использован принцип "опроса по таймеру". Каждую секунду у COM-объекта (OPOS-драйвер от Symbol) опрашивается свойство того есть ли в нём новые данные и если есть, то у последней активированной формы ищется метод ActivateBarcode( str BarcodeStr ) и если таковая есть - запускается. Для реализации модификации пришлось "грязными сапогами" залезть в класс Application:
PHP код:
class Application extends xApplication
{
...
// aa_dav
BarcodeScanner BarcodeScanner;
}
Изменен метод startupPost:
PHP код:
void startupPost()
{
WorkplaceParameters WorkplaceParameters; // aa_dav
...
// aa_dav
WorkplaceParameters = WorkplaceParameters::findOrCreate();
BarcodeScanner = new BarcodeScanner( WorkplaceParameters );
...
this.setTimeOut( "AppTimeOut", 1000 );
}
Лирическое отступление - таблица WorkplaceParameters это еще одна наша модификация, привязывающая какие либо настройки не к имени пользователя, а к рабочему месту (а именно - имени компьютера на котором запущено приложение). Здесь из неё берется галочка "сканнер штрих-кодов подключен" и на этом её роль ограничивается, поэтому не описываю.
метод setTimeOut() активирует периодический запуск еще одного нового метода в Application:
PHP код:
void AppTimeout()
{
;
this.setTimeOut( "AppTimeOut", 1000 );
BarcodeScanner.checkDevice();
}
Теперь собственно всё внимание концентрируется на классе BarcodeScanner, который кстати обязательно должен иметь св-во RunOn установленным в On Client:
PHP код:
public class BarcodeScanner
{
COM oposScanner;
}
void new( WorkplaceParameters WorkplaceParameters )
{
int regKey;
#WinAPI
;
oposScanner = null;
if ( WorkplaceParameters.BarcodeScannerExists == NoYes::Yes )
{
try
{
regKey = WinAPI::regOpenKey( #HKEY_CLASSES_ROOT,
"AxaptaOposScannerLib.AxaptaOposScanner", #KEY_READ );
if ( regKey )
{
oposScanner = new COM( "AxaptaOposScannerLib.AxaptaOposScanner" );
oposScanner.Open();
if ( oposScanner.ErrorMsg() != "" )
{
print( "Ошибка инициализации сканнера штрих-кодов: " + oposScanner.ErrorMsg() );
}
// Release registry resource
WinAPI::closeRegistry( regKey );
}
else
{
print( "Не зарегистрирован COM-объект сканнера штрих-кодов!" );
}
}
catch
{
// Ignore errors
oposScanner = null;
}
}
}
void checkDevice()
{
//FormRun form;
Object o;
ObjectIdent oi;
DictClass dictClass;
TreeNode tn, rtn;
TreeNodeIterator it;
xInfo xInfo = new xInfo();
int i;
;
if ( oposScanner != null )
{
if ( oposScanner.DeviceEnabled() == false )
{
// Reactivate scanner
oposScanner.DeviceEnabled( true );
oposScanner.DataEventEnabled( true );
// Proceed with attention...
oi = infolog.parmLastActivatedForm();
if ( oi )
{
o = oi.object();
if ( o )
{
//dictClass = new dictClass( classidget( o ) );
//if ( dictClass.name() == "SysSetupFormRun" )
//{
tn = o.form();
rtn = xInfo.findNode( "\\Forms\\" );
rtn = rtn.AOTfindChild( tn.AOTname() );
tn = rtn;
if ( tn )
{
tn = tn.AOTfindChild( "Methods" );
if ( tn )
{
tn = tn.AOTfindChild( "ActivateBarcode" );
if ( tn )
{
try
{
o.ActivateBarcode( removeLRSpaces( oposScanner.ScanData() ) );
}
catch
{ }
}
}
}
//}
}
}
}
}
}
Замечу что в методе new возня с реестром проводится исключительно для того чтобы предупредить надоедливую ошибку при некорректном удалении OPOS-драйвера.
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes думаю очевидно в свете вышесказанного.
В методе checkDevice пользуюсь тем свойством LS2208 сканнера что он отключается после успешного сканирования - по этому признаку извлекаю новые данные и реактивирую сканнер. Далее по замечательному совету полученному из этого форума использую infolog.parmLastActivatedForm() для получения последней активированной формы и через TreeNode ищу есть ли у неё метод ActivateBarcode, который и вызываю.
Ф-я removeLRSpaces описана мной в одном топике здесь - удаляет пробелы слева и справа на всякий случай.