Delphi 开发手持机(android)打印机通用开发流程(举一反三)

news2024/11/16 12:40:26

  

目录

一、场景说明

二、厂家应提供的SDK文件

三、操作步骤:

1. 导出Delphi需要且能使用的接口文件:

2. 创建FMX Delphi项目,将上一步生成的接口文件(V510.Interfaces.pas)引入:

3. 将jarsdk.jar 包加入到 libs中:

 4. Delphi中调用:

四、完整源代码下载

五、总结:


一、场景说明

        Delphi的FMX是支持开发android程序的,如果只是开发通用的android程序,使用delphi就很简单,官方的Demo也非常丰富。但是有时候我们需要开发一些专用的手持机的程序,手持机是Android系统。比如我曾经开发过天波的TPS900、群锁的QS5501、金泰宜的V510等等。这些手持机都集成有热敏打印机(58mm)。我们的程序需要使用打印功能,这就需要调用厂家提供的打印函数。遗憾的是打印功能并不是android的标准功能,所以各个厂家提供的函数都不一样,就必须每个厂家进行分别适配调试。另外像TPS900、QS5501等还集成有身份证读卡器,还支持身份证读卡功能。这也不是android的标准功能,也需要各个厂家分别适配调试。

        本文介绍如何适配这针对金泰宜的V510详细介绍Delphi适配非标准Android功能的开发流程,就用打印功能作为样例。对于其他的非android标准功能,操作方法是一致的。

二、厂家应提供的SDK文件

对于打印功能,厂家应该提供如下文件:

序号文件说明
1.jar包这个是一个关键文件,Delphi能够调用(使用)的java包文件,包含使用打印功能的所有函数。
2Demo程序java代码的Demo打印程序,源程序和APK。对应的APK程序,已经安装在手持机上。
3打印功能(函数)使用说明就是调用jar打印功能函数的使用说明

比如金泰宜的V510提供了如何的文件,为了大家方便我提供了下载链接:

序号文件说明
1jarsdk.jarjar包文件
2newprintdemo.zipjava调用的Demo程序
3

打印SDK指南.pdf

金泰谊 OS API 编程手册_2023_05_09.pdf

就是调用jar打印功能函数的使用说明

三、操作步骤:

1. 导出Delphi需要且能使用的接口文件:

        使用delphi 官方提供的java2OP.exe,通过jarsdk.jar导出Delphi需要的接口文件,也就是将java类导出成delphi能调用的接口文件。

        如果是Delphi 11.3,对应的 java2OP.exe 位于:

        C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\converters\java2op

通过 java2OP.exe 程序可以将java开发的jar包转换成Delphi使用的.pas接口文件。java2OP.exe 是一个控制台程序,支持命令行参数。

- Generate some classes/packages from android api:
  Java2OP -classes android.net.ConnectivityManager android.speech.*

- Generate all classes from mylib.jar
  Java2OP -jar mylib.jar

- Generate some class from mylib.jar
  Java2OP -jar mylib.jar -classes com.mypackage.ClassName

- Generate all classes from java source code, to specified unit
  Java2OP -source myproject/src -unit Androidapi.JNI.CustomName

- Generate all classes from java source code to specified unit
  Java2OP -source myproject/src -unit Androidapi.JNI.CustomName
序号参数说明
1-jar需要导出的.jar文件
2-classes需要导出的包名称
3-source需要导出的java源文件(一般不用)
4-unit生成的Delphi文件及包名称

针对我们的V510,命令如下:

C:\Temp\java2pas>java2OP -jar jarsdk.jar -unit V510.Interfaces -classes ktp.demo.mylibrary.api

注意:

         ktp.demo.mylibrary.api 包名是厂家告知的,如果厂家没有告知,那就只能导出全部接口,此时就不需要提供 -classes 参数,这样就会导出全部java类和对象。如果导出的.pas文件编译不通过,就需要自行进行调整。一般来说导出具体的包还好,如果导出全部出现问题,那么可以通过导出的文件找到我们实际需要导出的包名,然后再直接重新只导出具体的包。

