Hola, claro que si se puede. Solo que si dicha variable es utilizada por otros hilos más, te recomiendo meter esa asignación en un "Synchronize" todo esto para evitar errores de acceso de memoria o errores de acceso múltiple.
Revisando tu código, hice algunas correcciones y te hago de forma constructiva las siguientes observaciones.
- Los cambios dados a componentes visuales dentro de otros hilos que no sean el hilo principal, deben ir dentro de un Synchronize.
- Los mensajes, cuadros de diálogo y cambios en variables globales, de igual forma van dentro de un Synchronize.
Observé también que mostrabas mensajes y después hacias un exit; puedo intuir que no apreciabas el cambio del valor de la variable por que en algún punto tu app caía en las líneas que mostraban mensajes pero como no sincronizabas con el hilo principal, no se veía nada y no cambiaba la variable por el exit antes mencionado.
Te dejo más o menos cómo quedaría tu código y como comentario final, no olvides que la impresión tanto en Android como en Windows siempre debe llamarse en el Hilo principal.
Si haces eso desde otro hilo aplica algo como esto para que se ejecute en el hilo principal
Código Delphi
[-]
TThread.Synchronize(nil,
procedure
begin
Imprimir;
end);
//Tu código
Código Delphi
[-]
procedure ImpresoraConectada;
procedure ImpresoraLista;
private
Impresora : TBluetoothDevice;
FSocket: TBluetoothSocket;
BluetoothAdapter: TBluetoothAdapter;
FBluetoothManager : TBluetoothManager;
ServiceGUI : String;
Guid : TGUID;
ServiceName : String;
ResultadoImpresora : Boolean;
public
end;
var
Presu: TPresu;
implementation
procedure TPresu.ImpresoraLista;
var
Thread: TThread;
begin
Thread:= TThread.CreateAnonymousThread(
procedure
begin
ImpresoraConectada;
end);
Thread.FreeOnTerminate:= True;
Thread.Start;
end;
procedure TPresu.ImpresoraConectada;
var
Msg: string;
I, B: Integer;
ListaVinculados: TBluetoothDeviceList;
LServices: TBluetoothServiceList;
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
ResultadoImpresora := False;
end);
try
FBluetoothManager := TBluetoothManager.Current;
if not Assigned(FBluetoothManager) then
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Mensaje(Form1.NoCodi(ST.Strings[79]), 0);
end;
Exit;
end;
FBluetoothManager.SocketTimeout := 100;
BluetoothAdapter := FBluetoothManager.CurrentAdapter;
if not Assigned(BluetoothAdapter) then
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Mensaje(Form1.NoCodi(ST.Strings[80]), 0);
end);
Exit;
end;
ListaVinculados := FBluetoothManager.GetPairedDevices(BluetoothAdapter);
if not Assigned(ListaVinculados) then
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Mensaje(Form1.NoCodi(ST.Strings[81]), 0);
end);
Exit;
end;
Impresora := ListaVinculados[DeviceElegido] as TBluetoothDevice;
if Impresora.IsPaired then
begin
LServices := Impresora.GetServices;
for B := 0 to LServices.Count - 1 do
begin
ServiceGUI := GUIDToString(LServices[b].UUID);
Guid := LServices[b].UUID;
ServiceName := LServices[b].Name;
end;
end
else
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Mensaje(Form1.NoCodi(ST.Strings[82]), 0);
end;
Exit;
end;
except
on E: Exception do
begin
Msg := E.Message;
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Mensaje('Error al Conectar el Software de la Impresora: ' + Msg, 0);
end);
Exit;
end;
end;
try
FSocket := Impresora.CreateClientSocket(Guid, true);
if (Assigned(Impresora)) And (Assigned(FSocket)) then
Begin
FSocket.Connect; TThread.Synchronize(TThread.CurrentThread,
procedure
begin
ResultadoImpresora := True;
end);
FSocket.Close; End;
except
on E: Exception do
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
ResultadoImpresora := False; end);
Exit;
end;
end;
end;
-------------------------------------------------------------------
ImpresoraLista;
if not ResultadoImpresora then begin
end
else
begin
end;