項目中遇到,要藍牙針式打印機,用手機打印表單。感謝專家,對廠家提供的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下才能正常打印!
