爱招飞帮助手册 爱招飞帮助手册
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
  • Smart帮助主页
  • 学习手册

  • 开发手册

    • 通讯协议

    • 交互输出

    • 媒体存取

    • 人工智慧

    • 实例运用

      • 定位精灵
        • 1. 说明
        • 2. 定位精灵主页面
          • 2.1. 设计明细
          • 2.2. 程序设计
          • 2.2.1. 程序初始设置
          • 2.2.2. 事件设置
        • 3. 任务派遣
          • 3.1. 设计明细
          • 3.2. 程序设计
          • 3.2.1. 程序初始设置
          • 3.2.2. 事件设置
        • 4. 新建任务
          • 4.1. 设计明细
          • 4.2. 程序设计
          • 4.2.1. 程序初始设置
          • 4.2.2. 事件设置
        • 5. 地址选择
          • 5.1. 设计明细
          • 5.2. 程序设计
          • 5.2.1. 程序初始设置
          • 5.2.2. 事件设置
        • 6. 单据选择
          • 6.1. 设计明细
          • 6.2. 程序设计
          • 6.2.1. 程序初始设置
          • 6.2.2. 事件设置
        • 7. 路线监控
          • 7.1. 设计明细
          • 7.2. 程序设计
          • 7.2.1. 程序初始设置
          • 7.2.2. 事件设置
        • 8. 报表管理
          • 8.1. 设计明细
          • 8.2. 程序设计
          • 8.2.1. 程序初始设置
          • 8.2.2. 事件设置
        • 9. 资料维护
          • 9.1. 设计明细
          • 9.2. 程序设计
          • 9.2.1. 程序初始设置
          • 9.2.2. 事件设置
        • 10. 运行结果
      • 温湿度采集与控制
      • 车间信息采集与控制
      • SVG组态
      • 网络聊天室
      • 三色声光报警器运用
目录
1. 说明
2. 定位精灵主页面
2.1. 设计明细
2.2. 程序设计
2.2.1. 程序初始设置
2.2.2. 事件设置
3. 任务派遣
3.1. 设计明细
3.2. 程序设计
3.2.1. 程序初始设置
3.2.2. 事件设置
4. 新建任务
4.1. 设计明细
4.2. 程序设计
4.2.1. 程序初始设置
4.2.2. 事件设置
5. 地址选择
5.1. 设计明细
5.2. 程序设计
5.2.1. 程序初始设置
5.2.2. 事件设置
6. 单据选择
6.1. 设计明细
6.2. 程序设计
6.2.1. 程序初始设置
6.2.2. 事件设置
7. 路线监控
7.1. 设计明细
7.2. 程序设计
7.2.1. 程序初始设置
7.2.2. 事件设置
8. 报表管理
8.1. 设计明细
8.2. 程序设计
8.2.1. 程序初始设置
8.2.2. 事件设置
9. 资料维护
9.1. 设计明细
9.2. 程序设计
9.2.1. 程序初始设置
9.2.2. 事件设置
10. 运行结果

定位精灵

# Smart之定位精灵

# 1. 说明

  本范例是车辆定位系统的管理端,用于向司机和车辆分派运输任务,该系统可查询车辆运输的路径轨迹,用于管理分析运输情况。还可以实时观察当前车辆的所在位置。该范例需与PinToo之定位精灵配合使用。

  该范例使用到数据库PinToo_Map,其数据表样式可由以下SQL进行导入生成。

USE [master]
GO

--创建数据库,名称为PinToo_Map
CREATE DATABASE [PinToo_Map]

