項目中遇到,要藍牙針式打印機,用手機打印表單。感謝專家,對廠家提供的SDK進行了封裝,實現利用Delphi開發出這一功能。
現在來看看,如何利用這一控件實現打印過程:
procedure startScanDevices; procedure stopScanDevices; function getScanedDevices: TList<TCCFujitsuPrinterDevice>; function openConnection(ADevice: TCCFujitsuPrinterDevice): Integer; procedure printPDFPaper(pdfPath: String; sX: Integer; mode: Integer);
TCCFujitsuPrinter提供了上面幾個方法,利用startScanDevices掃描藍牙打印機,
property Devices: TList<TCCFujitsuPrinterDevice> read FDevices;
然后我們用stopScanDevices停止掃描,調用getScanDevices,將掃描到的設備存到Devices。
接下來就是利用openConnection聯接打印機,成功返回1,然后調用printPDFPaper進行打印。
下面,是實際項目中的查詢打印機的代碼,利用kbmMW Scheduler實現。
procedure TPrintFrame.ScanPrinter; begin if IsConnectPrinter=1 then Exit; AniIndicator1.Visible:=True; AniIndicator1.Enabled:=True; Printer.startScanDevices;//查找打印機 Scheduler.Schedule( procedure (const AScheduledEvent:IkbmMWScheduledEvent) var i:Integer; begin CCButton1.Text:='正在查找打印機...'; Printer.getScanedDevices;//取得掃到的設備 for I := 0 to Printer.Devices.Count-1 do begin if (Printer.Devices[i].DeviceName='藍牙打印機') and (Printer.Devices[i].Paired) then//如果找到指定的打印機並已經配對,中止掃描並返回設備號 begin DeviceIndex:=i; printer.stopScanDevices; IsConnectPrinter:=printer.openConnection(Printer.Devices[i]); sleep(500); AniIndicator1.Visible:=False; AniIndicator1.Enabled:=False; CCButton1.Text:='開始打印'; AScheduledEvent.Activate(False);//中止線程 Break; end; end; end) .Synchronized//主線程中執行 .NamedAs('ScanPrinter') .EverySecond(2)//每兩秒檢查一次掃到的設備 .Activate; end;
找到了打印機,就可以實現打印了:
procedure TPrintFrame.CCButton1Click(Sender: TObject); begin if DeviceIndex=-1 then//沒找到打印機直接返回 Exit; if IsConnectPrinter<>1 then//沒聯接打印機則執行聯接打印機 IsConnectPrinter:=Printer.openConnection(Printer.Devices[DeviceIndex]); Scheduler.Run(procedure begin Printer.printPDFPaper(FInfo.Data['FileName'].AsString,0,2); end) .Activate; end;
上面代碼,同樣利用kbmMW Scheduler實現在線程中打印。
最后,代碼實現完成,發布時要帶幾個SO文件:
這個控件在即將發布的新版本中集成,如果項目中有需要,可以聯系作者購買。
開發的過程中遇到一個問題,就是必須在Release下才能正常打印!