Показать сообщение отдельно
Старый 20.08.2004, 13:39   #36  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано 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 BarcodeScannerWorkplaceParameters );
    ...
    
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::closeRegistryregKey );
            }
            else
            {
                print( 
"Не зарегистрирован COM-объект сканнера штрих-кодов!" );
            }
        }
        catch
        {
            
// Ignore errors
            
oposScanner null;
        }
    }
}

void checkDevice()
{
    
//FormRun form;
    
Object o;
    
ObjectIdent oi;
    
DictClass dictClass;
    
TreeNode tnrtn;
    
TreeNodeIterator it;
    
xInfo xInfo = new xInfo();
    
int i;
    ;
    if ( 
oposScanner != null )
    {
        if ( 
oposScanner.DeviceEnabled() == false )
        {
            
// Reactivate scanner
            
oposScanner.DeviceEnabledtrue );
            
oposScanner.DataEventEnabledtrue );
            
// Proceed with attention...
            
oi infolog.parmLastActivatedForm();
            if ( 
oi )
            {
                
oi.object();
                if ( 
)
                {
                    
//dictClass = new dictClass( classidget( o ) );
                    //if ( dictClass.name() == "SysSetupFormRun" )
                    //{
                        
tn o.form();
                        
rtn xInfo.findNode"\\Forms\\" );
                        
rtn rtn.AOTfindChildtn.AOTname() );
                        
tn rtn;
                        if ( 
tn )
                        {
                            
tn tn.AOTfindChild"Methods" );
                            if ( 
tn )
                            {
                                
tn tn.AOTfindChild"ActivateBarcode" );
                                if ( 
tn )
                                {
                                    try
                                    {
                                        
o.ActivateBarcoderemoveLRSpacesoposScanner.ScanData() ) );
                                    }
                                    catch
                                    { }
                                }
                            }
                        }
                    
//}
                
}
            }
        }
    }

Замечу что в методе new возня с реестром проводится исключительно для того чтобы предупредить надоедливую ошибку при некорректном удалении OPOS-драйвера.
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes думаю очевидно в свете вышесказанного.

В методе checkDevice пользуюсь тем свойством LS2208 сканнера что он отключается после успешного сканирования - по этому признаку извлекаю новые данные и реактивирую сканнер. Далее по замечательному совету полученному из этого форума использую infolog.parmLastActivatedForm() для получения последней активированной формы и через TreeNode ищу есть ли у неё метод ActivateBarcode, который и вызываю.
Ф-я removeLRSpaces описана мной в одном топике здесь - удаляет пробелы слева и справа на всякий случай.