業務システムにおいて、スマートフォンからBluetooth接続のドットプリンタを使って帳票を印刷する要件が発生しました。専門家がメーカー提供の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で周辺のBluetoothプリンタをスキャンし、
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 = 'BluetoothPrinter') 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ビルドでないと正常に印刷できません。