I have the following code that runs OK under win but can't compile on 64bit android. Even when I paste the TMSFNCWXCamera module itself on an otherwise working project with only tlabel labels, the project doesn't even show up on the connected phone :(
PS in project settings Camera is enabled
unit TabbedTemplate;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.TabControl,
FMX.StdCtrls, FMX.Gestures, FMX.Controls.Presentation, FMX.TMSFNCTypes,
FMX.TMSFNCUtils, FMX.TMSFNCGraphics, FMX.TMSFNCGraphicsTypes,
FMX.TMSFNCCustomControl, FMX.TMSFNCWebBrowser, FMX.TMSFNCCustomWEBControl,
FMX.TMSFNCWXCamera, FMX.TMSFNCCustomWEBComponent, FMX.TMSFNCWXBarcodeDecoder,
FMX.TMSFNCWXQRDecoder, FMX.Edit, FMX.TMSFNCEdit, System.Math.Vectors,
FMX.Controls3D, FMX.Layers3D, FMX.Objects, FMX.Layouts, Data.DB,
RemoteDB.Client.Dataset;
type
TTabbedForm = class(TForm)
HeaderToolBar: TToolBar;
lblWelcome: TLabel;
TabControl1: TTabControl;
TabItem1: TTabItem;
TabItem2: TTabItem;
TabItem3: TTabItem;
TabItem4: TTabItem;
GestureManager1: TGestureManager;
TMSFNCWXCamera1: TTMSFNCWXCamera;
btn_Scan: TButton;
TMSFNCWXQRDecoder1: TTMSFNCWXQRDecoder;
Button2: TButton; // Tlačítko "Stop Scan"
TMSFNCEdit1: TTMSFNCEdit; // Ponecháno dle původního kódu, i když se zdá nepoužité v logice
btn_Odeslat: TButton; // Hlavní tlačítko Odeslat/Start Scan
txt_zakazka: TTMSFNCEdit;
Layout3D1: TLayout3D;
Layout3D2: TLayout3D;
LayoutSemafor: TLayout;
CircleSemafor: TCircle;
lblSemaforText: TLabel;
lblConnectionStatus: TLabel;
LayoutTechnicianInfo: TLayout;
lblTechnicianInfo: TLabel;
lblDepartment: TLabel;
lblLastActivity: TLabel; // Textové pole pro ID zakázky
procedure FormCreate(Sender: TObject);
procedure FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo;
var Handled: Boolean);
procedure btn_ScanClick(Sender: TObject); // Klik na původní tlačítko Scan
procedure btn_OdeslatClick(Sender: TObject); // Klik na tlačítko Odeslat
procedure TMSFNCWXQRDecoder1Decoded(Sender: TObject; AFound: Boolean;
const AResult: string);
procedure Button2Click(Sender: TObject); // Klik na tlačítko Stop (Button2)
procedure txt_zakazkaChange(Sender: TObject); // Událost OnChange pro txt_zakazka
private
{ Private declarations }
FScanning: Boolean; // Příznak, zda probíhá skenování
procedure StartScanningProcess; // Pomocná metoda pro spuštění skenování
procedure StopScanning(AUserCancelled: Boolean = False); // Pomocná metoda pro zastavení
public
{ Public declarations }
end;
var
TabbedForm: TTabbedForm;
implementation
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}
{$R *.Windows.fmx MSWINDOWS}
{$R *.LgXhdpiPh.fmx ANDROID}
procedure TTabbedForm.FormCreate(Sender: TObject);
begin
FScanning := False;
TMSFNCWXQRDecoder1.Camera := TMSFNCWXCamera1;
TabControl1.ActiveTab := TabItem1;
TMSFNCWXCamera1.Visible := False; // Kamera je na začátku skrytá
Button2.Visible := False; // Tlačítko "Stop" je na začátku skryté
btn_Scan.Visible := True; // Původní tlačítko "Scan" je viditelné
btn_Odeslat.Visible := True; // Tlačítko "Odeslat" je viditelné
end;
procedure TTabbedForm.txt_zakazkaChange(Sender: TObject);
begin
// Pokud textové pole NENÍ prázdné po změně, vyvoláme akci odeslání.
if Trim(txt_zakazka.Text) <> '' then
begin
// Zkontrolujeme, zda neprobíhá skenování, aby se předešlo nechtěnému spuštění
// logiky odeslání během nastavování textu ze skeneru (mělo by být FScanning=False).
if not FScanning then
begin
btn_OdeslatClick(Self); // Vyvolá část pro odeslání v btn_OdeslatClick
end;
end;
end;
procedure TTabbedForm.StartScanningProcess;
begin
if FScanning then Exit; // Pokud již skenujeme, nic nedělat
if TMSFNCWXQRDecoder1.Camera <> TMSFNCWXCamera1 then
begin
TMSFNCWXQRDecoder1.Camera := TMSFNCWXCamera1;
end;
// UI změny pro aktivní skenování
TMSFNCWXCamera1.Visible := True;
Button2.Visible := True; // Zobrazit tlačítko STOP
btn_Odeslat.Visible := False; // Skrýt tlačítko Odeslat
btn_Scan.Visible := False; // Skrýt i původní tlačítko Scan
try
FScanning := True; // Nastavit příznak PŘED startem
TMSFNCWXCamera1.Start;
except
on E: Exception do
begin
FScanning := False; // Resetovat
TMSFNCWXCamera1.Visible := False;
Button2.Visible := False;
btn_Odeslat.Visible := True; // Obnovit viditelnost Odeslat
btn_Scan.Visible := True; // Obnovit viditelnost Scan
ShowMessage('Chyba při spouštění kamery: ' + E.Message);
try TMSFNCWXCamera1.Stop; except end;
end;
end;
end;
procedure TTabbedForm.btn_OdeslatClick(Sender: TObject);
begin
if FScanning and (Trim(txt_zakazka.Text) = '') then
begin
Exit;
end;
if Trim(txt_zakazka.Text) = '' then
begin
// --- POLE JE PRÁZDNÉ: Spustit skenování ---
StartScanningProcess;
end
else
begin
// --- POLE NENÍ PRÁZDNÉ: Odeslat data ---
ShowMessage('Odesílám číslo zakázky: ' + txt_zakazka.Text);
// TODO: Implementujte zde volání vašeho REST API klienta s použitím SecureBridge
// Např.: MySecureBridgeClient.SendData(txt_zakazka.Text);
end;
end;
procedure TTabbedForm.btn_ScanClick(Sender: TObject);
begin
StartScanningProcess;
end;
procedure TTabbedForm.StopScanning(AUserCancelled: Boolean = False);
begin
if not FScanning then Exit;
FScanning := False;
try
TMSFNCWXCamera1.Stop;
except
on E: Exception do
ShowMessage('Chyba při zastavování kamery: ' + E.Message);
end;
TMSFNCWXCamera1.Visible := False;
Button2.Visible := False;
btn_Scan.Visible := True;
btn_Odeslat.Visible := True;
if AUserCancelled then
begin
ShowMessage('Skenování zastaveno uživatelem.');
end;
end;
procedure TTabbedForm.TMSFNCWXQRDecoder1Decoded(Sender: TObject; AFound: Boolean;
const AResult: string);
begin
// Nejprve zkontrolujeme, zda skenování vůbec má běžet.
// Pokud FScanning je False, znamená to, že skenování bylo již zastaveno
// (např. uživatelem nebo předchozím úspěšným nálezem), takže tuto událost ignorujeme.
if not FScanning then
Exit;
if AFound then
begin
// QR KÓD BYL NALEZEN!
// 1. Zastavíme skenování (protože už máme výsledek).
// Voláme StopScanning bez parametru True, protože to není zrušení uživatelem.
StopScanning;
// 2. Zpracujeme nalezený výsledek v hlavním vlákně.
TThread.Synchronize(nil,
procedure
begin
txt_zakazka.Text := AResult; // Přiřazení textu spustí událost txt_zakazkaChange,
// která (pokud je text neprázdný) zavolá btn_OdeslatClick
// pro odeslání dat.
ShowMessage('QR Kód načten: ' + AResult);
end);
end
else
begin
// QR KÓD NEBYL V TOMTO CYKLU NALEZEN
// Nic neděláme. Skenování pokračuje automaticky dál,
// dokud uživatel nestiskne "Stop" nebo dokud kód není nalezen.
// Můžete sem přidat logování do konzole pro ladění, pokud chcete sledovat cykly,
// ale žádné ShowMessage, které by blokovalo běh.
// např. OutputDebugString(PChar('QR kód nenalezen v tomto cyklu, pokračuji...'));
end;
end;
procedure TTabbedForm.Button2Click(Sender: TObject);
begin
StopScanning(True); // Uživatel kliknul na "Stop"
end;
procedure TTabbedForm.FormGesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
{$IFDEF ANDROID}
case EventInfo.GestureID of
sgiLeft:
begin
if TabControl1.ActiveTab <> TabControl1.Tabs[TabControl1.TabCount-1] then
TabControl1.ActiveTab := TabControl1.Tabs[TabControl1.TabIndex+1];
Handled := True;
end;
sgiRight:
begin
if TabControl1.ActiveTab <> TabControl1.Tabs[0] then
TabControl1.ActiveTab := TabControl1.Tabs[TabControl1.TabIndex-1];
Handled := True;
end;
end;
{$ENDIF}
end;
end.