Чтение штрих-кода Delphi xe7, событие после намерения не срабатывает

В моем приложении, разработанном с помощью XE7 для Android/iOS, есть форма для сканирования штрих-кодов. При обнаружении штрих-кода мое приложение проверяет, является ли он допустимым штрих-кодом или нет. Следуйте инструкциям здесь: http://www.fmxexpress.com/qr-code-scanner-source-code-for-delphi-xe5-firemonkey-on-android-and-ios/

В настоящее время я тестирую на Android, и я могу интегрировать сканирование и чтение штрих-кодов, но событие onBarCode не срабатывает при возврате из общего действия по поиску штрих-кода. Тот же код хорошо работал с предыдущими версиями Rad Studio (XE4, XE5, XE6), но теперь в XE7 это не так.

Вот несколько фрагментов кода:

...
begin
    Scanner := TAndroidBarcodeScanner.Create(true);
    Scanner.OnBarCode := BarcodeHandler;
    Scanner.Scan;
end;

procedure TmScannerForm.BarcodeHandler(Sender: TAndroidBarcodeScanner;
  BarCode: String);
begin
  text1.Text := Barcode;
  memo1.PasteFromClipboard;
  AddBarcode(BarCode, true);
end;

AddBarCode — это даже то, что я использовал для проверки и добавления штрих-кода в список, но я не включил его, потому что проблема не в этом коде — он даже не срабатывает. Text1.text:=Barcode и memo1.paseFromClipboard были в них для проверки того, что даже не сработало. Я могу подтвердить, что штрих-коды считываются, потому что, если я нажму и вставлю вручную, появится штрих-код.

Почему это не работает на XE7, как это было в предыдущих версиях Rad Studio?


person ThisGuy    schedule 03.10.2014    source источник
comment
Какой считыватель штрих-кодов для Android? (имя класса TAndroidBarcodeReader не указывает, основан ли он на zbar или zxing)   -  person mjn    schedule 08.10.2014
comment
fmxexpress.com/wp-content/uploads/2014/03/ TKRBarCodeSanner.zip — это третья ссылка, в которой перечислены ресурсы, необходимые для сканирования статьи.   -  person ThisGuy    schedule 08.10.2014
comment
Класс TTKRBarCodeScanner в zip использует com.google.zxing.client.android.SCAN, поэтому я предполагаю, что он основан на ZXing. На самом деле вы могли бы использовать строки, показанные в моем ответе, вместо компонента/класса TAndroidBarcodeScanner (который, кажется, находится в загрузке 20,3 МБ по адресу cc.embarcadero.com/Download.aspx?id=29699, если я правильно понял)   -  person mjn    schedule 08.10.2014


Ответы (4)


У Андреа Магни есть более элегантное решение, чем таймер в его блоге, основанное на обработке событий.

Я бы прокомментировал, чтобы отправить ссылку, но у меня недостаточно репутации. Ссылка на его блог:

http://blog.delphiedintorni.it/2014/10/leggere-e-produrre-barcode-con-delphi.html

Может быть, это может помочь вам. Блог на итальянском языке, но источники предоставлены и объясняются сами по себе.

person etherel    schedule 24.10.2014


Этот код работает для меня!

Установите для таймера значение true при запуске кода сканирования.

procedure Tform.Timer1Timer(Sender: TObject);
begin
if  (ClipService.GetClipboard.ToString <> '')  then
  begin
     timer1.Enabled:=false;
      zSearch.Text := ClipService.GetClipboard.ToString;
     //Do what you need
  end;

end;
person Gianluca Colombo    schedule 10.10.2014

Этот код для меня отлично работает!

в andorid.BarcodeScanner

function TAndroidBarcodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
var
  aeBecameActive : TApplicationEvent;
begin
  aeBecameActive := TApplicationEvent.BecameActive;
  if FMonitorClipboard and (AAppEvent = aeBecameActive) then
  begin
    GetBarcodeValue;
  end;
end;
person user4664107    schedule 12.03.2015