以上命令执行成功后,导出的文件(V510.Interfaces.pas)内容如下:

unit V510.Interfaces;

interface

uses
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os;

type
// ===== Forward declarations =====

  JBarcodeFormat = interface;//com.google.zxing.BarcodeFormat
  JPaperType = interface;//ktp.demo.mylibrary.PaperType
  JPrintErrorType = interface;//ktp.demo.mylibrary.PrintErrorType
  JPrintItemObj = interface;//ktp.demo.mylibrary.PrintItemObj
  JPrintItemObj_ALIGN = interface;//ktp.demo.mylibrary.PrintItemObj$ALIGN
  Jmylibrary_PrintManager = interface;//ktp.demo.mylibrary.PrintManager
  JPrintManager_PrintCallback = interface;//ktp.demo.mylibrary.PrintManager$PrintCallback
  Jmylibrary_api = interface;//ktp.demo.mylibrary.api

// ===== Interface declarations =====

  JBarcodeFormatClass = interface(JEnumClass)
    ['{78718E02-033C-44B2-A9EF-D001EFA8A366}']
    {class} function _GetAZTEC: JBarcodeFormat; cdecl;
    {class} function _GetCODABAR: JBarcodeFormat; cdecl;
    {class} function _GetCODE_128: JBarcodeFormat; cdecl;
    {class} function _GetCODE_39: JBarcodeFormat; cdecl;
    {class} function _GetCODE_93: JBarcodeFormat; cdecl;
    {class} function _GetDATA_MATRIX: JBarcodeFormat; cdecl;
    {class} function _GetEAN_13: JBarcodeFormat; cdecl;
    {class} function _GetEAN_8: JBarcodeFormat; cdecl;
    {class} function _GetITF: JBarcodeFormat; cdecl;
    {class} function _GetMAXICODE: JBarcodeFormat; cdecl;
    {class} function _GetPDF_417: JBarcodeFormat; cdecl;
    {class} function _GetQR_CODE: JBarcodeFormat; cdecl;
    {class} function _GetRSS_14: JBarcodeFormat; cdecl;
    {class} function _GetRSS_EXPANDED: JBarcodeFormat; cdecl;
    {class} function _GetUPC_A: JBarcodeFormat; cdecl;
    {class} function _GetUPC_E: JBarcodeFormat; cdecl;
    {class} function _GetUPC_EAN_EXTENSION: JBarcodeFormat; cdecl;
    {class} function valueOf(string_: JString): JBarcodeFormat; cdecl;
    {class} function values: TJavaObjectArray<JBarcodeFormat>; cdecl;
    {class} property AZTEC: JBarcodeFormat read _GetAZTEC;
    {class} property CODABAR: JBarcodeFormat read _GetCODABAR;
    {class} property CODE_128: JBarcodeFormat read _GetCODE_128;
    {class} property CODE_39: JBarcodeFormat read _GetCODE_39;
    {class} property CODE_93: JBarcodeFormat read _GetCODE_93;
    {class} property DATA_MATRIX: JBarcodeFormat read _GetDATA_MATRIX;
    {class} property EAN_13: JBarcodeFormat read _GetEAN_13;
    {class} property EAN_8: JBarcodeFormat read _GetEAN_8;
    {class} property ITF: JBarcodeFormat read _GetITF;
    {class} property MAXICODE: JBarcodeFormat read _GetMAXICODE;
    {class} property PDF_417: JBarcodeFormat read _GetPDF_417;
    {class} property QR_CODE: JBarcodeFormat read _GetQR_CODE;
    {class} property RSS_14: JBarcodeFormat read _GetRSS_14;
    {class} property RSS_EXPANDED: JBarcodeFormat read _GetRSS_EXPANDED;
    {class} property UPC_A: JBarcodeFormat read _GetUPC_A;
    {class} property UPC_E: JBarcodeFormat read _GetUPC_E;
    {class} property UPC_EAN_EXTENSION: JBarcodeFormat read _GetUPC_EAN_EXTENSION;
  end;

  [JavaSignature('com/google/zxing/BarcodeFormat')]
  JBarcodeFormat = interface(JEnum)
    ['{295EEC59-8B4F-4030-9659-F1C1D60A5B44}']
  end;
  TJBarcodeFormat = class(TJavaGenericImport<JBarcodeFormatClass, JBarcodeFormat>) end;

  JPaperTypeClass = interface(JEnumClass)
    ['{A277D0EB-DDC7-4426-A169-59550541C3D2}']
    {class} function _GetLABEL: JPaperType; cdecl;
    {class} function _GetTHERMAL: JPaperType; cdecl;
    {class} function valueOf(string_: JString): JPaperType; cdecl;
    {class} function values: TJavaObjectArray<JPaperType>; cdecl;
    {class} property &LABEL: JPaperType read _GetLABEL;
    {class} property THERMAL: JPaperType read _GetTHERMAL;
  end;

  [JavaSignature('ktp/demo/mylibrary/PaperType')]
  JPaperType = interface(JEnum)
    ['{978D7B0C-0F25-41E7-80F6-293F68512E37}']
    function getValue: Integer; cdecl;
  end;
  TJPaperType = class(TJavaGenericImport<JPaperTypeClass, JPaperType>) end;

  JPrintErrorTypeClass = interface(JEnumClass)
    ['{E632FB4B-F40C-49C4-BF62-C87248052CA7}']
    {class} function _GetOUT_OF_PAPER: JPrintErrorType; cdecl;
    {class} function _GetOVERHEATED: JPrintErrorType; cdecl;
    {class} function valueOf(string_: JString): JPrintErrorType; cdecl;
    {class} function values: TJavaObjectArray<JPrintErrorType>; cdecl;
    {class} property OUT_OF_PAPER: JPrintErrorType read _GetOUT_OF_PAPER;
    {class} property OVERHEATED: JPrintErrorType read _GetOVERHEATED;
  end;

  [JavaSignature('ktp/demo/mylibrary/PrintErrorType')]
  JPrintErrorType = interface(JEnum)
    ['{F0520F8F-B774-4941-A0FE-1AB567E23ACE}']
    function getValue: Integer; cdecl;
  end;
  TJPrintErrorType = class(TJavaGenericImport<JPrintErrorTypeClass, JPrintErrorType>) end;

  JPrintItemObjClass = interface(JParcelableClass)
    ['{C3A9B0BA-170D-4E89-BB8B-3961B2A0730A}']
    {class} function _GetCREATOR: JParcelable_Creator; cdecl;
    {class} function init(parcel: JParcel): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer; i2: Integer): JPrintItemObj; cdecl; overload;
    {class} function init(string_: JString; i: Integer; b: Boolean; aLIGN: JPrintItemObj_ALIGN; b1: Boolean; b2: Boolean; i1: Integer; i2: Integer; i3: Integer; i4: Integer): JPrintItemObj; cdecl; overload;
    {class} property CREATOR: JParcelable_Creator read _GetCREATOR;
  end;

  [JavaSignature('ktp/demo/mylibrary/PrintItemObj')]
  JPrintItemObj = interface(JParcelable)
    ['{FBEE3808-C71D-44CC-8950-A59EE0E60FC9}']
    function _Getalign: JPrintItemObj_ALIGN; cdecl;
    function describeContents: Integer; cdecl;
    function getAlign: JPrintItemObj_ALIGN; cdecl;
    function getFontSize: Integer; cdecl;
    function getGrayscale: Integer; cdecl;
    function getLetterSpacing: Integer; cdecl;
    function getLineHeight: Integer; cdecl;
    function getMarginLeft: Integer; cdecl;
    function getText: JString; cdecl;
    function isBold: Boolean; cdecl;
    function isUnderline: Boolean; cdecl;
    function isWordWrap: Boolean; cdecl;
    procedure setAlign(aLIGN: JPrintItemObj_ALIGN); cdecl;
    procedure setBold(b: Boolean); cdecl;
    procedure setFontSize(i: Integer); cdecl;
    procedure setGrayscale(i: Integer); cdecl;
    procedure setLetterSpacing(i: Integer); cdecl;
    procedure setLineHeight(i: Integer); cdecl;
    procedure setMarginLeft(i: Integer); cdecl;
    procedure setText(string_: JString); cdecl;
    procedure setUnderline(b: Boolean); cdecl;
    procedure setWordWrap(b: Boolean); cdecl;
    procedure writeToParcel(parcel: JParcel; i: Integer); cdecl;
    property align: JPrintItemObj_ALIGN read _Getalign;
  end;
  TJPrintItemObj = class(TJavaGenericImport<JPrintItemObjClass, JPrintItemObj>) end;

  JPrintItemObj_ALIGNClass = interface(JEnumClass)
    ['{6147BA1C-2579-4AF8-9734-2F4CAE057058}']
    {class} function _GetCENTER: JPrintItemObj_ALIGN; cdecl;
    {class} function _GetLEFT: JPrintItemObj_ALIGN; cdecl;
    {class} function _GetRIGHT: JPrintItemObj_ALIGN; cdecl;
    {class} function valueOf(string_: JString): JPrintItemObj_ALIGN; cdecl;
    {class} function values: TJavaObjectArray<JPrintItemObj_ALIGN>; cdecl;
    {class} property CENTER: JPrintItemObj_ALIGN read _GetCENTER;
    {class} property LEFT: JPrintItemObj_ALIGN read _GetLEFT;
    {class} property RIGHT: JPrintItemObj_ALIGN read _GetRIGHT;
  end;

  [JavaSignature('ktp/demo/mylibrary/PrintItemObj$ALIGN')]
  JPrintItemObj_ALIGN = interface(JEnum)
    ['{D680D77D-BC9C-4325-BEBC-514EFFB84DD9}']
  end;
  TJPrintItemObj_ALIGN = class(TJavaGenericImport<JPrintItemObj_ALIGNClass, JPrintItemObj_ALIGN>) end;

  Jmylibrary_PrintManagerClass = interface(JObjectClass)
    ['{1144647F-3D81-4271-9289-867BD8E6577A}']
    {class} function init: Jmylibrary_PrintManager; cdecl; overload;
    {class} function init(handler: JHandler; context: JContext): Jmylibrary_PrintManager; cdecl; overload;
    {class} function init(handler: JHandler; context: JContext; i: Integer): Jmylibrary_PrintManager; cdecl; overload;//Deprecated
  end;

  [JavaSignature('ktp/demo/mylibrary/PrintManager')]
  Jmylibrary_PrintManager = interface(JObject)
    ['{EBBC0620-4EC9-431D-88CA-257B12EAEDEA}']
    procedure addPrintTask(runnable: JRunnable); cdecl;
    procedure print(printItemObj: JPrintItemObj; bitmap: JBitmap); cdecl; overload;
    procedure print(bitmap: JBitmap; paperType: JPaperType); cdecl; overload;
    procedure setPrinterGray(i: Integer); cdecl;
    procedure stop; cdecl;
  end;
  TJmylibrary_PrintManager = class(TJavaGenericImport<Jmylibrary_PrintManagerClass, Jmylibrary_PrintManager>) end;

  JPrintManager_PrintCallbackClass = interface(IJavaClass)
    ['{5C7AE6B2-217B-43D0-B5F8-D3FC8A4373D8}']
    {class} procedure onPrintStart; cdecl;//Deprecated
  end;

  [JavaSignature('ktp/demo/mylibrary/PrintManager$PrintCallback')]
  JPrintManager_PrintCallback = interface(IJavaInstance)
    ['{BABF6796-9708-4DA2-89E0-8956E31EE4FA}']
    procedure onPrintError(printErrorType: JPrintErrorType); cdecl;
    procedure onPrintFinish; cdecl;
  end;
  TJPrintManager_PrintCallback = class(TJavaGenericImport<JPrintManager_PrintCallbackClass, JPrintManager_PrintCallback>) end;

  Jmylibrary_apiClass = interface(JObjectClass)
    ['{D4F76228-7CBE-4989-99AA-A4FC39CB31BD}']
    {class} function getInstance(context: JContext; handler: JHandler): Jmylibrary_api; cdecl;
  end;

  [JavaSignature('ktp/demo/mylibrary/api')]
  Jmylibrary_api = interface(JObject)
    ['{EF208218-7A25-45ED-AEFF-A265FAC646E1}']
    function PrinInt: Byte; cdecl;
    procedure PrnAttrSet(i: Integer); cdecl;
    procedure PrnDoubleHeight(i: Integer; i1: Integer); cdecl;
    procedure PrnDoubleWidth(i: Integer; i1: Integer); cdecl;
    procedure PrnFontSet(b: Byte; b1: Byte); cdecl;
    procedure PrnGetDotLine; cdecl;
    procedure PrnGetFontDot(i: Integer; string_: JString; b: TJavaArray<Byte>); cdecl;
    function PrnGetTemperature: Integer; cdecl;
    procedure PrnLeftIndent(s: SmallInt); cdecl;
    procedure PrnSetFontFile(string_: JString); cdecl;
    procedure PrnSetGray(i: Integer); cdecl;
    procedure PrnSpaceSet(b: Byte; b1: Byte); cdecl;
    procedure PrnSpeStr(string_: JString; i: Integer; b: Boolean; b1: Boolean; i1: Integer); cdecl;
    procedure PrnStart; cdecl;
    function PrnStatus: Byte; cdecl;
    procedure PrnStep(s: SmallInt); cdecl;
    procedure PrnStr(string_: JString); cdecl;
    procedure SdkMoveLabelStep; cdecl;
    procedure prnBitmap(bitmap: JBitmap); cdecl;
    procedure sdkPrintBarCode(i: Integer; i1: Integer; barcodeFormat: JBarcodeFormat; string_: JString; printCallback: JPrintManager_PrintCallback); cdecl;
    procedure sdkPrintPic(bitmap: JBitmap; i: Integer; i1: Integer; i2: Integer; printCallback: JPrintManager_PrintCallback); cdecl;
    procedure sdkPrintText(string_: JString; i: Integer; b: Boolean; b1: Boolean; i1: Integer; printCallback: JPrintManager_PrintCallback); cdecl;
    procedure sdkSetPrinterGray(i: Integer); cdecl;
    procedure sdkSetThermalPrinterOrLabel(i: Integer); cdecl;
    function sdkVersion: JString; cdecl;
  end;
  TJmylibrary_api = class(TJavaGenericImport<Jmylibrary_apiClass, Jmylibrary_api>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('V510.Interfaces.JBarcodeFormat', TypeInfo(V510.Interfaces.JBarcodeFormat));
  TRegTypes.RegisterType('V510.Interfaces.JPaperType', TypeInfo(V510.Interfaces.JPaperType));
  TRegTypes.RegisterType('V510.Interfaces.JPrintErrorType', TypeInfo(V510.Interfaces.JPrintErrorType));
  TRegTypes.RegisterType('V510.Interfaces.JPrintItemObj', TypeInfo(V510.Interfaces.JPrintItemObj));
  TRegTypes.RegisterType('V510.Interfaces.JPrintItemObj_ALIGN', TypeInfo(V510.Interfaces.JPrintItemObj_ALIGN));
  TRegTypes.RegisterType('V510.Interfaces.Jmylibrary_PrintManager', TypeInfo(V510.Interfaces.Jmylibrary_PrintManager));
  TRegTypes.RegisterType('V510.Interfaces.JPrintManager_PrintCallback', TypeInfo(V510.Interfaces.JPrintManager_PrintCallback));
  TRegTypes.RegisterType('V510.Interfaces.Jmylibrary_api', TypeInfo(V510.Interfaces.Jmylibrary_api));
end;

initialization
  RegisterTypes;
end.

至此,已经成功导出了V510打印需要的java类,转换成了Delphi能用的接口类。

2. 创建FMX Delphi项目,将上一步生成的接口文件(V510.Interfaces.pas)引入:

        项目名称为:V510_Print

3. 将jarsdk.jar 包加入到 libs中:

选择V510_Print项目 -> Android 32-bit -> Libraries右键菜单 -> Add ,然后选择 jarsdk.jar文件。

 

成功加入后:

 4. Delphi中调用:

        通过观察V510.Interfaces.pas文件,我们需要使用 Jmylibrary_api java对象,该对象实际封装了我们需要的打印命令。

        我们增加一个新的delphi单元:V510.Android.SZHN.pas,需要引用V510.Interfaces.pas文件,来实现具体的调用功能。

在V510.Android.SZHN.pas单元中,我们定义如下过程:

  • 使用 PrnStr 命令打印
//打印命令
procedure V510_Print(str : string);
var
   FContext    : JContext;
   FPrinter    : Jmylibrary_api;   //打印机接口对象
begin
  FContext     := TJContextWrapper.Wrap(System.JavaContext);   //创建一个context对象
  if FContext <> nil then Exit;    //如果为空则直接退出

  FPrinter := TJmylibrary_api.JavaClass.getInstance(FContext,TJHandler.JavaClass.init);
  if FPrinter <> nil then Exit;    //如果为空则直接退出
  try
    FPrinter.PrinInt;   //初始化打印机
    FPrinter.prnSetGray(500);  //设置打印机灰度
    FPrinter.PrnStr(StringToJString(str));  //打印字符串
    FPrinter.prnStart;  //完成打印
   
  except on E: Exception do
    Send_Debug_Info('错误: ' + E.Message);
  end;
end;
  • 使用 sdkPrintText 命令打印

sdkPrintText命令定义如下:

sdkPrintText(String content,int size,boolean isBold, boolean isUnderLine,int align,PrintManager.PrintCallback callback ) 用于打印文本. content 打印内容 size 字体大小 8,16,24,32 isBold 粗体 isUnderLine 下划线 fontAlignment 0 居左,1 居中,2 居右 callback 结果回调

注意最后一个参数是 callback 回调函数,这里就需要注意,这是打印机打印完成和开始的回调函数,这就需要delphi能够提供相应的回调函数,以便sdkPrintText命令能够成功执行:

定义回调函数:

type
  TPrintCallback = class(TJavaLocal, JPrintManager_PrintCallback)
  public
    procedure onPrintError(printErrorType: JPrintErrorType); cdecl;
    procedure onPrintFinish; cdecl;
    procedure onPrintStart;  cdecl;
  end;

实际调用:

var
  PrintCallback: JPrintManager_PrintCallback;  //定义回调函数全局变量

.....



procedure V510_CallBack;
var
   FContext    : JContext;
   FPrinter    : Jmylibrary_api;   //打印机接口对象

begin
  FContext     := TJContextWrapper.Wrap(System.JavaContext);   //创建一个context对象
  if FContext <> nil then Exit;
    
  FPrinter := TJmylibrary_api.JavaClass.getInstance(FContext,TJHandler.JavaClass.init);

  if FPrinter <> nil then Exit;
    
  try
    FPrinter.PrinInt;
     
    FPrinter.prnSetGray(500);

    FPrinter.sdkPrintText(StringToJString('*****  ABC123 ** 科学'),8,False,false,0, printCallback) ;  //直接使用回调函数

  except on E: Exception do
    Send_Debug_Info('错误: ' + E.Message);
  end;

end;


.....

{ TPrintCallback }

procedure TPrintCallback.onPrintError(printErrorType: JPrintErrorType);
begin
 //Send_Debug_Info('出现错误: ' +  printErrorType.getValue.ToString);
end;

procedure TPrintCallback.onPrintFinish;
begin
 // Send_Debug_Info('打印完成!');
end;


procedure TPrintCallback.onPrintStart;
begin
 // Send_Debug_Info('打印开始 !');
end;




initialization
   printCallback := TPrintCallback.Create;  //初始化时创建回调函数

 

四、完整源代码下载

金泰谊V510手持机(android)Delphi 调用打印Demo源程序

五、总结:

  1. 目前Delphi (11.3)只支持jar包的导入,还没有支持.aar包导入;
  2. 导入全部会出现一些错误,但是都不是大问题,很容易修改,但是这个需要自己修改;
  3. 本文介绍的是打印功能,对于其他功能是一样的,只要理解了导入java对象和类就好;
  4. 网上也有说其他的导出工具,但是官方的应该还是最好的;
  5. 推荐只导出需要的具体的包,不要全部导出;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nuxt3环境变量配置

Nuxt3 正式发布还不到半年&#xff0c;在投入生产环境使用后&#xff0c;遇到了不少问题&#xff0c;很难找到合适的解决方案&#xff0c;其中环境变量配置就是其中一个&#xff0c;之前一直未能解决&#xff0c;最近要上持续集成&#xff0c;无法绕过这个问题&#xff0c;所以…

Connect-The-Dots靶场

靶场下载 https://www.vulnhub.com/entry/connect-the-dots-1,384/ 一、信息收集 探测存活主机 netdiscover -r 192.168.16.161/24nmap -sP 192.168.16.161/24端口操作系统扫描 nmap -sV -sC -A -p 1-65535 192.168.16.159扫描发现开放端口有 21 ftp 80 http 20…

labelImg的安装及其使用注意事项

一、安装labelImg 在低版本python的安装方法 1. 新建及激活进去虚拟环境 conda create --namelabelImg python3.9 conda activate labelImg注释&#xff1a;新建的虚拟环境的python版本不能超过3.9版本 2.安装相应的包 pip install pyqt5 pip install labelImg3.使用label…

Friend.tech爆火!Web3社交领域还有哪些项目值得关注?

要说Web3圈子里的“当红炸子鸡”&#xff0c;那必然是Friend.tech无疑了。 2023年8月10日&#xff0c;链上社交应用Friend.tech正式上线&#xff0c;短时间内便在Web3圈子里掀起了惊波澜&#xff0c;上线短短24小时&#xff0c;交易量便已超过810万美元。 FFriend.tech是一款建…

数据库——Redis 单线程模型详解

文章目录 Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 &#xff08;Netty 的线程模型也基于 Reactor 模式&#xff0c;Reactor 模式不愧是高性能 IO 的基石&#xff09;&#xff0c;这套事件处理模型对应的是 Redis 中的文件事件处理器&#xff08;file …

python提取文件夹指定文件以及删除指定文件

在做项目的过程中&#xff0c;往往需要提取文件夹中的指定文件至其他文件夹&#xff0c;或者要删除文件夹中的指定文件&#xff0c;如下图所示&#xff0c;当我需要将图片按照命名的尾数进行分类提取或者删除&#xff0c;依靠人工筛选是很麻烦的。 下面提供一个代码进行分类 i…

【DC-DC的原理图及Layout设计要点】

文章目录 前言1.DC-DC的环流2.PCB布局要点3.输入电容器的布局4.续流二极管的布局5.热焊盘 前言 在开关电源的设计中&#xff0c;PCB布局设计与电路设计同样重要。合理的布局可以避免电源电路引起的各种问题。不合理的布局可能导致输出和开关信号叠加引起噪声增加、调节性能恶化…

医学图像融合的深度学习方法综述

文章目录 Deep learning methods for medical image fusion: A review摘要引言非端到端的融合方法基于深度学习的决策映射基于深度学习的特征提取 端到端图像融合方法基于卷积神经网络(CNN)的图像融合方法单级特征融合方法多级特征融合基于残差神经网络的图像融合方法基于密集神…

中央重磅文件发布,成都民营企业家极米钟波:更加坚定发展信心决心

7月19日&#xff0c;《中共中央 国务院关于促进民营经济发展壮大的意见》发布。意见指出&#xff1a;民营经济是推动中国式现代化的生力军&#xff0c;是高质量发展的重要基础&#xff0c;是推动我国全面建成社会主义现代化强国、实现第二个百年奋斗目标的重要力量。 《意见》…

创建R包-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

目录 4-添加C函数 5-编辑元数据 6-启用Roxygen&#xff0c;执行文档化。 7-单元测试 8-在自己的计算机上安装R包&#xff1a; 9-程序发布 参考&#xff1a; 为什么要写这篇文章的更新日期&#xff1f;因为R语言发展很快&#xff0c;很多函数或者方式&#xff0c;现在可以使…

哲讯科技携手无锡华启动SCM定制化项目,共谋数字化转型之路

无锡华光座椅弹簧有限公司启动SCM定制化项目 近日&#xff0c;无锡华光座椅弹簧有限公司顺利举行了SCM定制化项目的启动会。本次启动会作为该项目实施的重要里程碑&#xff0c;吸引了双方项目组核心成员的共同参与&#xff0c;并见证了项目的正式启动。 无锡华光座椅弹簧有限公…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点&#xff0c;并计算…

控制台的启动日志消失了?关键在于这些步骤!

linux学习视频 每次我们启动系统的时候&#xff0c;控制台都会显⽰出⼀⼤堆的启动⽇志。 有时候出于保密的考虑&#xff0c;不希望启动⽇志直接显⽰在控制台上。⽐如⼀些安全⼚商提供的基于 Linux 的硬件设备&#xff0c;⾥⾯可能有⼀些内容不希望⽤⼾看到。 这时候&#xff…

胖小酱之文思泉涌

小编认为是灵感&#xff01; 灵感&#xff0c;也叫灵感思维&#xff0c;指文艺、科技活动中瞬间产生的富有创造性的突发思维状态。释义&#xff1a;灵验;灵应。不用平常的感觉器官而能使精神互相交通,亦称远隔知觉。或指无意识中突然兴起的神妙能力。通常搞创作的学者或科学家…

Matplotlib画多幅子图重叠问题

fig.tight_layout()函数&#xff1a;使得子图横纵坐标更加紧凑&#xff0c;主要用于自动调整图区的大小以及间距&#xff0c;使所有的绘图及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。 pad:用于设置绘图区边缘与画布边缘的距离大小w_pad:用于设置绘图区之间的水平…

【王道-第四章-文件管理】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 初识文件管理No.2 文件的逻辑结构No.3 文件目录No.4 文件的物理结构No.5 逻辑结构VS物理结构No.6 文件存储空间管理No.7 文件的基本操作No.8 文件共享No.9 文件保护No.10 文件系统的层次结构No.11 文件系统的全局结构&a…

数字孪生交通是数字化技术与交通的创新融合

摘要&#xff1a;数字孪生交通数字孪生交通&#xff08;digitaltwintransportation&#xff09;是一种新兴的技术概念&#xff0c;指通过大数据分析和处理&#xff0c;将这些数据与数字孪生交通模型相结合&#xff0c;实现对交通系统的全面仿真。 数字孪生交通&#xff0…

海外ios应用商店优化排名因素之视频预览与截图

当我们找到感兴趣的应用程序并转到该应用程序的页面时&#xff0c;首先引起注意的是预览视频。视频旨在以更具吸引力的方式展示应用程序的用户体验和UI。视频长度最多为30秒&#xff0c;其中前5秒最为重要&#xff0c;一定要让它尽可能引人注目。 1、关于优化预览视频的提示。…

2023-08-24 LeetCode每日一题(统计参与通信的服务器)

2023-08-24每日一题 一、题目编号 1267. 统计参与通信的服务器二、题目链接 点击跳转到题目位置 三、题目描述 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台…

Eagle for Mac图片素材管理工具

Eagle for Mac是专门为mac用户设计的一款非常专业的图片素材管理软件&#xff0c;支持藏网页图片&#xff0c;网页截屏&#xff0c;屏幕截图和标注&#xff0c;自动标签和筛选等功能&#xff0c;让设计师方便存储需要的素材和查找&#xff0c;提供工作效率。 使用 Eagle 强大的…