Добрый вечер. Пытаюсь добавить сканеровку qr кода в приложение.Делаю так:
uses FMX.ALDevBarcode;
private
FBarcode: TALDevBarcode;
procedure BarcodeScanResult(Sender: TObject; AResult: string);
procedure convert(s: string);
procedure TForm1.BarcodeScanResult(Sender: TObject; AResult: string);
var
ScanThread: TScanthread;
begin
convert(AResult);
end;
procedure TForm1.convert(s: string);
var
d, t, sum_start, fn_start, i_start: integer;
dt, tm: TDateTime;
sdt, tdt, summa, fn, fn_find_str: string;
fn_find, fn_name_find: variant;
begin
if ContainsText(s, 't=') and ContainsText(s, 'T') and ContainsText(s, '&s=')
and ContainsText(s, '&fn=') then
begin
sum_start := pos('&s=', s, 1); // начало суммы
fn_start := pos('&fn=', s, 1); // начало фн номера
i_start := pos('&i=', s, 1); // начало i номера
fn := copy(s, fn_start + 4, i_start - (fn_start + 4));//ФН номер
summa := copy(s, sum_start + 3, fn_start - (sum_start + 3)); // сумма
summa := stringreplace(summa, '.', ',', [rfReplaceAll]);
sdt := copy(s, pos('t=', s, 1) + 2, 8); // вся дата
tdt := copy(s, pos('T', s, 1) + 1, 4); // все время
dt := EncodeDate(strtoint(copy(sdt, 1, 4)), strtoint(copy(sdt, 5, 2)),
strtoint(copy(sdt, 7, 2))); // цифры переводим в дату
tm := encodetime(strtoint(copy(tdt, 1, 2)), strtoint(copy(tdt, 3, 2)), 0,
0); // цифры переводим в время
DateEdit1.DateTime := dt + tm;
Label1.Text := summa;
Button2.Hint := fn; // кнопке сканера присаиваем результат фн
dm.magaz.Open('select * from magaz'); //список магазинов
fn_find := dm.magaz.Lookup('fn', fn, 'name'); //ищем имя магазина в бд
fn_name_find := dm.magaz.Lookup('fn', fn, 'fn'); //ищем фн в бд
if vartype(fn_name_find) = varnull then
begin
Label40.Text := 'Не известный магазин'; // Не известный магазин
Label40.tag := 0; // такого фн нет в БД
end
else if (vartype(fn_find) = varnull) or (fn_find = '') then
begin
Label40.Text := 'Не известный магазин'; // Не известный магазин
Label40.tag := 2; // у этого ФН нет названияв в БД
end
else
begin
Label40.Text := fn_find; // название найденного по фн магазина
Label40.tag := 1; // название магазина есть в БД
end;
if Label40.tag <> 4 then
Label40.HitTest := True;
end
else
showmessage('QR код не содержит нужных данных');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FBarcode.Scan;
end;
Содержимое FMX.ALDevBarcode
unit FMX.ALDevBarcode;
interface
uses
FMX.Types, FMX.Platform, System.Classes, System.Rtti,
Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;
type
TALDevBarcodeScanEvent = procedure (Sender: TObject; AResult: string) of object;
TALDevBarcode = class(TFmxObject)
private
FPreservedClipboardValue: TValue;
FMonitorClipboard: Boolean;
FClipService: IFMXClipboardService;
FOnScanResult: TALDevBarcodeScanEvent;
function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
procedure DoScanResult(AValue: string);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Scan;
property OnScanResult: TALDevBarcodeScanEvent read FOnScanResult write FOnScanResult;
end;
implementation
{ TALDevBarcode }
constructor TALDevBarcode.Create(AOwner: TComponent);
var
aFMXApplicationEventService: IFMXApplicationEventService;
begin
inherited Create(AOwner);
FMonitorClipboard := False;
if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipService)) then
FClipService := nil;
if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then
aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)
else
Log.d('Application Event Service is not supported.');
end;
destructor TALDevBarcode.Destroy;
begin
inherited Destroy;
end;
procedure TALDevBarcode.DoScanResult(AValue: string);
begin
if Assigned(FOnScanResult) then
FOnScanResult(Self, AValue);
end;
function TALDevBarcode.HandleAppEvent(AAppEvent: TApplicationEvent;
AContext: TObject): Boolean;
function GetBarcodeValue: Boolean;
var
value: String;
begin
Result := False;
FMonitorClipboard := False;
if (FClipService.GetClipboard.ToString <> 'nil') then
begin
DoScanResult(FClipService.GetClipboard.ToString);
FClipService.SetClipboard(FPreservedClipboardValue);
Result := True;
end;
end;
begin
Result := False;
if FMonitorClipboard and (AAppEvent = TApplicationEvent.BecameActive) then
Result := GetBarcodeValue;
end;
procedure TALDevBarcode.Scan;
var
intent: JIntent;
begin
if Assigned(FClipService) then
begin
FPreservedClipboardValue := FClipService.GetClipboard;
FMonitorClipboard := True;
FClipService.SetClipboard('nil');
intent := TJIntent.Create;
intent.setAction(StringToJString('com.google.zxing.client.android.SCAN'));
//intent.putExtras(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('"SCAN_MODE", "CODE_39"'));
SharedActivity.startActivityForResult(intent, 0);
end;
end;
end.
После нажатия на button2 открывается сканер, сканирую и приложение зависает(в оснавном когда сканирую первый раз).
Вопрос
Aleks133
Добрый вечер. Пытаюсь добавить сканеровку qr кода в приложение.Делаю так:
uses FMX.ALDevBarcode; private FBarcode: TALDevBarcode; procedure BarcodeScanResult(Sender: TObject; AResult: string); procedure convert(s: string); procedure TForm1.BarcodeScanResult(Sender: TObject; AResult: string); var ScanThread: TScanthread; begin convert(AResult); end; procedure TForm1.convert(s: string); var d, t, sum_start, fn_start, i_start: integer; dt, tm: TDateTime; sdt, tdt, summa, fn, fn_find_str: string; fn_find, fn_name_find: variant; begin if ContainsText(s, 't=') and ContainsText(s, 'T') and ContainsText(s, '&s=') and ContainsText(s, '&fn=') then begin sum_start := pos('&s=', s, 1); // начало суммы fn_start := pos('&fn=', s, 1); // начало фн номера i_start := pos('&i=', s, 1); // начало i номера fn := copy(s, fn_start + 4, i_start - (fn_start + 4));//ФН номер summa := copy(s, sum_start + 3, fn_start - (sum_start + 3)); // сумма summa := stringreplace(summa, '.', ',', [rfReplaceAll]); sdt := copy(s, pos('t=', s, 1) + 2, 8); // вся дата tdt := copy(s, pos('T', s, 1) + 1, 4); // все время dt := EncodeDate(strtoint(copy(sdt, 1, 4)), strtoint(copy(sdt, 5, 2)), strtoint(copy(sdt, 7, 2))); // цифры переводим в дату tm := encodetime(strtoint(copy(tdt, 1, 2)), strtoint(copy(tdt, 3, 2)), 0, 0); // цифры переводим в время DateEdit1.DateTime := dt + tm; Label1.Text := summa; Button2.Hint := fn; // кнопке сканера присаиваем результат фн dm.magaz.Open('select * from magaz'); //список магазинов fn_find := dm.magaz.Lookup('fn', fn, 'name'); //ищем имя магазина в бд fn_name_find := dm.magaz.Lookup('fn', fn, 'fn'); //ищем фн в бд if vartype(fn_name_find) = varnull then begin Label40.Text := 'Не известный магазин'; // Не известный магазин Label40.tag := 0; // такого фн нет в БД end else if (vartype(fn_find) = varnull) or (fn_find = '') then begin Label40.Text := 'Не известный магазин'; // Не известный магазин Label40.tag := 2; // у этого ФН нет названияв в БД end else begin Label40.Text := fn_find; // название найденного по фн магазина Label40.tag := 1; // название магазина есть в БД end; if Label40.tag <> 4 then Label40.HitTest := True; end else showmessage('QR код не содержит нужных данных'); end; procedure TForm1.Button2Click(Sender: TObject); begin FBarcode.Scan; end;
Содержимое FMX.ALDevBarcode
unit FMX.ALDevBarcode; interface uses FMX.Types, FMX.Platform, System.Classes, System.Rtti, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; type TALDevBarcodeScanEvent = procedure (Sender: TObject; AResult: string) of object; TALDevBarcode = class(TFmxObject) private FPreservedClipboardValue: TValue; FMonitorClipboard: Boolean; FClipService: IFMXClipboardService; FOnScanResult: TALDevBarcodeScanEvent; function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure DoScanResult(AValue: string); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Scan; property OnScanResult: TALDevBarcodeScanEvent read FOnScanResult write FOnScanResult; end; implementation { TALDevBarcode } constructor TALDevBarcode.Create(AOwner: TComponent); var aFMXApplicationEventService: IFMXApplicationEventService; begin inherited Create(AOwner); FMonitorClipboard := False; if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipService)) then FClipService := nil; if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent) else Log.d('Application Event Service is not supported.'); end; destructor TALDevBarcode.Destroy; begin inherited Destroy; end; procedure TALDevBarcode.DoScanResult(AValue: string); begin if Assigned(FOnScanResult) then FOnScanResult(Self, AValue); end; function TALDevBarcode.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; function GetBarcodeValue: Boolean; var value: String; begin Result := False; FMonitorClipboard := False; if (FClipService.GetClipboard.ToString <> 'nil') then begin DoScanResult(FClipService.GetClipboard.ToString); FClipService.SetClipboard(FPreservedClipboardValue); Result := True; end; end; begin Result := False; if FMonitorClipboard and (AAppEvent = TApplicationEvent.BecameActive) then Result := GetBarcodeValue; end; procedure TALDevBarcode.Scan; var intent: JIntent; begin if Assigned(FClipService) then begin FPreservedClipboardValue := FClipService.GetClipboard; FMonitorClipboard := True; FClipService.SetClipboard('nil'); intent := TJIntent.Create; intent.setAction(StringToJString('com.google.zxing.client.android.SCAN')); //intent.putExtras(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('"SCAN_MODE", "CODE_39"')); SharedActivity.startActivityForResult(intent, 0); end; end; end.
После нажатия на button2 открывается сканер, сканирую и приложение зависает(в оснавном когда сканирую первый раз).
Ссылка на комментарий
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.