定位精灵
# 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
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. 设计明细

①: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;
2
3
4
5
6
# 2.2.2. 事件设置
- ③imgTask-OnClick事件
点击[任务派遣]
,打开任务派遣界面。
procedure TMyHandler.imgTaskClick;
begin
paxfunc.OpenForm('Frm001');
end;
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;
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;
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;
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;
2
3
4
- ②Timer1-OnTimer事件
计时器定时触发事件,用于刷新车辆的即时定位信息。
procedure TMyHandler.Timer1Timer;
begin
imgLocationClick(Sender);
end;
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;
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;
2
3
4
5
6
- (13)btnCloseDraw-OnClick事件
点击[结束绘制]
按钮,结束地图的绘制并清空测距数据。
procedure TMyHandler.btnCloseDrawClick;
begin
FThis.AMapView1.MouseTool.close(true,333);
FThis.AMapView1.setDefaultCursor('');
end;
2
3
4
5
- ⑤imgDriveLine-OnClick事件
点击[路线监控]
按钮,打开路线监控界面。
procedure TMyHandler.imgDriverLineClick;
begin
paxfunc.OpenForm('Frm002');
end;
2
3
4
- ⑥imgReport-OnClick事件
点击[报表管理]
按钮,打开报表管理界面。
procedure TMyHandler.imgReportClick;
begin
paxfunc.OpenForm('Frm003');
end;
2
3
4
- ⑦imgBaseInfo-OnClick事件
点击[资料维护]
按钮,打开资料维护界面。
procedure TMyHandler.imgBaseInfoClick;
begin
paxfunc.OpenForm('Frm004');
end;
2
3
4
# 3. 任务派遣
该界面用于打开任务派遣查询界面。
# 3.1. 设计明细

①: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;
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;
2
3
4
5
6
7
8
- ⑥btnNewTask-OnClick事件
点击[新建任务]
按钮,打开任务编辑界面进行新增操作。
procedure TMyHandler.btnNewTaskClick;
begin
paxfunc.OpenForm('Frm001_01');
end;
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;
2
3
4
5
6
7
8
9
- ④Timer1-OnTimer事件
Timer1的触发事件,定时刷新查询列表。
procedure TMyHandler.Timer1Timer;
begin
btQueryClick(nil);
FThis.Timer1.Enabled := false;
end;
2
3
4
5
# 4. 新建任务
该界面显示为任务的编辑界面,包含主表的信息以及明细表格的内容信息。
# 4.1. 设计明细

①: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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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.
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.
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;
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;
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;
2
3
4
5
6
7
# 5. 地址选择
该界面显示地图,点击地图上的地点以回传对应的地址信息。
# 5.1. 设计明细

①: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
。
- 该面板中包含了两个标签组件TLabel对应的控件
③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;
2
3
4
5
在程序启动时,加载地图信息并加载地图。
constructor TMyHandler.Create(AOwner: TComponent);
begin
FThis :=TBaseForm(AOwner);
paxfunc.AdvancedInfo(FThis.AMapView1);
FThis.AMapView1.LoadMap;
end;
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;
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;
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;
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;
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;
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;
2
3
4
5
6
7
8
9
10
# 6. 单据选择
该界面显示可供发货的货物列表。点击选择需要发货的货品。
# 6.1. 设计明细

①: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;
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;
2
3
4
5
6
7
8
9
10
11
- ⑤Timer1-OnTimer事件
计时器定时触发,刷新查询结果。
procedure TMyHandler.Timer1Timer;
begin
btQueryClick(Nil);
FThis.Timer1.enabled := false;
end;
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;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 7. 路线监控
该界面用于显示车辆位置形成的轨迹路线。
# 7.1. 设计明细

①: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;
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;
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;
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;
2
3
4
5
6
7
8
- ⑤Timer1-OnTimer事件
计时器定时触发事件,用于刷新表格数据。
procedure TMyHandler.Timer1Timer;
begin
btQueryClick(nil);
FThis.Timer1.enabled := false;
end;
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;
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;
2
3
4
5
- (11)btnResumeMove-OnClick事件
点击[继续移动]
,继续进行车辆位置追踪。
procedure TMyHandler.btnResumeMoveClick;
begin
//继续移动
FThis.AMapView1.Markers[0].ResumeMove;
end;
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;
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;
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;
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;
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;
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;
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;
2
3
4
5
# 10. 运行结果
通过工具栏保存,将程序保存为 sdb 项目文件。
使用鼠标点击工具栏运行(Run),测试运行结果。
主界面显示地图相关信息,底下[地图语言]
栏位显示当前选择的地图语言信息,点击即可切换成对应的地图语言。点击[卫星]
字样的按钮,可在普通
与卫星
之间切换,同时地图类型也会相应切换。[实时路况]
如果勾选则会显示实时路况信息,点击[地图查询]
进入到地图查询界面。点击[测距]
可使用地图直尺功能进行距离测量。点击[结束绘制]
结束测量并清空屏幕上的测量记录。

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