定位精靈
# 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),測試運行結果。
主界面顯示地圖相關資訊,底下[地圖語言]
欄位顯示目前選擇的地圖語言資訊,點選即可切換成對應的地圖語言。點選[衛星]
字樣的按鈕,可在普通
與衛星
之間切換,同時地圖型別也會相應切換。[實時路況]
如果勾選則會顯示實時路況資訊,點選[地圖查詢]
進入到地圖查詢界面。點選[測距]
可使用地圖直尺功能進行距離測量。點選[結束繪製]
結束測量並清空螢幕上的測量記錄。
點選[資料維護]
,打開資料維護界面,在該界面中可以更新車輛資訊以及駕駛員資訊,按下↓方向鍵新增行,在行中輸入車輛資訊以及駕駛員資訊等內容。