unit PSVars;
interface
uses
PSTypes ;
var
Barcode:TBarcode;
TJNASC:TJNativeActivitySubclass;
implementation
end.
formScanTakeOnStore
unit formScanTakeOnStore;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo,
Androidapi.JNI.App, Androidapi.JNI, Androidapi.JNIBridge, Androidapi.JNI.JavaTypes,
Androidapi.Helpers, FMX.DialogService, System.Rtti, FMX.Grid.Style,
FMX.Grid, FMX.TextLayout, DateUtils, PSTypes, FMX.Objects;
type
TfrmScanTakeOnStore = class(TForm)
Label1: TLabel;
btnFinish: TButton;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
btnContinuous: TButton;
btnManual: TButton;
Panel4: TPanel;
lblReceived: TLabel;
StyleBook1: TStyleBook;
btnTable: TButton;
lblMaterial: TLabel;
lblBankaCounts: TLabel;
lblTotalLeft: TLabel;
tmrSleep: TTimer;
rectStatus: TRectangle;
Button1: TButton;
procedure btnFinishClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnContinuousClick(Sender: TObject);
procedure btnManualClick(Sender: TObject);
procedure btnTableClick(Sender: TObject);
procedure tmrSleepTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FNewDataExist:Boolean;
BarcodeData:TBarcodeData;
procedure OnBarcodeResult(const ABarcodeData:TBarcodeData);
procedure CloseFrm(Sender: TObject; const AResult: TModalResult);
procedure MaterialAddedNG(Sender: TObject; const AResult: TModalResult);
procedure MaterialAddedOK(Sender: TObject; const AResult: TModalResult);
procedure StopScannerAndColor(CL:Cardinal);
public
{ Public declarations }
end;
var
frmScanTakeOnStore: TfrmScanTakeOnStore;
implementation
uses
FMX.Helpers.Android, Androidapi.NativeActivity, formScanComplete, dmData, formAgreeAction,
formScanTakeOnStoreTable, PSVars, formMain;
{$R *.fmx}
procedure TfrmScanTakeOnStore.btnContinuousClick(Sender: TObject);
begin
TJNASC.Start;
btnContinuous.StyleLookup:='btnContinuousStyle1';
btnManual.StyleLookup:='';
MainForm.AutomaticMode:=True;
MainForm.ShowInformationMessage('Automatic mode');
end;
procedure TfrmScanTakeOnStore.btnFinishClick(Sender: TObject);
begin
// MainForm.SayTextToSpeech('Завершить приемку материалов на склад?');
TDialogService.MessageDialog(
'Завершить приемку материалов на склад?',
TMsgDlgType.mtWarning,
[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
TMsgDlgBtn.mbNo,
0,
CloseFrm);
end;
procedure TfrmScanTakeOnStore.btnManualClick(Sender: TObject);
begin
TJNASC.Stop;
btnManual.StyleLookup:='btnContinuousStyle1';
btnContinuous.StyleLookup:='';
MainForm.AutomaticMode:=False;
end;
procedure TfrmScanTakeOnStore.btnTableClick(Sender: TObject);
begin
CallInUIThread(procedure begin
frmScanTakeOnStoreTable:=TfrmScanTakeOnStoreTable.Create(Application); //Free ???
frmScanTakeOnStoreTable.Show;
end);
end;
procedure TfrmScanTakeOnStore.Button1Click(Sender: TObject); //simulation
var
bc: TBarcodeData;
begin
bc.Parsed:=True;
bc.KPJCode:='80604358';
bc.LotName:='testlot';
OnBarcodeResult(bc);
end;
procedure TfrmScanTakeOnStore.CloseFrm(Sender: TObject; const AResult: TModalResult);
begin
if AResult = mrYes then
begin
TJNASC.Stop;
MainForm.AutomaticMode:=False;
Close;
end;
end;
procedure TfrmScanTakeOnStore.FormShow(Sender: TObject);
begin
Log.d('Pre-activate');
tmrSleep.Interval:=Barcode.DelayInSeconds*1000;
Barcode.LastScanTimeUnix:=DateTimeToUnix(Now);
Barcode.OnBarcodeResult:=OnBarcodeResult;
end;
procedure TfrmScanTakeOnStore.MaterialAddedNG(Sender: TObject;
const AResult: TModalResult);
begin
if AResult = mrYes then
begin
///NG result parse
end;
end;
procedure TfrmScanTakeOnStore.MaterialAddedOK(Sender: TObject;
const AResult: TModalResult);
begin
end;
procedure TfrmScanTakeOnStore.OnBarcodeResult(const ABarcodeData: TBarcodeData);
begin
if ABarcodeData.Parsed then
begin
StopScannerAndColor(TAlphaColors.Green);
end
else
begin
MainForm.ShowInformationMessage(ARNBarCode+' невозможно распознать.');
StopScannerAndColor(TAlphaColors.Red);
end;
end;
procedure TfrmScanTakeOnStore.StopScannerAndColor(CL: Cardinal);
begin
rectStatus.Fill.Color:=CL;
TJNASC.Stop;
TJNASC.DeActivate;
Log.d('Scanner DeActivate');
tmrSleep.Enabled:=True;
end;
procedure TfrmScanTakeOnStore.tmrSleepTimer(Sender: TObject);
begin
TJNASC.Activate;
Log.d('Scanner ready');
if MainForm.AutomaticMode then
begin
MainForm.ShowInformationMessage('Starting scanner');
frmScanTakeOnStore.btnManual.OnClick(frmScanTakeOnStore.btnManual);
Sleep(1000);
frmScanTakeOnStore.btnContinuous.OnClick(frmScanTakeOnStore.btnContinuous);
MainForm.ShowInformationMessage('Automatic mode');
end;
rectStatus.Fill.Color:=StrToInt('$FFE0E0E0');
tmrSleep.Enabled:=False;
end;
end.
Итак, при запуске основной формы сканер активируется и появляется возможность чтения.
Для получения и обработки данных я открываю форму frmScanTakeOnStore и выставляю статус ручное сканирование.
Процедуры TJNASC.Start, TJNASC.Stop отвечают за Автоматическое сканирование ВКЛ и Выкл соответственно. Автоматическое = сканер постоянно пытается считать баркод. Ручное = чтение по триггеру (кнопке на аппарате).
Поступила задача, если сканер в Автоматическом режиме, то после каждого скнаирования надо делать паузу в 1-несколько секунд и выключать сканер, а потом активировать снова.
Я решил сделать это через штатный таймер. Он отрабатывает нормально, но симуляция нажатия кнопок (знаю что так себе решение, но см дальше) не происходит. Т.е. если я закомментирую строку в OnTimer
то кнопка btnManual станет подсвеченной. Если раскомментирую, то автоматическое чтение не активируется. НО! Если просто нажать на кнопку btnContinuous, то сканер запускает постоянное чтение.
Пробовал сделать так, но результат также был нулевой (постоянное чтение не запускается программно, только через клик по кнопке):
Вопрос
Kast2k
Добрый день!
Пишу программу для обработки результатов работы сканера Honeywell CT50 (Android 6).
Сразу прошу прощения за простыни кода, упрощал изо всех сил.
Главная форма:
TMainForm = class(TForm) Label1: TLabel; btnSaveToStore: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } FAutomaticMode:Boolean; procedure ActivateScanner; public property AutomaticMode: Boolean read FAutomaticMode write FAutomaticMode; procedure onBarCodeCompleteThreadSwitcher; procedure onBarCodeFailThreadSwitcher; procedure ShowInformationMessage(const AText:string); { Public declarations } end; uses FMX.Helpers.Android, Androidapi.NativeActivity, Androidapi.JNI.Widget, formScanTakeOnStore, PSTypes, PSVars; procedure TMainForm.ActivateScanner; begin RegisterDelphiNativeMethods; TJNASC.Activate; Log.d('Scanner ready'); end; procedure TMainForm.btnSaveToStoreClick(Sender: TObject); begin Barcode.DelayInSeconds:=2; frmScanTakeOnStore:=TfrmScanTakeOnStore.Create(Application); //правильный ли вызов? надо ли Free при выходе? frmScanTakeOnStore.Show; end; procedure TMainForm.FormCreate(Sender: TObject); begin Barcode:=TBarcode.Create; Barcode.DelayInSeconds:=2; ActivateScanner; end; procedure TMainForm.onBarCodeCompleteThreadSwitcher; begin if AutomaticMode then TJNASC.Start else TJNASC.Stop; end; procedure TMainForm.onBarCodeFailThreadSwitcher; begin end; procedure TMainForm.ShowInformationMessage(const AText: string); begin CallInUiThread ( procedure begin TJToast.JavaClass.makeText (TAndroidHelper.Context, StrToJCharSequence(AText), TJToast.JavaClass.LENGTH_LONG).show; end ); end;
PSTypes.pas
PSVars
unit PSVars; interface uses PSTypes ; var Barcode:TBarcode; TJNASC:TJNativeActivitySubclass; implementation end.
formScanTakeOnStore
unit formScanTakeOnStore; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, Androidapi.JNI.App, Androidapi.JNI, Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.Helpers, FMX.DialogService, System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.TextLayout, DateUtils, PSTypes, FMX.Objects; type TfrmScanTakeOnStore = class(TForm) Label1: TLabel; btnFinish: TButton; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; btnContinuous: TButton; btnManual: TButton; Panel4: TPanel; lblReceived: TLabel; StyleBook1: TStyleBook; btnTable: TButton; lblMaterial: TLabel; lblBankaCounts: TLabel; lblTotalLeft: TLabel; tmrSleep: TTimer; rectStatus: TRectangle; Button1: TButton; procedure btnFinishClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure btnContinuousClick(Sender: TObject); procedure btnManualClick(Sender: TObject); procedure btnTableClick(Sender: TObject); procedure tmrSleepTimer(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } FNewDataExist:Boolean; BarcodeData:TBarcodeData; procedure OnBarcodeResult(const ABarcodeData:TBarcodeData); procedure CloseFrm(Sender: TObject; const AResult: TModalResult); procedure MaterialAddedNG(Sender: TObject; const AResult: TModalResult); procedure MaterialAddedOK(Sender: TObject; const AResult: TModalResult); procedure StopScannerAndColor(CL:Cardinal); public { Public declarations } end; var frmScanTakeOnStore: TfrmScanTakeOnStore; implementation uses FMX.Helpers.Android, Androidapi.NativeActivity, formScanComplete, dmData, formAgreeAction, formScanTakeOnStoreTable, PSVars, formMain; {$R *.fmx} procedure TfrmScanTakeOnStore.btnContinuousClick(Sender: TObject); begin TJNASC.Start; btnContinuous.StyleLookup:='btnContinuousStyle1'; btnManual.StyleLookup:=''; MainForm.AutomaticMode:=True; MainForm.ShowInformationMessage('Automatic mode'); end; procedure TfrmScanTakeOnStore.btnFinishClick(Sender: TObject); begin // MainForm.SayTextToSpeech('Завершить приемку материалов на склад?'); TDialogService.MessageDialog( 'Завершить приемку материалов на склад?', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0, CloseFrm); end; procedure TfrmScanTakeOnStore.btnManualClick(Sender: TObject); begin TJNASC.Stop; btnManual.StyleLookup:='btnContinuousStyle1'; btnContinuous.StyleLookup:=''; MainForm.AutomaticMode:=False; end; procedure TfrmScanTakeOnStore.btnTableClick(Sender: TObject); begin CallInUIThread(procedure begin frmScanTakeOnStoreTable:=TfrmScanTakeOnStoreTable.Create(Application); //Free ??? frmScanTakeOnStoreTable.Show; end); end; procedure TfrmScanTakeOnStore.Button1Click(Sender: TObject); //simulation var bc: TBarcodeData; begin bc.Parsed:=True; bc.KPJCode:='80604358'; bc.LotName:='testlot'; OnBarcodeResult(bc); end; procedure TfrmScanTakeOnStore.CloseFrm(Sender: TObject; const AResult: TModalResult); begin if AResult = mrYes then begin TJNASC.Stop; MainForm.AutomaticMode:=False; Close; end; end; procedure TfrmScanTakeOnStore.FormShow(Sender: TObject); begin Log.d('Pre-activate'); tmrSleep.Interval:=Barcode.DelayInSeconds*1000; Barcode.LastScanTimeUnix:=DateTimeToUnix(Now); Barcode.OnBarcodeResult:=OnBarcodeResult; end; procedure TfrmScanTakeOnStore.MaterialAddedNG(Sender: TObject; const AResult: TModalResult); begin if AResult = mrYes then begin ///NG result parse end; end; procedure TfrmScanTakeOnStore.MaterialAddedOK(Sender: TObject; const AResult: TModalResult); begin end; procedure TfrmScanTakeOnStore.OnBarcodeResult(const ABarcodeData: TBarcodeData); begin if ABarcodeData.Parsed then begin StopScannerAndColor(TAlphaColors.Green); end else begin MainForm.ShowInformationMessage(ARNBarCode+' невозможно распознать.'); StopScannerAndColor(TAlphaColors.Red); end; end; procedure TfrmScanTakeOnStore.StopScannerAndColor(CL: Cardinal); begin rectStatus.Fill.Color:=CL; TJNASC.Stop; TJNASC.DeActivate; Log.d('Scanner DeActivate'); tmrSleep.Enabled:=True; end; procedure TfrmScanTakeOnStore.tmrSleepTimer(Sender: TObject); begin TJNASC.Activate; Log.d('Scanner ready'); if MainForm.AutomaticMode then begin MainForm.ShowInformationMessage('Starting scanner'); frmScanTakeOnStore.btnManual.OnClick(frmScanTakeOnStore.btnManual); Sleep(1000); frmScanTakeOnStore.btnContinuous.OnClick(frmScanTakeOnStore.btnContinuous); MainForm.ShowInformationMessage('Automatic mode'); end; rectStatus.Fill.Color:=StrToInt('$FFE0E0E0'); tmrSleep.Enabled:=False; end; end.
Итак, при запуске основной формы сканер активируется и появляется возможность чтения.
Для получения и обработки данных я открываю форму frmScanTakeOnStore и выставляю статус ручное сканирование.
Процедуры TJNASC.Start, TJNASC.Stop отвечают за Автоматическое сканирование ВКЛ и Выкл соответственно. Автоматическое = сканер постоянно пытается считать баркод. Ручное = чтение по триггеру (кнопке на аппарате).
Поступила задача, если сканер в Автоматическом режиме, то после каждого скнаирования надо делать паузу в 1-несколько секунд и выключать сканер, а потом активировать снова.
Я решил сделать это через штатный таймер. Он отрабатывает нормально, но симуляция нажатия кнопок (знаю что так себе решение, но см дальше) не происходит. Т.е. если я закомментирую строку в OnTimer
Sleep(1000); frmScanTakeOnStore.btnContinuous.OnClick(frmScanTakeOnStore.btnContinuous);
то кнопка btnManual станет подсвеченной. Если раскомментирую, то автоматическое чтение не активируется. НО! Если просто нажать на кнопку btnContinuous, то сканер запускает постоянное чтение.
Пробовал сделать так, но результат также был нулевой (постоянное чтение не запускается программно, только через клик по кнопке):
TJNASC.Stop; MainForm.AutomaticMode:=False; TJNASC.Start; MainForm.AutomaticMode:=True;
Пробовал через CallInUIThread() = тоже самое
Коллеги,
Подскажите, пожалуйста, что я делаю не так? Может быть необходимо методы по иному вызывать или я упускаю какие-то пункты?
Спасибо!
Изменено пользователем Kast2kСсылка на комментарий
1 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.