【问题标题】:Delphi Firemonkey "Broken Pipe" ExceptionDelphi Firemonkey“断管”异常
【发布时间】:2016-12-28 11:24:01
【问题描述】:

故事: 我的应用程序是为移动平台设计的,并且有自己的蓝牙点阵打印机连接,可以在区域或现场打印一些发票和文件。一些 android 设备运行良好,但是当用户尝试打印某些东西时,其中一些总是抛出损坏的管道异常。

流程:

  1. 我使用 TBluetoothManagerTBluetoothDeviceList 来获取配对设备列表,并将所有配对设备存储在配置 ini 文件中。
  2. 当用户想要打印时,我初始化与准备打印的设备的连接,然后我将发票逐行发送到 TBluetoothSocket 对象。
  3. 我用这个函数把每一行改成字节数组;

function StrToByteArr(strData: String): TArray<Byte>; var eEncoding: TEncoding; begin eEncoding := TEncoding.GetEncoding(857); Result := eEncoding.GetBytes(strData); end;

然后我将我的值作为字节数组发送到 TBluetoothSocket.SendData(Byte&gt;) Method

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

【问题讨论】:

    标签: android delphi printing bluetooth firemonkey


    【解决方案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));
    

    【讨论】:

      【解决方案2】:
      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;
      

      【讨论】:

        猜你喜欢
        • 2017-07-30
        • 2013-05-18
        • 2023-04-05
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 2012-09-05
        相关资源
        最近更新 更多