德尔福Firemonkey“破管”例外

时间:2016-12-28 11:24:01

标签: android delphi printing bluetooth firemonkey

故事:我的应用程序专为移动平台设计,并与蓝牙点阵打印机有自己的连接,可在区域或字段上打印一些发票和文档。一些Android设备工作得很好但是当用户试图打印某些内容时,其中一些设备总是会丢失管道异常。

过程:

  1. 我使用 TBluetoothManager TBluetoothDeviceList 获取配对设备列表,并将所有配对设备存储在config ini文件中。
  2. 当用户想要打印时,我初始化与准备打印的设备连接,然后逐行发送发票到 TBluetoothSocket 对象。
  3. 我使用此功能将每行更改为Byte Array;
  4. CD

    然后我将我的值作为字节数组发送到 function StrToByteArr(strData: String): TArray<Byte>; var eEncoding: TEncoding; begin eEncoding := TEncoding.GetEncoding(857); Result := eEncoding.GetBytes(strData); end;

    问题:我尝试使用10多种不同的设备打印我的值,成功率不够好(8/20设备工作正常)。我该怎么办?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用 Androidapi.JNI.BluetoothAdapter.pas 库直接从Delphi代码处理所有这些配置。 它有 JBluetoothSocketClass ,它工作正常!

-

将字符串值转换为Byte JavaArray

function StringToJA(Data: String): TJavaArray<Byte>;
var
  X: integer;
  len: integer;
begin
  len := Length(Data);
  Result := TJavaArray<Byte>.Create(len);
  for X := 0 to len do
  begin
    Result.Items[X] := Ord(Data[X]);
  end;
end;

输出流使用

  oStream := Sock.getOutputStream;
  text := CHR(15) + ' ------  ----- HELLO WORLD ----- ------'
                 + CHR(10) + CHR(13);
  oStream.write(StringToJA(text));

答案 1 :(得分:0)

function StringToJA(Data: String): TJavaArray<Byte>;
var
  X: integer;
  len: integer;
begin
  len := Length(Data);
  Result := TJavaArray<Byte>.Create(len);
  for X := 0 to len do
  begin
    Result.Items[X] := Ord(Data[X]);
  end;
end;

有时使用上面的功能,应用程序会崩溃而没有任何意外情况

使用以下功能,应用程序可以打印数据并正常工作

function StringToJA(Data: String): TJavaArray<Byte>;
var
  Arr: TBytes;
  len: integer;
begin
  Arr := TEncoding.Default.GetBytes(Data);
  len := Length(Arr);
  Result := TJavaArray<Byte>.Create(len);
  if len > 0 then Move(Arr[0], Result.Data^, len);
end;