Flying网络打印
# Smart之Flying网络打印
# 1. 说明
范例采用HTTP与MQTT通讯协议,连接打印服务器进行打印操作。需配合爱招飞旗下的Flying(飞印,局域网数据报表打印工具)使用。
程序中包含了TARS的连接。需访问数据库。范例在demo
数据库中新建一张表名为Basic_Unit
,其表结构如下图所示,可通过下面的脚本新建该表并向其中插入数据。在demo 数据库中提供了相关表。
--创建表Basic_Unit
CREATE TABLE [dbo].[Basic_Unit](
[FInterID] [int] NOT NULL,
[FUnitCode] [nvarchar](50) NULL,
[FUnitName] [nvarchar](100) NULL,
[FCoefficient] [decimal](18, 10) NULL,
[FNote] [varchar](255) NULL,
CONSTRAINT [PK_Basic_MeasureUnit] PRIMARY KEY CLUSTERED
(
[FInterID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--插入示例数据
INSERT INTO [dbo].[Basic_Unit]
([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
VALUES(2,'M','米',1,NULL)
INSERT INTO [dbo].[Basic_Unit]
([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
VALUES(3,'KG','千克',1,NULL)
INSERT INTO [dbo].[Basic_Unit]
([FInterID],[FUnitCode],[FUnitName],[FCoefficient],[FNote])
VALUES(4,'G','克',0.001,NULL)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
通过Smart智慧控制平台菜单[工具]
->[数据库设置]
,设置好要连接的TARS中间件之数据库,在使用过程中须保证TARS处于运行状态并开放服务,TARS帐套配置请参阅TARS使用手册。

通过本范例学习,可以掌握HTTP、MQTT的基本通讯原理,并通过该协议进行打印操作的功能。
# 2. 设计明细
开启Smart智慧控制平台,分别加入下插图之控件。或者通过点击菜单栏[文件]
-[打开项目]
选择范例项目文件来打开该范例。
# 2.1. Main窗体

1:TImage组件,控件名称为Image1
。
2:TLabel组件,控件名称为Label9
。
3:TImage组件,控件名称为Image2
。
4:TRFDataSet组件,控件名称为RFDataSet1
。
5:TFlying组件,控件名称为Flying1
。
6:TLabel组件,控件名称为Label2
。
7:TLabel组件,控件名称为Label1
。
8:TEdit组件,控件名称为edtIPAddress
。
9:TEdit组件,控件名称为edtPort
。
10:TComboBox组件,控件名称为ComboBoxPrintType
。
11:TLabel组件,控件名称为Label7
。
12:TLabel组件,控件名称为Label3
。
13:TLabel组件,控件名称为Label10
。
14:TLabel组件,控件名称为Label6
。
15:TLabel组件,控件名称为Label8
。
16:TLabel组件,控件名称为Label4
。
17:TLabel组件,控件名称为Label5
。
18:TImage组件,控件名称为ImageSearch
。
19:TComboBox组件,控件名称为ComboBoxPrinter
。
20:TComboBox组件,控件名称为ComboBoxType
。
21:TEdit组件,控件名称为edtPrintNum
。
22:TSwitchButton组件,控件名称为SwitchButton1
。
23:TTimer组件,控件名称为Timer1
。
Main窗体属性设置
BorderStyle
:设置边界样式=bsDialog
。Caption
:设置窗体显示的标题=Flying网络打印
。ClientHeight
:设置客户区窗体的高度=480
。ClientWidth
:设置窗体客户区的宽度=720
。
①Image1属性设置
Align
:设置控件对齐方式=alClient
。Stretch
:设置图片拉伸适应于控件。Picture
:设置图片。点击Picture
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
②Label9属性设置
Caption
:设置显示的标签字体=Flying网络打印
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
③Image2属性
Align
:设置控件对齐方式=alClient
。Stretch
:设置图片拉伸适应于控件。Picture
:设置图片。点击Picture
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
⑤Flying1属性设置
HTTPOptions
:HTTP模式下的相关设置Host
:HTTP模式下打印服务器的地址。Port
:HTTP模式下打印服务器的端口号。
MQTTOptions
:MQTT模式下的相关设置。BrokerHost
:MQTT服务端的地址。BrokerPort
:MQTT服务端的端口号。PrintPwd
:MQTT打印的订阅验证码。PrintTopic
:MQTT打印的订阅主题。
PrintOptions
:打印相关的设置项。PrintCopies
:打印的份数。PrintType
:设置打印类型=HTTP
。ReportName
:设置打印报表的模板名称。Preview
:设置打印预览=True
。
WebSocketOptions
:WebSocket 模式的相关设置Host
:WebSocket 模式下打印服务器的地址。Port
:WebSocket 模式下打印服务器的端口号。URL
:设定 WebSocket 服务的监听地址。
⑥Label2属性设置
Caption
:设置显示的标签字体=服务器地址
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
⑦Label1属性设置
Caption
:设置显示的标签字体=连接选项
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
⑧edtIPAddress属性设置
Name
:控件名称=edtIPAddress
。Text
:设置文本框中的内容,此处填写地址,例如=192.168.0.109
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
⑨edtPort属性设置
Name
:控件名称=edtPort
。NumbersOnly
:设置是否只允许输入数字=True
。Text
:设置编辑的文本,此处为端口号。如8801
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
⑩ComboBoxPrintType属性设置
Name
:设置控件名称=ComboBoxPrintType
。Text
:设置显示的文本,如HTTP
。Items
:设置选项。双击该属性或者点击属性右侧的[...]
打开编辑器。
ItemIndex
:设置默认选择的选项=0
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(11)Label7属性设置
Caption
:设置显示的标签字体=打印选项
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(12)Label3属性设置
Caption
:设置显示的标签字体=端口号
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(13)Label10属性设置
Caption
:设置显示的标签字体=连接类型
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(14)Label6属性设置
Caption
:设置显示的标签字体=打印机
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(15)Label8属性设置
Caption
:设置显示的标签字体=文件类型
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(16)Label4属性设置
Caption
:设置显示的标签字体=打印份数
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(17)Label5属性设置
Caption
:设置显示的标签字体=启用预览
。Font
:设置标签字体。点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(18)ImageSearch属性设置
Height
:设置控件高度=31
。Width
:设置控件宽度=31
。Stretch
:设置图片拉伸=True
。Picture
:设置图片。点击Picture
属性右侧的[...]
按钮,打开文件上传界面,点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
(19)ComboBoxPrinter属性设置
Name
:设置控件名称=ComboBoxPrinter
。ItemIndex
:设置默认选择的选项=0
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(20)ComboBoxType属性设置
Name
:设置控件名称=ComboBoxType
。Text
:设置显示的文本,例如pdf
。ItemIndex
:设置默认选择的选项=0
。Items
:设置选项,双击该属性或者点击属性右侧[...]
来打开编辑器。
Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(21)edtPrintNum属性设置
Name
:控件名称=edtPrintNum
。NumbersOnly
:设置是否只允许输入数字=True
。Text
:设置显示的文本,此处设置为打印的份数1
。Font
:设置字体,点击该属性右侧[...]
按钮或者双击该属性打开字体设置界面,设置内容如下。
(22)SwitchButton1属性设置
Height
:设置控件高度=38
。Width
:设置控件宽度=40
。Stretch
:设置图像拉伸=True
。SwitchOff
:显示关闭状态时的图像,双击该属性或者点击右侧[...]
打开图像编辑器。点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
SwitchOn
:显示关闭状态时的图像,双击该属性或者点击右侧[...]
打开图像编辑器。点击[Load...]
从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]
加载图片。
# 2.2. Form1窗体

①:TChrome组件,控件名称为Chrome1
。
Form1窗体属性设置
BorderStyle
:设置边框类型为bsDialog
。Caption
:设置窗体标题字幕=预览
。FormStyle
:设置窗体风格=fsStayOnTop
。
①Chrome1属性设置
Align
:设置控件对齐方式=alClient
。
# 3. 程序设计
# 3.1. 程序初始设置
在程序启动时,为Flying控件提供初始值。
constructor TMyHandler.Create(AOwner: TComponent);
begin
FThis :=TBaseForm(AOwner);
FThis.Flying1.HTTPOptions.Host := FThis.edtIPAddress.Text;
FThis.Flying1.HTTPOptions.Port := StrToInt(FThis.edtPort.Text);
FThis.Flying1.WebSocketOptions.Host := FThis.edtIPAddress.Text;
FThis.Flying1.WebSocketOptions.Port := StrToInt(FThis.edtPort.Text);
FThis.Flying1.MQTTOptions.BrokerHost := FThis.edtIPAddress.Text;
FThis.Flying1.PrintOptions.PrintCopies := StrToInt(FThis.edtPrinTNum.Text);
FThis.Flying1.PrintOptions.Preview := FThis.SwitchButton1.IsChecked;
FThis.RFDataSet1.Connection := dm.DBConnection;
//导出文件类型选择
case FThis.ComboBoxType.ItemIndex of
1: FThis.Flying1.PrintOptions.ExportFileType := csv;
2: FThis.Flying1.PrintOptions.ExportFileType := html;
3: FThis.Flying1.PrintOptions.ExportFileType := jpg;
4: FThis.Flying1.PrintOptions.ExportFileType := rtf;
5: FThis.Flying1.PrintOptions.ExportFileType := txt;
6: FThis.Flying1.PrintOptions.ExportFileType := xls;
else
FThis.Flying1.PrintOptions.ExportFileType := pdf;
end;
//连接类型选择
case FThis.ComboBoxPrintType.ItemIndex of
1:
begin
FThis.Flying1.PrintOptions.PrintType := MQTT;
FThis.Flying1.MQTTOptions.Enabled := True;
FThis.Flying1.WebSocketOptions.Enabled := False;
end;
2:
begin
FThis.Flying1.PrintOptions.PrintType := WebSocket;
FThis.Flying1.MQTTOptions.Enabled := False;
FThis.Flying1.WebSocketOptions.Enabled := True;
end;
else
FThis.Flying1.PrintOptions.PrintType := HTTP;
FThis.Flying1.MQTTOptions.Enabled := False;
FThis.Flying1.WebSocketOptions.Enabled := False;
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 3.2. 事件设置
- (18)ImageSearch-OnClick事件
点击搜索按钮,执行获取打印机列表的子程序。
procedure TMyHandler.ImageSearchClick;
//搜索打印机
begin
FThis.Flying1.GetPrinterList;
end;
2
3
4
5
- ⑧edtIPAddress-OnChange事件
当IP地址的编辑框内容发生变化时,将取值传递给Flying1
。
procedure TMyHandler.edtIPAddressChange;
//修改打印服务器地址
begin
FThis.Flying1.HTTPOptions.Host := FThis.edtIPAddress.Text;
FThis.Flying1.MQTTOptions.BrokerHost := FThis.edtIPAddress.Text;
FThis.Flying1.WebSocketOptions.Host := FThis.edtIPAddress.Text;
end;
2
3
4
5
6
7
- ⑨edtPort-OnChange事件
当端口的编辑框内容发生变化时,将取值传递给Flying1
。
procedure TMyHandler.edtPortChange;
//修改端口号
begin
FThis.Flying1.HTTPOptions.Port := StrToInt(FThis.edtPort.Text);
FThis.Flying1.WebSocketOptions.Port := StrToInt(FThis.edtPort.Text);
FThis.Flying1.MQTTOptions.BrokerPort := StrToInt(FThis.edtPort.Text);
end;
2
3
4
5
6
7
- (21)edtPrintNum-OnChange事件
当修改打印份数时,将取值传递给Flying1
。
procedure TMyHandler.edtPrintNumChange;
//修改打印份数
begin
FThis.Flying1.PrintOptions.PrintCopies := StrToInt(FThis.edtPrinTNum.Text);
end;
2
3
4
5
- (20)ComboBoxType-OnChange事件
修改文件输出的类型,将取值传递给Flying1
。
procedure TMyHandler.ComboBoxTypeChange;
//修改文件输出类型
begin
case FThis.ComboBoxType.ItemIndex of
1: FThis.Flying1.PrintOptions.ExportFileType := csv;
2: FThis.Flying1.PrintOptions.ExportFileType := html;
3: FThis.Flying1.PrintOptions.ExportFileType := jpg;
5: FThis.Flying1.PrintOptions.ExportFileType := rtf;
6: FThis.Flying1.PrintOptions.ExportFileType := txt;
7: FThis.Flying1.PrintOptions.ExportFileType := xls;
else
FThis.Flying1.PrintOptions.ExportFileType := pdf;
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
- ⑩ComboBoxPrintType-OnChange事件
修改连接类型,将获取到的数值传递给Flying1
。
procedure TMyHandler.ComboBoxPrintTypeChange;
//连接类型选择
begin
case FThis.ComboBoxPrintType.ItemIndex of
1:
begin
FThis.Flying1.PrintOptions.PrintType := MQTT;
FThis.edtPort.Text := IntToStr(FThis.Flying1.MQTTOptions.BrokerPort);
FThis.Label3.Caption := FThis.siLang1.GetTextW('MQTT');
FThis.Flying1.MQTTOptions.Enabled := True;
FThis.Flying1.WebSocketOptions.Enabled := False;
end;
2:
begin
FThis.Flying1.PrintOptions.PrintType := WebSocket;
FThis.edtPort.Text := IntToStr(FThis.Flying1.WebSocketOptions.Port);
FThis.Label3.Caption := FThis.siLang1.GetTextW('port');
FThis.Flying1.MQTTOptions.Enabled := False;
FThis.Flying1.WebSocketOptions.Enabled := True;
end;
else
begin
FThis.Flying1.PrintOptions.PrintType := HTTP;
FThis.edtPort.Text := IntToStr(FThis.Flying1.HTTPOptions.Port);
FThis.Label3.Caption := FThis.siLang1.GetTextW('port');
FThis.Flying1.MQTTOptions.Enabled := False;
FThis.Flying1.WebSocketOptions.Enabled := False;
end;
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- ③Image2-OnClick事件
点击打印机图标,将数据传递给打印机进行打印操作。如果启用了打印预览则显示打印预览界面。MQTT打印由于不能及时获取URL,故需要通过延时定时器来获取。
procedure TMyHandler.Image2Click;
//点击以进行打印操作
var
v:string;
vStream:TStream;
F: TBaseForm;
Begin
if demo then exit;
if FThis.ComboBoxPrinter.Items.Text = '' Then exit;
FThis.Flying1.PrintOptions.PrinterName := FThis.ComboBoxPrinter.Items.Strings[FThis.ComboBoxPrinter.ItemIndex];
FThis.RFDataSet1.SQL.Text := 'SELECT * FROM Basic_Unit';
FThis.RFDataSet1.Open;
FThis.Flying1.PrintOptions.Data.Clear;
FThis.Flying1.AddPrintData(FThis.RFDataSet1,'A');
FThis.Flying1.ReportPrint;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- ⑤Flying1-OnReceivedPrinter事件
当Flying返回打印机列表时,将打印机列表显示在下拉列表中。
procedure TMyHandler.Flying1ReceivedPrinter;
//获取打印机列表
begin
FThis.ComboBoxPrinter.Items.CommaText := APrinterList;
if FThis.ComboBoxPrinter.Items.Count <> 0 Then
FThis.ComboBoxPrinter.ItemIndex := 0;
FThis.ComboBoxPrinter.DroppedDown := True;
end;
2
3
4
5
6
7
8
- ⑤Flying1-OnReceivedExport事件
当 Flying 返回输出的打印格式时,返回URL并显示。
procedure TMyHandler.Flying1ReceivedExport;
//输出
var
F: TBaseForm;
begin
if FThis.SwitchButton1.IsChecked then
begin
F := paxfunc.OpenForm('Form1');
F.TagObject := FThis;
TChrome(F.FindComponent('Chrome1')).Active := True;
TChrome(F.FindComponent('Chrome1')).Uri := AUrl;
end;
end;
2
3
4
5
6
7
8
9
10
11
12
13
# 4. 运行结果
通过工具栏保存,将程序保存为 sdb 项目文件。
使用鼠标点击工具栏运行(Run),测试运行结果。


在本机运行Flying以及本范例,输入服务器地址,端口号,选择连接类型,然后点击搜索图标,在打印机栏位显示当前可用的打印机,选择完成后修改文件类型以及打印份数,可根据需要选择是否开启与预览。然后点击打印按钮即可。