ALTER DATABASE [PinToo_Map] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [PinToo_Map].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [PinToo_Map] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [PinToo_Map] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [PinToo_Map] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [PinToo_Map] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [PinToo_Map] SET ARITHABORT OFF 
GO
ALTER DATABASE [PinToo_Map] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [PinToo_Map] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [PinToo_Map] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [PinToo_Map] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [PinToo_Map] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [PinToo_Map] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [PinToo_Map] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [PinToo_Map] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [PinToo_Map] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [PinToo_Map] SET  DISABLE_BROKER 
GO
ALTER DATABASE [PinToo_Map] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [PinToo_Map] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [PinToo_Map] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [PinToo_Map] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [PinToo_Map] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [PinToo_Map] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [PinToo_Map] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [PinToo_Map] SET RECOVERY FULL 
GO
ALTER DATABASE [PinToo_Map] SET  MULTI_USER 
GO
ALTER DATABASE [PinToo_Map] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [PinToo_Map] SET DB_CHAINING OFF 
GO
EXEC sys.sp_db_vardecimal_storage_format N'PinToo_Map', N'ON'
GO
USE [PinToo_Map]
GO
/****** Object:  Table [dbo].[BillNo]******/
--任务单流水号定义表,用于存储定义生成的任务单的编号格式
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BillNo](
	[BillID] [int] NOT NULL,
	[BillName] [nvarchar](50) NULL,
	[BefStr] [nvarchar](50) NULL,
	[DateFormat] [nvarchar](50) NULL,
	[Length] [int] NULL,
 CONSTRAINT [PK_Dict_BillNo] PRIMARY KEY CLUSTERED 
(
	[BillID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Car]******/
--车辆基本信息表
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Car](
	[CarNumber] [varchar](50) NOT NULL,
	[CarName] [varchar](50) NULL,
	[Weight] [float] NULL,
	[Driver] [varchar](30) NULL,
	[MaintenanceCycle] [int] NULL,
	[MaintenanceDate] [datetime] NULL,
	[LastMaintenanceDate] [datetime] NULL,
 CONSTRAINT [PK_CarInfo] PRIMARY KEY CLUSTERED 
(
	[CarNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[CurrentBillNo]    Script Date: 2020-08-29 16:20:28 ******/
--单据编号记录表,用于辅助单据号的生成
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CurrentBillNo](
	[BillID] [int] NOT NULL,
	[BefString] [nvarchar](50) NULL,
	[CurrentNo] [int] NULL
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Employee]******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Employee](
	[EmpID] [varchar](50) NOT NULL,
	[Employee] [varchar](50) NULL,
	[CarNumber] [nvarchar](50) NULL,
	[Position] [nvarchar](50) NULL,
	[TelPhone] [nvarchar](50) NULL,
	[Note] [nvarchar](50) NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
	[EmpID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Location]******/
--定位信息表,存储采集的定位信息
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Location](
	[LocationID] [varchar](50) NOT NULL,
	[Employee] [varchar](50) NULL,
	[CarNumber] [varchar](50) NULL,
	[Longitude] [varchar](50) NULL,
	[Latitude] [varchar](50) NULL,
	[Accuracy] [float] NULL,
	[Speed] [float] NULL,
	[Speedhour] [float] NULL,
	[Country] [varchar](50) NULL,
	[Province] [varchar](50) NULL,
	[City] [varchar](50) NULL,
	[District] [varchar](50) NULL,
	[Address] [varchar](100) NULL,
	[LocationTime] [varchar](50) NULL,
	[TaskNo] [varchar](50) NULL,
 CONSTRAINT [PK_Location] PRIMARY KEY CLUSTERED 
(
	[LocationID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Task]******/
--任务表主表,用于记录任务单
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Task](
	[TaskId] [varchar](50) NOT NULL,
	[TaskNo] [varchar](50) NULL,
	[Date] [datetime] NULL,
	[Employee] [varchar](50) NULL,
	[CarNumber] [varchar](50) NULL,
	[Leavetime] [datetime] NULL,
	[Returntime] [datetime] NULL,
	[Creator] [varchar](50) NULL,
	[TotalMileage] [float] NULL,
	[Status] [int] NULL,
	[Start] [int] NULL,
	[Note] [varchar](200) NULL,
	[Report] [varchar](200) NULL,
	[Picture] [image] NULL,
 CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED 
(
	[TaskId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TaskDetail]******/
--任务明细表,用于记录运输的物品信息
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TaskDetail](
	[TaskId] [varchar](50) NOT NULL,
	[TaskNo] [varchar](50) NOT NULL,
	[OrderNo] [int] NOT NULL,
	[BillNo] [varchar](50) NULL,
	[BillName] [varchar](50) NULL,
	[Mileage] [float] NULL,
	[Arrivaltime] [datetime] NULL,
	[Leavetime] [datetime] NULL,
	[Status] [int] NULL,
	[Longitude] [varchar](50) NULL,
	[Latitude] [varchar](50) NULL,
	[Address] [varchar](100) NULL,
	[Customer] [varchar](100) NULL,
 CONSTRAINT [PK_TaskDetail] PRIMARY KEY CLUSTERED 
(
	[TaskId] ASC,
	[TaskNo] ASC,
	[OrderNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Task] ADD  CONSTRAINT [DF_Task_Start]  DEFAULT ((0)) FOR [Start]
GO
/****** Object:  StoredProcedure [dbo].[sp_GetBillNo] ******/
--存储过程,用于获取单据号
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE     procedure [dbo].[sp_GetBillNo]
@BillID    varchar(20),
@Date        datetime,  --日期,为空时,取当前日期
@Preview     int  --1.预览显示; 0.正式获取,更新顺序号

AS

declare @rDate datetime
if @Date is null
    select @rDate = getdate()
else
    select @rDate = @Date

declare @BefString    varchar(20)
declare @BefStr       varchar(10),
        @DateFmt      varchar(10),
        @Length       int

declare @DateStr      varchar(10)

select @BefStr = isnull(BefStr, ''), @DateFmt = DateFormat, @Length = Length from BillNo where BillID = @BillID


declare @y int, @m int, @d int
select @y = Year(@rDate), @m = Month(@rDate), @d = Day(@rDate)

if @DateFmt = 'YY'
    select @DateStr = RIGHT(cast(@y as varchar(4)), 2)
else if @DateFmt = 'YYYY'
    select @DateStr = cast(@y as varchar(4))
else if @DateFmt = 'YYMM'
    select @DateStr = RIGHT(cast(@y as varchar(4)), 2) 
                   +  RIGHT('00' + cast(@m as varchar(2)), 2)
else if @DateFmt = 'YYYYMM'
    select @DateStr = cast(@y as varchar(4))
                   +  RIGHT('00' + cast(@m as varchar(2)), 2)
else if @DateFmt = 'YYMMDD'
    select @DateStr = RIGHT(cast(@y as varchar(4)), 2) 
                   +  RIGHT('00' + cast(@m as varchar(2)), 2)
                   +  RIGHT('00' + cast(@d as varchar(2)), 2)
else if @DateFmt = 'YYYYMMDD'
    select @DateStr = cast(@y as varchar(4)) 
                   +  RIGHT('00' + cast(@m as varchar(2)), 2)
                   +  RIGHT('00' + cast(@d as varchar(2)), 2)
else
    select @DateStr = ''


select @BefString = @BefStr + @DateStr

declare @CurrentNo    int
select @CurrentNo = CurrentNo from CurrentBillNO where BillID = @BillID and BefString = @BefString
if @Preview = 0 and @BillID <> 0
begin
    begin tran
    if @CurrentNo is null
    begin
        insert into CurrentBillNO(BillID, BefString, CurrentNo) 
        values(@BillID, @BefString, 2)
        select @CurrentNo = 1
    end
    else
        update CurrentBillNo set CurrentNo = CurrentNo + 1 where BillID = @BillID and BefString = @BefString

    commit tran
end
else
begin

    if @CurrentNo is null
        select @CurrentNo = 1

end

select FBillNO = isnull(@BefString + Right('0000000000' + cast(@currentNo as varchar(10)), @Length),'')



GO
/****** Object:  StoredProcedure [dbo].[sp_GetTask]    Script Date: 2020-08-29 16:20:28 ******/
--存储过程,向其他系统获取出库数据,用于生成送货任务单
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_GetTask]
@Date1 datetime,
@Date2 datetime,
@TaskNo varchar(50)
AS
BEGIN
SELECT 
       FDate
      ,FBillNo
      ,FBillName
      ,FCustName
      ,FEmpName
      ,Sum(FOutQtyPiece) as FQtyPiece
      ,Max(FUnitPiece) as FUnitPiece
      ,Sum(FOutQty) as FQty
      ,Max(FUnitName) as FUnitName
      ,'' as FAddress
  FROM [FastERP].[dbo].[V_CLStockDetail]
  where FBillID = 17020032
  Group By 
       FDate
      ,FBillNo
      ,FBillName
      ,FCustName
      ,FEmpName
  Order by FDate desc
END

GO
USE [master]
GO
ALTER DATABASE [PinToo_Map] SET  READ_WRITE 
GO
1
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348

  在TARS中配置连接名称,设置为PinToo_Map。

  Smart中点击[工具]-[帐套]设置,将该连接指定为Smart的帐套设置。

  通过本范例学习,可以掌握表单的制作以及单据的录入,以及在地图上标注定位信息。

  开启Smart智慧控制平台,点击菜单栏[文件]-[打开项目]选择项目打开该范例。

  该范例由多个窗体组成,以下将分别介绍各窗体使用的控件。

# 2. 定位精灵主页面

  该页面为主页面,用于显示地图以及功能模块菜单。

# 2.1. 设计明细

定位精灵主页面 UI布局

  ①:TAMapView组件,控件名称为AMapView1。

  ②:TTimer组件,控件名称为Timer1。

  ③:TImage组件,控件名称为imgTask。

  ④:TImage组件,控件名称为imgLocation。

  ⑤:TImage组件,控件名称为imgDriveLine。

  ⑥:TImage组件,控件名称为imgReport。

  ⑦:TImage组件,控件名称为imgBaseInfo。

  ⑧:TRadioGroup组件,控件名称为rgLang。

  ⑨:TPanel组件,控件名称为plSatellite。

  ⑩:TCheckBox组件,控件名称为ckTraffic。

  (11):TButton组件,控件名称为btnMapQuery。

  (12):TButton组件,控件名称为btnRule。

  (13):TButton组件,控件名称为btnCloseDraw。

  • Main窗体属性设置

    • Caption:主窗体标题,设置为定位精灵。
    • ClientHeight:窗体客户区高度=749。
    • ClientWidth:窗体客户区宽度=1028。
  • plBottom属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alBottom(底部对齐)。
    • Height:设置控件高度=49。
    • Name:设置 控件名称为plBottom。
  • plRight属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alRight(右端对齐)。
    • Width:设置控件宽度=101。
    • Name:设置控件名称为plRight。
  • plClient属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alClient(客户区对齐)。
    • Name:设置控件名称为plClient。
  • ①AMapView1属性设置

    • Align:设置对齐方式,该控件位于plClient中,设置为alClient。
    • Key:设置显示地点信息的密钥,设置为3e20dffdda1288cf756ff92fb3556bbc。
  • ②Timer1属性设置

    • Interval:设置计时器的触发时间间隔=5000。
  • ③imgTask属性设置

    • Center:设置图像是否居中=True。
    • Height:设置控件高度为113。
    • Width:设置控件宽度=93。
    • Name:设置控件名称为imgTask。
    • Picture:设置显示的图像。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ④imgLocation属性设置

    • Center:设置图像是否居中=True。
    • Height:设置控件高度为89。
    • Width:设置控件宽度=95。
    • Name:设置控件名称为imgLocation。
    • Picture:设置显示的图像。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ⑤imgDriveLine属性设置

    • Center:设置图像是否居中=True。
    • Height:设置控件高度为79。
    • Width:设置控件宽度=95。
    • Name:设置控件名称为imgDriveLine。
    • Picture:设置显示的图像。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ⑥imgReport属性设置

    • Center:设置图像是否居中=True。
    • Height:设置控件高度为85。
    • Width:设置控件宽度=86。
    • Name:设置控件名称为imgReport。
    • Picture:设置显示的图像。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ⑦imgBaseInfo属性设置

    • Center:设置图像是否居中=True。
    • Height:设置控件高度为85。
    • Width:设置控件宽度=93。
    • Name:设置控件名称为imgBaseInfo。
    • Picture:设置显示的图像。点击Picture属性右侧的[...]按钮,打开文件上传界面,点击[Load...]从文件浏览器中选择对应的图片文件上传,返回该界面下,待显示出图片后点击[OK]加载图片。
  • ⑧rgLang属性设置

    • Height:设置控件高度=45。
    • Width:设置控件宽度=181。
    • Caption:设置单选组的标题为地图语言。
    • Columns:设置单选组的列的数目=3。
    • Name:设置控件名称为rgLang。
    • Items:设置单选的项目。双击该属性或者点击属性右侧的[...]来打开选项编辑界面,编辑的内容如图所示。
    • ItemIndex:设置默认选择项的索引值,设置为2。
  • ⑨plSatellite属性设置

    • Height:设置控件高度=36。
    • Width:设置控件宽度=41。
    • Caption:设置显示的文字内容=卫星。
    • Color:设置面板颜色=clGreen。
    • Name:设置控件名称为plSatellite。
  • ⑩ckTraffic属性设置

    • Caption:设置显示字幕内容=实时路况。
    • Name:设置控件名称为ckTraffic。
  • (11)btnMapQuery属性设置

    • Caption:设置显示的字幕内容=地图查询。
    • Name:设置控件名称为btnMapQuery。
  • (12)btnRule属性设置

    • Caption:设置显示的字幕内容=测距。
    • Name:设置控件名称为btnRule。
  • (13)btnCloseDraw属性设置

    • Caption:设置显示的字幕内容=结束绘制。
    • Name:设置控件名称为btnCloseDraw。

# 2.2. 程序设计

# 2.2.1. 程序初始设置

  在程序启动时,设置地图信息并加载地图显示。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  paxfunc.AdvancedInfo(FThis.AMapView1);
  FThis.AMapView1.LoadMap;
end;
1
2
3
4
5
6

# 2.2.2. 事件设置

  • ③imgTask-OnClick事件

  点击[任务派遣],打开任务派遣界面。

procedure TMyHandler.imgTaskClick;
begin
  paxfunc.OpenForm('Frm001');
end;
1
2
3
4
  • ④imgLocation-OnClick事件

  点击[即时定位]按钮,显示当前正在执行任务的车辆所在的位置。

procedure TMyHandler.imgLocationClick;
var
 vAMapMarker:TCCAMapMarker;  
  iSql:String;
  iCds:TRFDataSet; 
  vSpan:string;
Begin
  TCCAMapMarkers(FThis.AMapView1.Markers).Clear;
  iSql:='SELECT'+#13+#10
  +'A.Employee,a.CarNumber,A.Position,A.TelPhone,B.Address,B.Longitude,B.Latitude,B.Speed,B.Speedhour'+#13+#10
  +'FROM Employee A'+#13+#10
  +'left join (select top 1 Employee,Address,Longitude,Latitude,Speed,Speedhour from Location order by LocationTime desc) B on a.Employee = b.Employee'+#13+#10
  +'ORDER BY A.Employee';
 try  
  iCds := TRFDataSet.Create(nil);
  iCds.Connection := DM.DBConnection;
  iCds.Open(iSql);
  while not iCds.eof do
  begin
   if FThis.AMapView1.MapLoadCompleted then
   begin  
     if iCds.FieldByName('Longitude').AsString<>'' then
     begin 
      vSpan:=iCds.FieldByName('Employee').AsString+'('+iCds.FieldByName('CarNumber').AsString+')'+' 速度:'+iCds.FieldByName('Speed').AsString+' 米/秒';
	  vAMapMarker := paxfunc.AddMarker(FThis.AMapView1);
	  with vAMapMarker do
	  begin
		Title := '';
		Position.Longitude := StrToFloat(iCds.FieldByName('Longitude').AsString);
		Position.Latitude := StrToFloat(iCds.FieldByName('Latitude').AsString);
		// 设置了Content属性Icon属性失效。要自定义丰富的标记就用Content属性吧
		Content:='<div>';
		Content:=Content+'<image src="http://webapi.amap.com/images/car.png"></image>';                          
		  //'<image src="http://webapi.amap.com/theme/v1.3/markers/n/mark_r.png"></image>';
	   Content:=Content+
		  '<span style="white-space: nowrap;border:1px solid #fff;background-color:#ff0000;font-size: 12px;color:white;  padding: 4px 10px;">'+vSpan+'</span>';
		// 图片19   x   31   pixels
		Content:=Content+'</div>'; // 必须有根div元素 不然缩放时图标位置不会更新

		draw;
	  end;
       end;
    end;
    iCds.next;
  end; 
 finally 
  iCds.free;
 end; 
end;
1
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
43
44
45
46
47
48
49
  • ⑧rgLang-OnClick事件

  点击地图语言按钮,将地图切换成对应的语言。

procedure TMyHandler.rgLangClick;
begin
  case FThis.rgLang.ItemIndex of
    0:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := en;
      end;
    1:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := zh_en;
      end;
    2:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := zh_cn;
      end;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • ⑨plSatellite-OnClick事件

  点击[卫星](地图类型)按钮,切换地图显示的类型。

procedure TMyHandler.plSatelliteClick;
begin
  if FTHis.plSatellite.Caption ='卫星' then
  begin   
    FTHis.plSatellite.Caption :='地图'; 
    FTHis.AMapView1.Satellite.Visible := true;
  end
  else if FTHis.plSatellite.Caption ='地图' then
  begin     
    FTHis.plSatellite.Caption :='卫星';  
    FTHis.AMapView1.Satellite.Visible := false;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • ⑩ckTraffic-OnClick事件

  点击[实时路况],系统将显示当前的实时路况信息。

procedure TMyHandler.ckTrafficClick;
begin
  FThis.AMapView1.Traffic.Visible := FThis.ckTraffic.checked;
end;
1
2
3
4
  • ②Timer1-OnTimer事件

  计时器定时触发事件,用于刷新车辆的即时定位信息。

procedure TMyHandler.Timer1Timer;
begin
  imgLocationClick(Sender);
end;
1
2
3
4
  • (11)btnMapQuery-OnClick事件

  点击[地图查询]按钮,显示出发点与目的地的输入框,输入相应的内容点击搜索框进行查询。

procedure TMyHandler.btnMapQueryClick;
begin
  with FThis.AMapView1.AdvancedInfoWindows[0] do
  begin
        AsOrigin:=true;//带:从这里出发输入框
        AsDestination:= true;//带:到这里去输入框
        PlaceSearch:=true;//带:在附近搜索框
        show;
  end; 
end;
1
2
3
4
5
6
7
8
9
10
  • (12)btnRule-OnClick事件

  点击[测距]按钮,开始进行测距操作。

procedure TMyHandler.btnRuleClick;
begin
  FThis.AMapView1.setDefaultCursor('pointer');
  FThis.AMapView1.MouseTool.Rule.UseDefaultStyle := true;
  FThis.AMapView1.MouseTool.Rule.StartDraw; 
end;
1
2
3
4
5
6
  • (13)btnCloseDraw-OnClick事件

  点击[结束绘制]按钮,结束地图的绘制并清空测距数据。

procedure TMyHandler.btnCloseDrawClick;
begin
  FThis.AMapView1.MouseTool.close(true,333);
  FThis.AMapView1.setDefaultCursor('');  
end;
1
2
3
4
5
  • ⑤imgDriveLine-OnClick事件

  点击[路线监控]按钮,打开路线监控界面。

procedure TMyHandler.imgDriverLineClick;
begin
  paxfunc.OpenForm('Frm002');
end;
1
2
3
4
  • ⑥imgReport-OnClick事件

  点击[报表管理]按钮,打开报表管理界面。

procedure TMyHandler.imgReportClick;
begin
  paxfunc.OpenForm('Frm003');
end;
1
2
3
4
  • ⑦imgBaseInfo-OnClick事件

  点击[资料维护]按钮,打开资料维护界面。

procedure TMyHandler.imgBaseInfoClick;
begin
  paxfunc.OpenForm('Frm004');  
end;
1
2
3
4

# 3. 任务派遣

  该界面用于打开任务派遣查询界面。

# 3.1. 设计明细

任务派遣 UI布局

  ①:TDateTimePicker组件,控件名称为edtDate1。

  ②:TDateTimePicker组件,控件名称为edtDate2。

  ③:TEdit组件,控件名称为edtDriver。

  ④:TTimer组件,控件名称为Timer1。

  ⑤:TButton组件,控件名称为btQuery。

  ⑥:TButton组件,控件名称为btnNewTask。

  ⑦:TButton组件,控件名称为btnEditTask。

  ⑧:TRFDataSet组件,控件名称为cdsTask。

  ⑨:TDataSource组件,控件名称为dsTask。

  ⑩:TDBGrid组件,控件名称为DBGrid1。

  • Frm001属性设置

    • Caption:主窗体标题,设置为任务派遣。
    • ClientHeight:窗体客户区高度=729。
    • ClientWidth:窗体客户区宽度=1008。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm001。
  • plTop属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alTop(顶部对齐)。
    • Height:设置控件高度=37。
    • Name:设置 控件名称为plTop。
  • Panel2属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alBottom(底部对齐)。
    • Height:设置控件高度=41。
  • Panel1属性设置

    • 该控件对应为TPanel组件。
    • Align:设置对齐方式=alClient(客户区对齐)。
  • ①edtDate1属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
    • Name:设置控件名称为edtDate1。
  • ②edDate2属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为edtDate2。
  • ③edtDriver属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=297。
    • Name:设置控件名称为edtDriver。
  • ⑤btQuery属性设置

    • Caption:设置按钮显示字幕=查询。
    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Name:设置控件名称为btQuery。
  • ⑥btnNewTask属性设置

    • Caption:设置按钮显示字幕=新建任务。
    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Name:设置控件名称为btnNewTask。
  • ⑦btnEditTask属性设置

    • Caption:设置按钮显示字幕=编辑任务。
    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Name:设置控件名称为btnEditTask。
  • ⑧cdsTask属性设置

    • Name:设置控件名称为cdsTask。
  • ⑨dsTask属性设置

    • DataSet:设置绑定的数据集=cdsTask。
    • Name:设置控件名称为dsTask。
  • ⑩DBGrid1属性设置

    • Align:设置控件对齐方式=alClient。
    • DataSource:设置数据源控件为dsTask。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增11项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 TaskId / /
    2 TaskNo 任务编号 81
    3 Date 任务日期 115
    4 Employee 员工 49
    5 CarNumber 车牌号 60
    6 Leavetime 离厂时间 127
    7 Returntime 返厂时间 125
    8 TotalMileage 总里程 52
    9 Creator 创建人 49
    10 Status 状态 44
    11 Start 执行中 43
    12 Note 说明 256
    • TaskId字段的Visible属性设置为False,即该字段在表格列中不显示。

# 3.2. 程序设计

# 3.2.1. 程序初始设置

  在程序启动时,初始化查询日期为近十天,设置连接配置。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.cdsTask.Connection := DM.DBConnection;
  FThis.edtDate1.date := Now()-10; 
  FThis.edtDate2.date := Now();
end;
1
2
3
4
5
6
7

# 3.2.2. 事件设置

  • ⑤btQuery-OnClick事件

  点击[查询]按钮,进行相应的查询。

procedure TMyHandler.btQueryClick;
begin
  FThis.cdsTask.sql.Text := 'Select * from Task '
  +' where Convert(varchar(10),Date,120) between ' + QuotedStr(DateToStr(FThis.edtDate1.Date)) + ' and ' + QuotedStr(DateToStr(FThis.edtDate2.Date))
  +' and Employee+CarNumber like '+'''%'+FThis.edtDriver.Text+'%'''
  +' Order by Date desc';  
  FThis.CdsTask.Open;
end;
1
2
3
4
5
6
7
8
  • ⑥btnNewTask-OnClick事件

  点击[新建任务]按钮,打开任务编辑界面进行新增操作。

procedure TMyHandler.btnNewTaskClick;
begin
  paxfunc.OpenForm('Frm001_01');
end;
1
2
3
4
  • ⑦btnEditTask-OnClick事件

  点击[编辑任务]按钮,打开任务编辑界面进行操作。

procedure TMyHandler.btnEditTaskClick;
var
 iFrm:TBaseForm;
begin
  iFrm := paxfunc.OpenForm('Frm001_01');       
  iFrm.TagObject := FThis;
  iFrm.Caption := '编辑任务';
  iFrm.TagString := FThis.cdsTask.FieldByName('TaskId').asstring;
end;
1
2
3
4
5
6
7
8
9
  • ④Timer1-OnTimer事件

  Timer1的触发事件,定时刷新查询列表。

procedure TMyHandler.Timer1Timer;
begin
  btQueryClick(nil);
  FThis.Timer1.Enabled := false;
end;
1
2
3
4
5

# 4. 新建任务

  该界面显示为任务的编辑界面,包含主表的信息以及明细表格的内容信息。

# 4.1. 设计明细

新建任务 UI布局

  ①:TDateTimePicker组件,控件名称为dtDate。

  ②:TDBEdit组件,控件名称为dbLeavetime。

  ③:TDBEdit组件,控件名称为dbTaskNo。

  ④:TDBMemo组件,控件名称为dbNote。

  ⑤:TDBComboBox组件,控件名称为dbDriver。

  ⑥:TDBEdit组件,控件名称为dbReturntime。

  ⑦:TDBEdit组件,控件名称为dbStatus。

  ⑧:TPopupMenu组件,控件名称为PopupMenuTaskDetail。

  ⑨:TTimer组件,控件名称为Timer1。

  ⑩:TDBComboBox组件,控件名称为dbCarNumber。

  (11):TDBEdit组件,控件名称为dbTotalMileage。

  (12):TDBComboBox组件,控件名称为dbCreator。

  (13):TPopupMenu组件,控件名称为PopupMenuStatus。

  (14):TButton组件,控件名称为btNewBill。

  (15):TButton组件,控件名称为btnSaveTask。

  (16):TButton组件,控件名称为btnDel。

  (17):TButton组件,控件名称为btnCheckTask。

  (18):TButton组件,控件名称为btnStatus。

  (19):TPageControl组件,控件名称为PageControl1。

  (20):TButton组件,控件名称为btnNewTask。

  (21):TButton组件,控件名称为btnDelTask。

  (22):TRFDataSet组件,控件名称为cdsTask。

  (23):TDataSource组件,控件名称为dsTask。

  (24):TRFDataSet组件,控件名称为cdsTaskDetail。

  (25):TDataSource组件,控件名称为dsTaskDetail。

  (26):TButton组件,控件名称为btnImportTask。

  (27):TDBGrid组件,控件名称为DBGrid1。

  (28):TButton组件,控件名称为Button1。

  • Frm001_01属性设置

    • Caption:主窗体标题,设置为新建任务。
    • ClientHeight:窗体客户区高度=644。
    • ClientWidth:窗体客户区宽度=804。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm001_01。
  • Panel1属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=177。
  • Panel3属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alBottom。(底部对齐)
    • Height:设置控件高度=39。
  • ①dtDate属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为dtDate。
  • ②dbLeavetime属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为dbLeave。
    • DataField:设置控件对应的字段名称=Leavetime。
    • DataSource:设置控件对应的数据源=dsTask。
  • ③dbTaskNo属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为dbTaskNo。
    • DataField:设置控件对应的字段名称=TaskNo。
    • DataSource:设置控件对应的数据源=dsTask。
  • ④dbNote属性设置

    • Height:设置控件高度=64。
    • Width:设置控件宽度=593。
    • Name:设置控件名称为dbNote。
    • DataField:设置控件对应的字段名称=Note。
    • DataSource:设置控件对应的数据源=dsTask。
  • ⑤dbDriver属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbDriver。
    • DataField:设置控件对应的字段名称=Employee。
    • DataSource:设置控件对应的数据源=dsTask。
  • ⑥dbReturntime属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbReturntime。
    • DataField:设置控件对应的字段名称=Returntime。
    • DataSource:设置控件对应的数据源=dsTask。
  • ⑦dbStatus属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbStatus。
    • DataField:设置控件对应的字段名称=Status。
    • DataSource:设置控件对应的数据源=dsTask。
  • ⑧PopupMenuTaskDetail属性设置

    • Name:设置控件名称为PopupMenuTaskDetail。
    • Items:设置菜单项目,双击该属性或者点击属性右侧的[...]打开编辑器。点击新增按钮添加如下项目。
  • ⑩dbCarNumber属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbCarNumber。
    • DataField:设置控件对应的字段名称=CarNumber。
    • DataSource:设置控件对应的数据源=dsTask。
  • (11)dbTotalMileage属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbTotalMileage。
    • DataField:设置控件对应的字段名称=TotalMileage。
    • DataSource:设置控件对应的数据源=dsTask。
  • (12)dbCreator属性设置

    • Height:设置控件高度=21。
    • Width:设置控件宽度=129。
    • Name:设置控件名称为dbCreator。
    • DataField:设置控件对应的字段名称=Creator。
    • DataSource:设置控件对应的数据源=dsTask。
  • (13)PopupMenuStatus属性设置

    • Name:设置控件名称为PopupMenuStatus。
    • Items:设置菜单项目,双击该属性或者点击属性右侧的[...]打开编辑器。点击新增按钮添加如下项目。
  • (14)btNewBill属性设置

    • Height:设置控件高度=35。
    • Width:设置控件宽度=68。
    • Caption:设置控件字幕=新建。
    • Name:设置控件名称为btNewBill。
  • (15)btnSaveTask属性设置

    • Height:设置控件高度=35。
    • Width:设置控件宽度=68。
    • Caption:设置控件字幕=保存。
    • Name:设置控件名称为btnSaveTask。
  • (16)btnDel属性设置

    • Height:设置控件高度=35。
    • Width:设置控件宽度=68。
    • Caption:设置控件字幕=删除。
    • Name:设置控件名称为btnDel。
  • (17)btnCheckTask属性设置

    • Height:设置控件高度=35。
    • Width:设置控件宽度=68。
    • Caption:设置控件字幕=审核。
    • Name:设置控件名称为btnCheckTask。
  • (18)btnStatus属性设置

    • Height:设置控件高度=65。
    • Width:设置控件宽度=136。
    • Caption:设置控件字幕=未审核。
    • Name:设置控件名称为btnStatus。
  • (19)PageControl1属性设置

    • 在该控件中鼠标右键点击[New Page]新增两个界面,分别点击TabSheet,修改其中的Caption属性为任务明细和情况汇报。
    • Align:设置对齐方式为alClient。(客户区对齐)
  • (20)btnNewTask属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件字幕=添加明细。
    • Name:设置控件名称为btnNewTask。
  • (21)btnDelTask属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件字幕=删除明细。
    • Name:设置控件名称为btnDelTask。
  • (22)cdsTask属性设置

    • Name:设置控件名称为cdsTask。
  • (23)dsTask属性设置

    • Name:设置控件名称为dsTask。
    • DataSet:设置数据集控件名称为cdsTask。
  • (24)cdsTaskDetail属性设置

    • Name:设置控件名称为cdsTaskDetail。
  • (25)dsTaskDetail属性设置

    • Name:设置控件名称为dsTaskDetail。
    • DataSet:设置数据集控件名称为cdsTaskDetail。
  • (26)btnImportTask属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件字幕=选择明细。
    • Name:设置控件名称为btnImportTask。
  • (27)DBGrid1属性设置

    • 该控件位于PageControl1的任务明细标签页中。
    • Align:设置控件对齐方式=alClient。
    • DataSource:设置数据源控件为dsTaskDetail。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增8项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 TaskId / /
    2 TaskNo / /
    3 OrderNo 序号 35
    4 BillNo 相关单据 94
    5 BillName 单据类型 60
    6 Customer 业务单位 170
    7 Address 目的地 355
    8 Status 状态 45
    • TaskId,TaskNo字段的Visible属性设置为False,即该字段在表格列中不显示。
  • (28)Button1属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=111。
    • Caption:设置控件字幕=从地图中选择地址。

# 4.2. 程序设计

# 4.2.1. 程序初始设置

  程序定义初始变量。

private 
  FThis:TBaseForm;
  FStatus:integer;
Procedure Status; 
1
2
3
4

  设置下拉框的填充选项内容。

//Combox填充
Procedure FillCombox;
begin
  DM.FillDBComboBox(THIS.dbDriver,'Select Employee from Employee');
  DM.FillDBComboBox(THIS.dbCarNumBer,'Select CarNumBer from Car');  
  THIS.dbDriver.Text := ''; 
  THIS.dbCarNumBer.Text := ''; 
end;
1
2
3
4
5
6
7
8

  设置程序启动时配置连接并填充下拉框选项。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.cdsTask.Connection := DM.DBConnection;
  FThis.cdsTaskDetail.Connection := DM.DBConnection;  
  FillCombox; 
end;
1
2
3
4
5
6
7

  更新任务单的状态。

//任务单状态
Procedure TMyHandler.Status;
begin
  if FThis.cdsTask.active then
  begin 
    if FThis.cdsTask.FieldByName('Status').asInteger = 0 then
       FThis.BtnStatus.Caption := '未审核'    
    else if FThis.cdsTask.FieldByName('Status').asInteger = 1 then
       FThis.BtnStatus.Caption := '已审核'
    else if FThis.cdsTask.FieldByName('Status').asInteger = 2 then
       FThis.BtnStatus.Caption := '已完成'
    else if FThis.cdsTask.FieldByName('Status').asInteger = 3 then
       FThis.BtnStatus.Caption := '已作废';
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 4.2.2. 事件设置

  • (14)btNewBill-OnClick事件

  当点击[新建]按钮时,新增单据。

procedure TMyHandler.btNewBillClick;
begin
  FThis.cdsTask.Open('select top 0 * from Task'); 
  FThis.cdsTaskDetail.Open('select top 0 * from TaskDetail'); 
  FThis.cdsTask.Append;   
  FTHis.btnNewTask.Enabled := true;
  FTHis.btnDelTask.Enabled := true;
  FTHis.btnSaveTask.Enabled := true;
end;
1
2
3
4
5
6
7
8
9
  • (22)cdsTask-OnNewRecord事件

  当数据集新增时,为新增的数据集赋值。

procedure TMyHandler.cdsTaskNewRecord;
begin
  IF DataSet =FThis.cdsTask THEN
  BEGIN
     DataSet.FieldByName('TaskId').asString := DM.GetGUID;   
     DataSet.FieldByName('Status').asinteger := 0;
     DataSet.FieldByName('TaskNo').asString := DM.GetBillNo('10001',Now(),true);
     FTHIS.dtDate.date := Now();    
     DataSet.Post;
  END
  ELSE IF DataSet =FThis.cdsTaskDetail THEN
  BEGIN   
     if FThis.cdsTask.FieldByName('TaskNo').asString = '' then
     BEGIN
       MSG('任务号不能为空!');   
       exit;
     END;     
     DataSet.FieldByName('TaskId').asString := FThis.cdsTask.FieldByName('TaskId').asString;
     DataSet.FieldByName('TaskNo').asString := FThis.cdsTask.FieldByName('TaskNo').asString;
     DataSet.FieldByName('OrderNo').asinteger := DataSet.RecordCount + 1;    
     DataSet.FieldByName('Status').asinteger := 0;  
     DataSet.post;
  END;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • (20)btnNewTask-OnClick事件

  点击[添加明细]按钮,新增任务明细。

//新建任务明细
procedure TMyHandler.btnNewTaskClick;
begin
  IF FThis.cdsTask.IsEmpty THEN
  BEGIN
     MSG('请先新建任务!');   
     exit;
  END; 
  FThis.cdsTaskDetail.Append; 
end;
1
2
3
4
5
6
7
8
9
10
  • (21)btnDelTask-OnClick事件

  点击[删除明细]按钮,删除当前选择的任务明细。

//删除明细任务
procedure TMyHandler.btnDelTaskClick;
begin
  IF Not FThis.cdsTask.IsEmpty THEN
     FThis.cdsTaskDetail.Delete;
end;
1
2
3
4
5
6
  • (15)btnSaveTask-OnClick事件

  点击[保存]按钮,保存单据的修改。

//保存数据
procedure TMyHandler.btnSaveTaskClick;
var
 iFrm:TBaseForm;
begin
     FThis.cdsTask.Edit;
     FThis.cdsTask.FieldByName('Date').asDateTime := FTHis.dtDate.Date;
     FThis.cdsTask.post;
     FThis.cdsTaskDetail.Edit;
     FThis.cdsTaskDetail.post;  
     DM.SaveData(FThis.cdsTask);
     DM.SaveData(FThis.cdsTaskDetail);  
     
     //刷新父表
     iFrm := TBaseForm(FThis.TagObject);       
     //TButton(iFrm.FindComponent('btQuery')).OnClick(Sender);   
     
     //更新状态
     Status;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • (28)Button1-OnClick事件

  点击[从地图中选择地址],打开地图界面,点击选择地点。

//导入相关数据
procedure TMyHandler.Button1Click;
var
 iFrm:TbaseForm;
begin
  iFrm := paxfunc.OpenForm('Frm001_02');  
  iFrm.TagObject := FThis.cdsTaskDetail.FieldByName('Address');
end;
1
2
3
4
5
6
7
8
  • ⑨Timer1-OnTimer事件

  计时器的定时触发事件,用于更新状态与时间信息。

//打开数据
procedure TMyHandler.Timer1Timer;
begin
  if FThis.TagString<>'' then
  begin
      FThis.cdsTask.Open('select * from Task where TaskId='+QuotedStr(FThis.TagString)); 
      FThis.cdsTaskDetail.Open('select * from TaskDetail where TaskId='+QuotedStr(FThis.TagString) + ' Order by OrderNo');    
      FStatus := FThis.cdsTask.FieldByName('Status').asInteger;
      if FThis.cdsTask.FieldByName('Status').asInteger > 1 then
      begin        
        FTHis.btnNewTask.Enabled := false;
        FTHis.btnDelTask.Enabled := false;
        FTHis.btnSaveTask.Enabled := false;
      end;         
      FThis.dtDate.Date := FThis.cdsTask.FieldByName('Date').asDatetime;
  end;     
  Status;
  FThis.Timer1.Enabled := false;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • ⑧PopupMenuTaskDetail-MenuItem-OnClick事件

  右键菜单用于更新状态信息,此处需将其中的MenuItem-OnClick事件指向同一个方法。

Public 
  constructor Create(AOwner: TComponent); override;
{模块声明  MODULE-DECLARE}
...
  procedure MenuItemClick(Sender: TObject);
...
end;
...

//任务明细状态维护
procedure TMyHandler.MenuItemClick;
begin
  if not FThis.cdsTaskDetail.active then exit;
  if TMenuItem(Sender).Tag = 1 then
  begin     
    FThis.cdsTaskDetail.Edit;
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 0;
  end  
  else if TMenuItem(Sender).Tag = 3 then
  begin 
    FThis.cdsTaskDetail.Edit;  
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 0;
  end
  else if TMenuItem(Sender).Tag = 0 then
  begin 
    FThis.cdsTaskDetail.Edit;  
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 1;
  end
  else if TMenuItem(Sender).Tag = 2 then
  begin        
    FThis.cdsTaskDetail.Edit;
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 2;
  end;    
  btnSaveTaskClick(nil);
end;

...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
...
  this.MenuItem1.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem2.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem3.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem4.OnClick := FMyHandler.MenuItemClick;
...
end.
1
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
43
44
45
46
47
48
49
  • (13)PopupMenuStatus-MenuItem-OnClick事件

  右键菜单用于更新状态信息。此处需将其中的MenuItem-OnClick事件指向同一个方法。

Public 
  constructor Create(AOwner: TComponent); override;
{模块声明  MODULE-DECLARE}
...
  procedure MenuItemStatusClick(Sender: TObject);
...
end;
...

procedure TMyHandler.MenuItemStatusClick;
begin
  if not FThis.cdsTask.active then exit;
  if TMenuItem(Sender).Tag = 1 then
  begin     
    FThis.cdsTask.Edit;
    FThis.cdsTask.FieldByName('Status').asInteger := 1;
  end  
  else if TMenuItem(Sender).Tag = 3 then
  begin 
    FThis.cdsTask.Edit;  
    FThis.cdsTask.FieldByName('Status').asInteger := 1;
  end
  else if TMenuItem(Sender).Tag = 0 then
  begin 
    FThis.cdsTask.Edit;  
    FThis.cdsTask.FieldByName('Status').asInteger := 2;
  end
  else if TMenuItem(Sender).Tag = 2 then
  begin        
    FThis.cdsTask.Edit;  
    FThis.cdsTask.FieldByName('Status').asInteger := 3;
  end
  else if TMenuItem(Sender).Tag = 4 then
  begin
    FThis.cdsTask.Edit;  
    FThis.cdsTask.FieldByName('Status').asInteger := 0;  
  end;    
  btnSaveTaskClick(nil);
end;
...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
...
  this.MenuItem5.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem6.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem7.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem8.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem9.OnClick := FMyHandler.MenuItemStatusClick;
...
end.
1
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
43
44
45
46
47
48
49
50
51
52
53
  • (17)btnCheckTask-OnClick事件

  点击[审核]按钮,将单据修正为审核状态。

 //审核任务单
procedure TMyHandler.btnCheckTaskClick;
begin
  FThis.cdsTask.Edit;  
  FThis.cdsTask.FieldByName('Status').asInteger := 1; 
  btnSaveTaskClick(nil);
end;
1
2
3
4
5
6
7
  • (16)btnDel-OnClick事件

  点击[删除]按钮,将单据删除。

//删除任务单
procedure TMyHandler.BtnDelClick;
var
 vSQL:string;
 vData:TRFDataSet;
begin
 vSQL := 'delete Task where TaskId = ' + QuotedStr(FTHIS.CDSTASK.FieldByName('TaskId').AsString);
 vSQL := vSQL + #13#10 + 'delete TaskDetail where TaskId = ' + QuotedStr(FTHIS.CDSTASK.FieldByName('TaskId').AsString);
 if paxfunc.YesNoMsg('确认删除任务单吗?','温馨提示') then
 begin
    if FThis.cdsTask.FieldByName('Status').asInteger = 1 then
    begin
      Msg('单据已审核,请先消审后再删除!');
      exit;
    end;  
    vData := TRFDataSet.Create(nil);
    vData.Connection := DM.DBConnection;    
    try 
      vData.ExecSQL(vSQL,False);
    finally   
      vData.free;
    end;
 end;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • (26)btnImportTask-OnClick事件

  点击[选择明细]按钮,打开明细选择界面。

procedure TMyHandler.btnImportTaskClick;
var
 iFrm:TbaseForm;
begin
  iFrm := paxfunc.OpenForm('Frm001_03');  
  iFrm.TagObject := FThis.cdsTaskDetail; 
end;
1
2
3
4
5
6
7

# 5. 地址选择

  该界面显示地图,点击地图上的地点以回传对应的地址信息。

# 5.1. 设计明细

地址选择 UI布局

  ①:TAMapView组件,控件名称为AMapView1。

  ②:TPanel组件,控件名称为plTop。

  ③:TRadioGroup组件,控件名称为rgLang。

  ④:TPanel组件,控件名称为plSatellite。

  ⑤:TCheckBox组件,控件名称为ckTraffic。

  ⑥:TButton组件,控件名称为btnMapQuery。

  ⑦:TTimer组件,控件名称为Timer1。

  • Frm001_02属性设置

    • Caption:主窗体标题,设置为地址选择。
    • ClientHeight:窗体客户区高度=640。
    • ClientWidth:窗体客户区宽度=960。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm001_02。
  • Panel1属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alBottom。(底部对齐)
    • Height:设置控件高度=49。
  • ①AMapView1属性设置

    • Align:设置对齐方式为alClient。
    • Key:设置用于显示地图地点信息的密钥,设置为3e20dffdda1288cf756ff92fb3556bbc。
  • ②plTop属性设置

    • 该面板中包含了两个标签组件TLabel对应的控件lbJW与lbAddress。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=41。
    • Color:设置显示的颜色=clGreen。
  • ③rgLang属性设置

    • Height:设置控件高度=45。
    • Width:设置控件宽度=181。
    • Caption:设置单选组的标题为地图语言。
    • Columns:设置单选组的列的数目=3。
    • Name:设置控件名称为rgLang。
    • Items:设置单选的项目。双击该属性或者点击属性右侧的[...]来打开选项编辑界面,编辑的内容如图所示。
  • ④plSatellite属性设置

    • Height:设置控件高度=36。
    • Width:设置控件宽度=41。
    • Caption:设置显示的文字内容=卫星。
    • Color:设置面板颜色=clGreen。
    • Name:设置控件名称为plSatellite。
  • ⑤ckTraffic属性设置

    • Caption:设置显示字幕内容=实时路况。
    • Name:设置控件名称为ckTraffic。
  • ⑥btnMapQuery属性设置

    • Caption:设置显示的字幕内容=地图查询。
    • Name:设置控件名称为btnMapQuery。
  • ⑦Timer1属性设置

    • Interval:设定计时器触发的时间间隔500。

# 5.2. 程序设计

# 5.2.1. 程序初始设置

  设置位置变量,用于存储定位信息。

type
  TMyHandler = class(TForm)
private
  FPos: TCCAMapLngLat; 
  FThis:TBaseForm; 
1
2
3
4
5

  在程序启动时,加载地图信息并加载地图。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  paxfunc.AdvancedInfo(FThis.AMapView1);
  FThis.AMapView1.LoadMap; 
end;
1
2
3
4
5
6

# 5.2.2. 事件设置

  • ③rgLang-OnClick事件

  点击地图语言以切换地图语言类型。

procedure TMyHandler.rgLangClick;
begin
  case FThis.rgLang.ItemIndex of
    0:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := en;
      end;
    1:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := zh_en;
      end;
    2:
      begin
        TCCAMapMapOptions(FThis.AMapView1.Options).lang := zh_cn;
      end;
  end; 
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • ④plSatellite-OnClick事件

  点击[卫星](地图类型)按钮,切换地图显示的类型。

procedure TMyHandler.plSatelliteClick;
begin
  if FTHis.plSatellite.Caption ='卫星' then
  begin   
    FTHis.plSatellite.Caption :='地图'; 
    FTHis.AMapView1.Satellite.Visible := true;
  end
  else if FTHis.plSatellite.Caption ='地图' then
  begin     
    FTHis.plSatellite.Caption :='卫星';  
    FTHis.AMapView1.Satellite.Visible := false;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • ⑤ckTraffic-OnClick事件

  点击[实时路况],系统将显示当前的实时路况信息。

procedure TMyHandler.ckTrafficClick;
begin
  FThis.AMapView1.Traffic.Visible := FThis.ckTraffic.checked;
end;
1
2
3
4
  • ①AMapView1-OnClickEvent事件

  点击地图,显示对应的地址以及经纬度信息。

procedure TMyHandler.AMapView1MapClickEvent;
var
 vAMapMarker:TCCAMapMarker;
begin
  FPos:=APos;   
  FThis.lbJW.Caption := FloatToStr(APos.Longitude)+','+ FloatToStr(APos.Latitude);  
  FThis.TagString := '';
  //TCCAMapLngLat与TCCLngLat类型不匹配
  paxfunc.GetMarkerAddress(FThis.AMapView1,APos,FThis);      
  FThis.AMapView1.Markers.Clear;
  vAMapMarker := paxfunc.AddMarker(FThis.AMapView1); 
    if FThis.AMapView1.MapLoadCompleted then
	begin  
	  with vAMapMarker do
	  begin
		Title := FThis.TagString;
		Position.Longitude := APos.Longitude;
		Position.Latitude := APos.Latitude;
		// 设置了Content属性Icon属性失效。要自定义丰富的标记就用Content属性吧
		Content:='<div>';
		Content:=Content+
		  '<image src="http://webapi.amap.com/theme/v1.3/markers/n/mark_r.png"></image>';
	   //Content:=Content+'<span style="white-space: nowrap;border:1px solid #fff;background-color:#ff0000;font-size: 12px;color:white;  padding: 4px 10px;">'+FThis.TagString+'</span>';
		// 图片19   x   31   pixels
		Content:=Content+'</div>'; // 必须有根div元素 不然缩放时图标位置不会更新
		draw;
	  end; 
    end;  
end;
1
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
  • ⑦Timer1-OnTimer事件

  定时触发,用于更新地址信息。

procedure TMyHandler.Timer1Timer;
var
 iField:TField;
begin
    FThis.lbAddress.Caption := FThis.TagString;     
    iField := TField(FThis.tagobject);
    if iField = nil then
    exit;
    iField.DataSet.Edit;
    iField.Value := FThis.lbAddress.Caption;
end;
1
2
3
4
5
6
7
8
9
10
11
  • ⑥btnMapQuery-OnClick事件

  点击[地图查询]按钮,显示出发点与目的地的输入框,输入相应的内容点击搜索框进行查询。

procedure TMyHandler.btnMapQueryClick;
begin
  with FThis.AMapView1.AdvancedInfoWindows[0] do
  begin
        AsOrigin:=true;//带:从这里出发输入框
        AsDestination:= true;//带:到这里去输入框
        PlaceSearch:=true;//带:在附近搜索框
        show;
  end; 
end;
1
2
3
4
5
6
7
8
9
10

# 6. 单据选择

  该界面显示可供发货的货物列表。点击选择需要发货的货品。

# 6.1. 设计明细

单据选择 UI布局

  ①:TDateTimePicker组件,控件名称为edtDate1。

  ②:TDateTimePicker组件,控件名称为edtDate2。

  ③:TEdit组件,控件名称为edtBillNo。

  ④:TButton组件,控件名称为btQuery。

  ⑤:TTimer组件,控件名称为Timer1。

  ⑥:TButton组件,控件名称为btnImportTask。

  ⑦:TRFDataSet组件,控件名称为cdsTask。

  ⑧:TDataSource组件,控件名称为dsTask。

  ⑨:TDBGrid组件,控件名称为DBGrid1。

  • Frm001_03属性设置

    • Caption:主窗体标题,设置为单据选择。
    • ClientHeight:窗体客户区高度=640。
    • ClientWidth:窗体客户区宽度=960。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm001_03。
  • plTop属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=37。
    • Name:设置控件名称为plTop。
  • Panel1属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alClient。(客户区对齐)
  • ①edtDate1属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
    • Name:设置控件名称为edtDate1。
  • ②edDate2属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为edtDate2。
  • ③edtBillNo属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=157。
    • Name:设置控件名称为edtBillNo。
  • ④btQuery属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=查询。
    • Name:设置控件名称为btQuery。
  • ⑥btnImportTask属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=导入任务。
    • Name:设置控件名称为btnImportTask。
  • ⑦cdsTask属性设置

    • Name:设置控件名称为cdsTask。
  • ⑧dsTask属性设置

    • Name:设置控件名称为dsTask。
    • DataSet:设置数据集控件名称为cdsTask。
  • ⑨DBGrid1属性设置

    • 该控件位于Panel1中。
    • Align:设置控件对齐方式=alClient。
    • DataSource:设置数据源控件为dsTaskDetail。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增6项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 FDate 单据日期 73
    2 FBillNo 单据号 113
    3 FBillName 单据类型 73
    4 FCustName 客商名称 128
    5 FEmpName 业务员 46
    6 FAddress 目的地 506

# 6.2. 程序设计

# 6.2.1. 程序初始设置

  设置初始连接设置,格式化日期为最近十天。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.cdsTask.Connection := DM.DBConnection;  
  FThis.edtDate1.date := Now()-10; 
  FThis.edtDate2.date := Now();
end;
1
2
3
4
5
6
7

# 6.2.2. 事件设置

  • ④btQuery-OnClick事件

  点击[查询]按钮,获取查询结果。

procedure TMyHandler.btQueryClick;
var
 vSQL:string;
begin
  vSQL := 'exec sp_GetTask '
  +QuotedStr(DateToStr(FThis.edtDate1.Date))+','
  +QuotedStr(DateToStr(FTHis.edtDate1.Date))+','
  + QuotedStr(FThis.edtBillNo.Text);    
  
  FThis.cdsTask.Open(vSQL);
end;
1
2
3
4
5
6
7
8
9
10
11
  • ⑤Timer1-OnTimer事件

  计时器定时触发,刷新查询结果。

procedure TMyHandler.Timer1Timer;
begin
  btQueryClick(Nil);
  FThis.Timer1.enabled := false;
end;
1
2
3
4
5
  • ⑥btnImportTask-OnClick事件

  点击[导入任务]按钮,将当前选择的任务导入至任务编辑界面。

procedure TMyHandler.btnImportTaskClick;
var
 vTaskDetail:TRFDataSet;
begin
 vTaskDetail := TRFDataSet(FThis.TagObject);
 if vTaskDetail <> nil then
 begin
    vTaskDetail.Append;  
    vTaskDetail.edit;  
    vTaskDetail.FieldByName('BillNo').asString := FTHis.cdsTask.FieldByName('FBillNo').asString;
    vTaskDetail.FieldByName('BillName').asString := FTHis.cdsTask.FieldByName('FBillName').asString;
    vTaskDetail.FieldByName('Address').asString := FTHis.cdsTask.FieldByName('FAddress').asString;        
    vTaskDetail.FieldByName('Customer').asString := FTHis.cdsTask.FieldByName('FCustName').asString;        
    FTHis.cdsTask.Delete;
 end; 
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 7. 路线监控

  该界面用于显示车辆位置形成的轨迹路线。

# 7.1. 设计明细

路线监控 UI布局

  ①:TDateTimePicker组件,控件名称为edtDate1。

  ②:TDateTimePicker组件,控件名称为edtDate2。

  ③:TEdit组件,控件名称为edtDriver。

  ④:TButton组件,控件名称为btQuery。

  ⑤:TTimer组件,控件名称为Timer1。

  ⑥:TRFDataSet组件,控件名称为cdsTask。

  ⑦:TDataSource组件,控件名称为dsTask。

  ⑧:TDBGrid组件,控件名称为DBGrid1。

  ⑨:TButton组件,控件名称为btnRoutetrack。

  ⑩:TButton组件,控件名称为btnStart。

  (11):TButton组件,控件名称为btnResumeMove。

  (12):TButton组件,控件名称为btnStop。

  (13):TAMapView组件,控件名称为AMapView1。

  • Frm002属性设置

    • Caption:主窗体标题,设置为路线监控。
    • ClientHeight:窗体客户区高度=733。
    • ClientWidth:窗体客户区宽度=1010。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm002。
  • plTop属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=37。
    • Name:设置控件名称为plTop。
  • Panel1属性设置

    • 该控件对应的组件为TPanel。
    • Align:设置控件对齐方式=alClient。
  • Panel2属性设置

    • 该控件在Panel1中,对应的组件为TPanel。
    • Align:设置控件对齐方式=alClient。
  • Panel3属性设置

    • 该控件在Panel2中,对应的组件为TPanel。
    • Align:设置控件对齐方式=alBottom。
    • Height:设置控件高度=41。
  • ①edtDate1属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
    • Name:设置控件名称为edtDate1。
  • ②edDate2属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为edtDate2。
  • ③edtDriver属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=229。
    • Name:设置控件名称为edtDriver。
  • ④btQuery属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=查询。
    • Name:设置控件名称为btQuery。
  • ⑥cdsTask属性设置

    • Name:设置控件名称为cdsTask。
  • ⑦dsTask属性设置

    • Name:设置控件名称为dsTask。
    • DataSet:设置数据集控件名称为cdsTask。
  • ⑧DBGrid1属性设置

    • 该控件位于Panel1中。
    • Align:设置对齐方式=alLeft。(左对齐)
    • DataSource:设置数据源控件为dsTask。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增10项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 TaskId / /
    2 TaskNo 任务单号 87
    3 Date 任务日期 111
    4 Employee 员工 49
    5 CarNumber 车牌号 74
    6 Leavetime 离厂时间 142
    7 Returntime 返厂时间 156
    8 Creator 创建人 108
    9 TotalMileage 总里程 94
    10 Status 状态 45
    • TaskId字段的Visible属性设置为False,即该字段在表格列中不显示。
  • ⑨btnRoutetrack属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示字幕内容=路线轨迹。
    • Name:设置控件名称为btnRoutetrack。
  • ⑩btnStart属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示字幕内容=暂停移动。
    • Name:设置控件名称为btnStart。
  • (11)btnResumeMove属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示字幕内容=继续移动。
    • Name:设置控件名称为btnResumeMove。
  • (12)btnStop属性设置

    • Height:设置控件高度=29。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示字幕内容=结束移动。
    • Name:设置控件名称为btnStop。
  • (13)AMapView1属性设置

    • 该控件位于Panel2中。
    • Align:设置对齐方式=alClient(客户区对齐)。

# 7.2. 程序设计

# 7.2.1. 程序初始设置

  新增两个子程序。用于增加移动轨迹以及经过的折线图。

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm;
  procedure AddMovePath;
  procedure AddPassedPolyline; 
1
2
3
4
5
6
//添加移动路径
procedure TMyHandler.AddMovePath;
var
  i: Integer;
  ALngX, ALatY: Double;
  APolyline: TCCAMapPolyline;
  AMapPoint: TCCAMapPoint; 
  vDataSet:TRFDataSet; 
  vSQL:String;
begin
 if FTHis.cdsTask.FieldByName('TaskNo').asstring = '' then exit;
  ALngX := FThis.AMapView1.Options.center.Longitude;
  ALatY := FThis.AMapView1.Options.center.Latitude;
  APolyline := FThis.AMapView1.Polylines.Add;
  AMapPoint := APolyline.Path.Add;
  with AMapPoint do
  begin
    Longitude := ALngX;
    Latitude := ALatY;
  end; 
  
  vDataSet := TRFDataSet.Create(nil); 
  vDataSet.Connection := DM.DBConnection;
  try                    
   vSQL := 'select Longitude,Latitude from Location where TaskNO='+QuotedStr(FTHis.cdsTask.FieldByName('TaskNo').asstring) + ' order by LocationTime';
   vDataSet.Open(vSQL);    
   vDataSet.First;
   while not vDataSet.eof do
   begin  
    with APolyline.Path.Add do
    begin    
      ALngX :=StrToFloat(vDataSet.fieldbyName('Longitude').asstring);
      ALatY :=StrToFloat(vDataSet.fieldbyName('Latitude').asstring);
      Longitude := ALngX;
      Latitude := ALatY;
    end;   
    vDataSet.Next;    
   end;
  finally       
   vDataSet.free;
  end;
  {
  for i := 1 to 3 do
  begin
    ALngX :=  ALngX + random() * 0.05;
    if (i mod 2 <> 0) then
    begin
      ALatY :=ALatY + random() * 0.0001;
    end
    else
    begin
      ALatY := ALatY + random() * 0.06;
    end;

    with APolyline.Path.Add do
    begin
      Longitude := ALngX;
      Latitude := ALatY;
    end;   
    
  end;}

  APolyline.Draw;
end;

//添加行经点的路线折线图
procedure TMyHandler.AddPassedPolyline;
begin
  with FThis.AMapView1.Polylines.Add do
  begin
    //StrokeColor:=TColorRec.Red;
    draw;
  end;
end;
1
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

  在程序启动时,设置数据集连接配置,初始化日期为近十天,加载地图。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  paxfunc.AdvancedInfo(FThis.AMapView1);
  FThis.AMapView1.LoadMap; 
  this.edtDate1.date := Now()-10; 
  this.edtDate2.date := Now();       
  FThis.cdsTask.Connection := DM.DBConnection;
end;
1
2
3
4
5
6
7
8
9

# 7.2.2. 事件设置

  • ④btQuery-OnClick事件

  点击[查询]按钮,刷新数据显示。

procedure TMyHandler.btQueryClick;
begin
  FThis.cdsTask.sql.Text := 'Select * from Task '
  +' where Convert(varchar(10),Date,120) between ' + QuotedStr(DateToStr(FThis.edtDate1.Date)) + ' and ' + QuotedStr(DateToStr(FThis.edtDate2.Date))
  +' and Employee+CarNumber like '+'''%'+FThis.edtDriver.Text+'%'''
  +' Order by Date desc'; 
  FThis.CdsTask.Open; 
end;
1
2
3
4
5
6
7
8
  • ⑤Timer1-OnTimer事件

  计时器定时触发事件,用于刷新表格数据。

procedure TMyHandler.Timer1Timer;
begin
  btQueryClick(nil);
  FThis.Timer1.enabled := false; 
end;
1
2
3
4
5
  • ⑨btnRoutetrack-OnClick事件

  点击[路线轨迹],在地图上显示车辆的路径轨迹。

procedure TMyHandler.btnRoutetrackClick;
var
 vAMapMarker:TCCAMapMarker;  
begin
  //全部清空
  FThis.AMapView1.Markers.Clear; 
  FThis.AMapView1.Polylines.Clear; 
  
  // 添加车辆(marker)  
  vAMapMarker := paxfunc.AddMarker(FThis.AMapView1);
  with vAMapMarker do
  begin      
    Position.Longitude := FThis.AMapView1.Options.center.Longitude;
    Position.Latitude := FThis.AMapView1.Options.center.Latitude;
    Offset.X:=-26;
    Offset.Y:=-13;
    Icon.Image := 'http://webapi.amap.com/images/car.png';   
    AutoRotation := true; //车辆根据线路方向自动旋转
    Clickable:=true;
    draw;
  end;
  // 添加路径
  AddMovePath;
  //添加已经路过的路径(无需设置路径:点集合为空)
  AddPassedPolyline;
  //
  FThis.AMapView1.FitView;
  //开始移动  
  FThis.AMapView1.Markers[0].MoveAlong(FThis.AMapView1.Polylines[0],FThis.AMapView1.Polylines[1],3000);//单位是500千米每小时
end;
1
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
  • ⑩btnStart-OnClick事件

  点击[暂停移动],暂时停止对车辆的追踪。

procedure TMyHandler.btnStartClick;
begin
  //暂停移动
  FThis.AMapView1.Markers[0].PauseMove;
end;
1
2
3
4
5
  • (11)btnResumeMove-OnClick事件

  点击[继续移动],继续进行车辆位置追踪。

procedure TMyHandler.btnResumeMoveClick;
begin
  //继续移动
  FThis.AMapView1.Markers[0].ResumeMove;
end;
1
2
3
4
5
  • (12)btnStop-OnClick事件

  点击[结束移动]按钮,停止移动并清空路线轨迹。

procedure TMyHandler.btnStopClick;
begin
  //停止移动并清空
  FThis.AMapView1.Markers[0].StopMove; 
  FThis.AMapView1.Markers.Clear; 
  FThis.AMapView1.Polylines.Clear; 
end;
1
2
3
4
5
6
7

# 8. 报表管理

  该界面可显示程序使用的相关报表。

# 8.1. 设计明细

  ①:TDateTimePicker组件,控件名称为edtDate1。

  ②:TDateTimePicker组件,控件名称为edtDate2。

  ③:TEdit组件,控件名称为edtDriver。

  ④:TEdit组件,控件名称为edtCarNumber。

  ⑤:TButton组件,控件名称为btQuery。

  ⑥:TRFDataSet组件,控件名称为cdsTask。

  ⑦:TDataSource组件,控件名称为dsTask。

  ⑧:TRFDataSet组件,控件名称为cdsEmpCount。

  ⑨:TDataSource组件,控件名称为dsEmpCount。

  ⑩:TRFDataSet组件,控件名称为cdsCustCount。

  (11):TDataSource组件,控件名称为dsCustCount。

  (12):TDBGrid组件,控件名称为DBGrid1。

  (13):TDateTimePicker组件,控件名称为DateTimePicker1。

  (14):TDateTimePicker组件,控件名称为DateTimePicker2。

  (15):TButton组件,控件名称为Button1。

  (16):TDBChart组件,控件名称为DBChart1。

  (17):TDateTimePicker组件,控件名称为edtDate3。

  (18):TDateTimePicker组件,控件名称为edtDate4。

  (19):TButton组件,控件名称为Button2。

  (20):TDBChart组件,控件名称为DBChart2。

  • Frm003属性设置

    • Caption:主窗体标题,设置为报表管理。
    • ClientHeight:窗体客户区高度=748。
    • ClientWidth:窗体客户区宽度=977。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm003。
  • PageControl1属性设置

    • 该控件对应的组件为TPageControl。
    • 在界面中右键点击[New Page],新增三个页面,其ActivePage.Caption分别命名为Inspector,Object Tree,Tool Palette。
    • Align:设置对齐方式为alClient(客户区对齐)。
    • TabPosition:设置标签页面显示的位置为tpBottom(底部)。
  • plTop属性设置

    • 该控件位于TabSheet1中,为TPanel组件。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=37。
    • Name:设置控件名称为plTop。
  • Panel1属性设置

    • 该控件位于TabSheet2中,为TPanel组件。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=37。
  • Panel2属性设置

    • 该控件位于TabSheet3中,为TPanel组件。
    • Align:设置对齐方式=alTop。(顶部对齐)
    • Height:设置控件高度=37。
  • ①edtDate1属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
    • Name:设置控件名称为edtDate1。
  • ②edDate2属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为edtDate2。
  • ③edtDriver属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=149。
    • Name:设置控件名称为edtDriver。
  • ④edtCarNumber属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=153。
    • Name:设置控件名称为edtCarNumber。
  • ⑤btQuery属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=查询。
    • Name:设置控件名称为btQuery。
  • ⑥cdsTask属性设置

    • Name:设置控件名称为cdsTask。
  • ⑦dsTask属性设置

    • Name:设置控件名称为dsTask。
    • DataSet:设置数据集控件名称为cdsTask。
  • ⑧cdsEmpCount属性设置

    • Name:设置控件名称为cdsEmpCount。
  • ⑨dsEmpCount属性设置

    • Name:设置控件名称为dsEmpCount。
    • DataSet:设置数据集控件名称为cdsEmpCount。
  • ⑩cdsCustCount属性设置

    • Name:设置控件名称为cdsCustCount。
  • (11)dsCustCount属性设置

    • Name:设置控件名称为dsCustCount。
    • DataSet:设置数据集控件名称为cdsCustCount。
  • (12)DBGrid1属性设置

    • 该控件位于TabSheet1中。
    • Align:设置对齐方式=alClient。(客户区对齐)
    • DataSource:设置数据源控件为dsTask。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增10项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 TaskId / /
    2 TaskNo 任务单号 87
    3 Date 任务日期 111
    4 Employee 员工 49
    5 CarNumber 车牌号 74
    6 Leavetime 离厂时间 141
    7 Returntime 返厂时间 156
    8 Creator 创建人 108
    9 TotalMileage 总里程 94
    10 Status 状态 45
    • TaskId字段的Visible属性设置为False,即该字段在表格列中不显示。
  • (13)DateTimePicker1属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
  • (14)DateTimePicker2属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
  • (15)Button1属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=查询。
  • (16)DBChart1属性设置

    • 该控件位于TabSheet2中。
    • Align:设置控件对齐方式=alClient(客户区对齐)。
    • 右键点击该控件,选择[编辑图表],打开图表编辑器,在图表编辑界面点击[新增...]新增系列。
    • 在弹出的选择器中选择棒形图,点击[确定]。
    • 返回至编辑界面,选择新创建的Series1,在[资料来源]中选择资料组,选择对应的数据集名称cdsEmpCount,点击右侧的[套用]按钮(该过程由于未在设计模式下连接数据库,可能会出现报错提示,属于正常现象)。按找图示内容填写卷标与长条内容。
    • 在轴中,修改左轴与下轴的标题。
    • 在标题中修改图表标题。
  • (17)edtDate3属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=130。
    • Name:设置控件名称为edtDate3。
  • (18)edtDate4属性设置

    • Height:设置控件高度=26。
    • Width:设置控件宽度=126。
    • Name:设置控件名称为edtDate4。
  • (19)Button2属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=查询。
  • (20)DBChart2属性设置

    • 该控件位于TabSheet3中。
    • Align:设置控件对齐方式=alClient(客户区对齐)。
    • 右键点击该控件,选择[编辑图表],打开图表编辑器,在图表编辑界面点击[新增...]新增系列。
    • 在弹出的选择器中选择棒形图,点击[确定]。
    • 返回至编辑界面,选择新创建的Series1,在[资料来源]中选择资料组,选择对应的数据集名称cdsCustCount,点击右侧的[套用]按钮(该过程由于未在设计模式下连接数据库,可能会出现报错提示,属于正常现象)。按找图示内容填写卷标与长条内容。
    • 在轴中,修改左轴与下轴的标题。
    • 在标题中修改图表标题。

# 8.2. 程序设计

# 8.2.1. 程序初始设置

  在程序启动时,将时间设定为近期十天。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.cdsTask.Connection := DM.DBConnection;
  FThis.cdsEmpCount.Connection := DM.DBConnection;
  FThis.cdsCustCount.Connection := DM.DBConnection;     

  this.edtDate1.date := Now()-10; 
  this.edtDate2.date := Now();

  this.edtDate3.date := Now()-10; 
  this.edtDate4.date := Now();
end;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 8.2.2. 事件设置

  • ⑤btQuery-OnClick事件

  点击Inspector标签页中的[查询]按钮,查看报表内容。

procedure TMyHandler.btQueryClick;
begin
  FThis.cdsTask.sql.Text := 'Select * from Task Order by Date desc';
  FThis.CdsTask.Open;
end;
1
2
3
4
5
  • (15)Button1-OnClick事件

  点击Object Tree中的[查询]按钮,打开员工出勤次数分析表。

procedure TMyHandler.Button1Click;
begin
  FThis.cdsEmpCount.sql.Text := 'Select' 
+' Employee,COUNT(1) as Count'
+' from Task'  
+' where Convert(varchar(10),Date,120) between ' + QuotedStr(DateToStr(FThis.edtDate1.Date)) + ' and ' + QuotedStr(DateToStr(FThis.edtDate2.Date))
+' Group by Employee';
  FThis.cdsEmpCount.Open; 
end;
1
2
3
4
5
6
7
8
9
  • (19)Button2-OnClick事件

  点击Tool Palette中的[查询]按钮,打开客户送达次数分析表。

procedure TMyHandler.Button2Click;
begin
  FThis.cdsCustCount.sql.Text := 'Select' 
+' Customer,COUNT(1) as Count'
+' from Task A'
+' inner join TaskDetail B on A.TaskId = b.TaskId'  
+' where isnull(Customer,'''') <> '''' and A.Date between ' + QuotedStr(DateToStr(FThis.edtDate3.Date)) + ' and ' + QuotedStr(DateToStr(FThis.edtDate4.Date))
+' Group by Customer';
  FThis.cdsCustCount.Open;
end;
1
2
3
4
5
6
7
8
9
10

# 9. 资料维护

  该界面为基础资料编辑界面,包含车辆信息与驾驶员信息等相关内容。

# 9.1. 设计明细

  ①:TDBGrid组件,控件名称为DBGrid1。

  ②:TRFDataSet组件,控件名称为cdsCar。

  ③:TDataSource组件,控件名称为dsCar。

  ④:TRFDataSet组件,控件名称为cdsEmployee。

  ⑤:TDataSource组件,控件名称为dsEmployee。

  ⑥:TButton组件,控件名称为btnSave。

  ⑦:TDBGrid组件,控件名称为DBGrid2。

  • Frm004属性设置

    • Caption:主窗体标题,设置为资料维护。
    • ClientHeight:窗体客户区高度=591。
    • ClientWidth:窗体客户区宽度=726。
    • FormStyle:设置窗体显示的样式=fsStayOnTop。
    • Name:设置窗体名称=Frm004。
  • PageControl1属性设置

    • 该控件对应的组件为TPageControl。
    • 在界面中右键点击[New Page],新增两个页面,其ActivePage.Caption分别命名为车辆信息,驾驶员信息。
    • Align:设置对齐方式=alTop(顶部对齐)。
    • Height:设置控件高度=555。
  • ①DBGrid1属性设置

    • 该控件位于TabSheet1中。
    • Align:设置对齐方式=alClient。(客户区对齐)
    • DataSource:设置数据源控件为dsCar。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增7项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 CarNumber 车牌号 104
    2 CarName 车辆名称 98
    3 Weight 车辆载重 61
    4 Driver 驾驶员 84
    5 MaintenanceCycle 保养周期(天) 76
    6 LastMaintenanceDate 最近保养日期 122
    7 MaintenanceDate 保养日期 129
  • ②cdsCar属性设置

    • Name:设置控件名称为cdsCar。
  • ③dsCar属性设置

    • Name:设置控件名称为dsCar。
    • DataSet:设置数据集控件名称为cdsCar。
  • ④cdsEmloyee属性设置

    • Name:设置控件名称为cdsEmloyee。
  • ⑤dsEmloyee属性设置

    • Name:设置控件名称为dsEmloyee。
    • DataSet:设置数据集控件名称为cdsEmloyee。
  • ⑥btnSave属性设置

    • Height:设置控件高度=27。
    • Width:设置控件宽度=75。
    • Caption:设置控件显示的字幕内容=保存。
    • Name:设置控件名称为btnSave。
  • ⑦DBGrid2属性设置

    • 该控件位于TabSheet2中。
    • Align:设置对齐方式=alClient。(客户区对齐)
    • DataSource:设置数据源控件为dsEmployee。
    • Columns:设置表格列字段内容。双击该属性或者点击属性右侧的[...]打开字段编辑器,点击左上角的按钮新增7项字段内容,分别修改如下属性内容。
    序号 字段名称FieldName 表头名称Title.Caption 表格列宽Width
    1 Employee 驾驶员 72
    2 CarNumber 车牌号 106
    3 Position 职务 72
    4 TelPhone 手机号码 161
    5 Note 备注 266

# 9.2. 程序设计

# 9.2.1. 程序初始设置

  在程序启动时,设置数据库连接并打开表格。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  FThis.cdsCar.Connection := DM.DBConnection;
  FThis.cdsEmployee.Connection := DM.DBConnection;  
  
  FThis.cdsCar.Open('Select * from Car');
  FThis.cdsEmployee.Open('Select * from Employee');
end;
1
2
3
4
5
6
7
8
9

# 9.2.2. 事件设置

  • ⑥btnSave-OnClick事件

  点击[保存]按钮,保存对基础资料的修改。

procedure TMyHandler.btnSaveClick;
begin
   DM.SaveData(FThis.cdsCar);
   DM.SaveData(FThis.cdsEmployee);
end;
1
2
3
4
5

# 10. 运行结果

  通过工具栏保存,将程序保存为 sdb 项目文件。

  使用鼠标点击工具栏运行(Run),测试运行结果。

  主界面显示地图相关信息,底下[地图语言]栏位显示当前选择的地图语言信息,点击即可切换成对应的地图语言。点击[卫星]字样的按钮,可在普通与卫星之间切换,同时地图类型也会相应切换。[实时路况]如果勾选则会显示实时路况信息,点击[地图查询]进入到地图查询界面。点击[测距]可使用地图直尺功能进行距离测量。点击[结束绘制]结束测量并清空屏幕上的测量记录。

  点击[资料维护],打开资料维护界面,在该界面中可以更新车辆信息以及驾驶员信息,按下↓方向键新增行,在行中输入车辆信息以及驾驶员信息等内容。

地图及定位
温湿度采集与控制

← 地图及定位 温湿度采集与控制→

Copyright © 2021-2025 爱招飞IsoFace | ALL Rights Reserved
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式