愛招飛幫助手冊 愛招飛幫助手冊
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • Smart幫助主頁
  • 學習手冊

  • 開發手冊

    • 通訊協議

    • 互動輸出

    • 媒體存取

    • 人工智慧

    • 實體運用

      • 定位精靈
        • 1. 說明
        • 2. 定位精靈主頁面
          • 2.1. 設計明細
          • 2.2. 程式設計
          • 2.2.1. 程式初始設定
          • 2.2.2. 事件設定
        • 3. 任務派遣
          • 3.1. 設計明細
          • 3.2. 程式設計
          • 3.2.1. 程式初始設定
          • 3.2.2. 事件設定
        • 4. 新建任務
          • 4.1. 設計明細
          • 4.2. 程式設計
          • 4.2.1. 程式初始設定
          • 4.2.2. 事件設定
        • 5. 地址選擇
          • 5.1. 設計明細
          • 5.2. 程式設計
          • 5.2.1. 程式初始設定
          • 5.2.2. 事件設定
        • 6. 單據選擇
          • 6.1. 設計明細
          • 6.2. 程式設計
          • 6.2.1. 程式初始設定
          • 6.2.2. 事件設定
        • 7. 路線監控
          • 7.1. 設計明細
          • 7.2. 程式設計
          • 7.2.1. 程式初始設定
          • 7.2.2. 事件設定
        • 8. 報表管理
          • 8.1. 設計明細
          • 8.2. 程式設計
          • 8.2.1. 程式初始設定
          • 8.2.2. 事件設定
        • 9. 資料維護
          • 9.1. 設計明細
          • 9.2. 程式設計
          • 9.2.1. 程式初始設定
          • 9.2.2. 事件設定
        • 10. 運行結果
      • 溫濕度採集與控制
      • 車間資訊採集與控制
      • SVG組態
      • 網路聊天室
      • 三色聲光報警器運用
目录

定位精靈

# Smart之定位精靈

# 1. 說明

  本範例是車輛定位系統的管理端,用於向司機和車輛分派運輸任務,該系統可查詢車輛運輸的路徑軌跡,用於管理分析運輸情況。還可以實時觀察目前車輛的所在位置。該範例需與PinToo之定位精靈配合使用。

  該範例使用到資料庫PinToo_Map,其數據表樣式可由以下SQL進行匯入產生。

USE [master]
GO

--建立資料庫,名稱為PinToo_Map
CREATE DATABASE [PinToo_Map]

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

CREATE     procedure [dbo].[sp_GetBillNo]
@BillID    varchar(20),
@Date        datetime,  --日期,為空時,取目前日期
@Preview     int  --1.預覽顯示; 0.正式獲取,更新順序號

AS

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

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

declare @DateStr      varchar(10)

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


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

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


select @BefString = @BefStr + @DateStr

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

    commit tran
end
else
begin

    if @CurrentNo is null
        select @CurrentNo = 1

end

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



GO
/****** Object:  StoredProcedure [dbo].[sp_GetTask]    Script Date: 2020-08-29 16:20:28 ******/
--預存程序,向其他系統獲取出庫數據,用於產生送貨任務單
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

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

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

  在TARS中配置連線名稱,設定為PinToo_Map。

  Smart中點選[工具]-[帳套]設定,將該連線指定為Smart的帳套設定。

  通過本範例學習,可以掌握表單的製作以及單據的錄入,以及在地圖上標註定位資訊。

  開啟Smart智慧控制平臺,點選功能表欄[檔案]-[打開專案]選擇專案打開該範例。

  該範例由多個窗體組成,以下將分別介紹各窗體使用的控制元件。

# 2. 定位精靈主頁面

  該頁面為主頁面,用於顯示地圖以及功能模組功能表。

# 2.1. 設計明細

定位精靈主頁面 UI佈局

  ①:TAMapView元件,控制元件名稱為AMapView1。

  ②:TTimer元件,控制元件名稱為Timer1。

  ③:TImage元件,控制元件名稱為imgTask。

  ④:TImage元件,控制元件名稱為imgLocation。

  ⑤:TImage元件,控制元件名稱為imgDriveLine。

  ⑥:TImage元件,控制元件名稱為imgReport。

  ⑦:TImage元件,控制元件名稱為imgBaseInfo。

  ⑧:TRadioGroup元件,控制元件名稱為rgLang。

  ⑨:TPanel元件,控制元件名稱為plSatellite。

  ⑩:TCheckBox元件,控制元件名稱為ckTraffic。

  (11):TButton元件,控制元件名稱為btnMapQuery。

  (12):TButton元件,控制元件名稱為btnRule。

  (13):TButton元件,控制元件名稱為btnCloseDraw。

  • Main窗體屬性設定

    • Caption:主窗體標題,設定為定位精靈。
    • ClientHeight:窗體客戶區高度=749。
    • ClientWidth:窗體客戶區寬度=1028。
  • plBottom屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alBottom(底部對齊)。
    • Height:設定控制元件高度=49。
    • Name:設定 控制元件名稱為plBottom。
  • plRight屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alRight(右端對齊)。
    • Width:設定控制元件寬度=101。
    • Name:設定控制元件名稱為plRight。
  • plClient屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alClient(客戶區對齊)。
    • Name:設定控制元件名稱為plClient。
  • ①AMapView1屬性設定

    • Align:設定對齊方式,該控制元件位於plClient中,設定為alClient。
    • Key:設定顯示地點資訊的金鑰,設定為3e20dffdda1288cf756ff92fb3556bbc。
  • ②Timer1屬性設定

    • Interval:設定計時器的觸發時間間隔=5000。
  • ③imgTask屬性設定

    • Center:設定影象是否居中=True。
    • Height:設定控制元件高度為113。
    • Width:設定控制元件寬度=93。
    • Name:設定控制元件名稱為imgTask。
    • Picture:設定顯示的影象。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ④imgLocation屬性設定

    • Center:設定影象是否居中=True。
    • Height:設定控制元件高度為89。
    • Width:設定控制元件寬度=95。
    • Name:設定控制元件名稱為imgLocation。
    • Picture:設定顯示的影象。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑤imgDriveLine屬性設定

    • Center:設定影象是否居中=True。
    • Height:設定控制元件高度為79。
    • Width:設定控制元件寬度=95。
    • Name:設定控制元件名稱為imgDriveLine。
    • Picture:設定顯示的影象。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑥imgReport屬性設定

    • Center:設定影象是否居中=True。
    • Height:設定控制元件高度為85。
    • Width:設定控制元件寬度=86。
    • Name:設定控制元件名稱為imgReport。
    • Picture:設定顯示的影象。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑦imgBaseInfo屬性設定

    • Center:設定影象是否居中=True。
    • Height:設定控制元件高度為85。
    • Width:設定控制元件寬度=93。
    • Name:設定控制元件名稱為imgBaseInfo。
    • Picture:設定顯示的影象。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑧rgLang屬性設定

    • Height:設定控制元件高度=45。
    • Width:設定控制元件寬度=181。
    • Caption:設定單選組的標題為地圖語言。
    • Columns:設定單選組的列的數目=3。
    • Name:設定控制元件名稱為rgLang。
    • Items:設定單選的專案。雙擊該屬性或者點選屬性右側的[...]來打開選項編輯界面,編輯的內容如圖所示。
    • ItemIndex:設定預設選擇項的索引值,設定為2。
  • ⑨plSatellite屬性設定

    • Height:設定控制元件高度=36。
    • Width:設定控制元件寬度=41。
    • Caption:設定顯示的文字內容=衛星。
    • Color:設定面板顏色=clGreen。
    • Name:設定控制元件名稱為plSatellite。
  • ⑩ckTraffic屬性設定

    • Caption:設定顯示字幕內容=實時路況。
    • Name:設定控制元件名稱為ckTraffic。
  • (11)btnMapQuery屬性設定

    • Caption:設定顯示的字幕內容=地圖查詢。
    • Name:設定控制元件名稱為btnMapQuery。
  • (12)btnRule屬性設定

    • Caption:設定顯示的字幕內容=測距。
    • Name:設定控制元件名稱為btnRule。
  • (13)btnCloseDraw屬性設定

    • Caption:設定顯示的字幕內容=結束繪製。
    • Name:設定控制元件名稱為btnCloseDraw。

# 2.2. 程式設計

# 2.2.1. 程式初始設定

  在程式啟動時,設定地圖資訊並載入地圖顯示。

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

# 2.2.2. 事件設定

  • ③imgTask-OnClick事件

  點選[任務派遣],打開任務派遣界面。

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

  點選[即時定位]按鈕,顯示目前正在執行任務的車輛所在的位置。

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

		draw;
	  end;
       end;
    end;
    iCds.next;
  end; 
 finally 
  iCds.free;
 end; 
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  • ⑧rgLang-OnClick事件

  點選地圖語言按鈕,將地圖切換成對應的語言。

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

  點選[衛星](地圖型別)按鈕,切換地圖顯示的型別。

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

  點選[實時路況],系統將顯示目前的實時路況資訊。

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

  計時器定時觸發事件,用於重新整理車輛的即時定位資訊。

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

  點選[地圖查詢]按鈕,顯示出發點與目的地的輸入框,輸入相應的內容點選搜索框進行查詢。

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

  點選[測距]按鈕,開始進行測距操作。

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

  點選[結束繪製]按鈕,結束地圖的繪製並清空測距數據。

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

  點選[路線監控]按鈕,打開路線監控界面。

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

  點選[報表管理]按鈕,打開報表管理界面。

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

  點選[資料維護]按鈕,打開資料維護界面。

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

# 3. 任務派遣

  該界面用於打開任務派遣查詢界面。

# 3.1. 設計明細

任務派遣 UI佈局

  ①:TDateTimePicker元件,控制元件名稱為edtDate1。

  ②:TDateTimePicker元件,控制元件名稱為edtDate2。

  ③:TEdit元件,控制元件名稱為edtDriver。

  ④:TTimer元件,控制元件名稱為Timer1。

  ⑤:TButton元件,控制元件名稱為btQuery。

  ⑥:TButton元件,控制元件名稱為btnNewTask。

  ⑦:TButton元件,控制元件名稱為btnEditTask。

  ⑧:TRFDataSet元件,控制元件名稱為cdsTask。

  ⑨:TDataSource元件,控制元件名稱為dsTask。

  ⑩:TDBGrid元件,控制元件名稱為DBGrid1。

  • Frm001屬性設定

    • Caption:主窗體標題,設定為任務派遣。
    • ClientHeight:窗體客戶區高度=729。
    • ClientWidth:窗體客戶區寬度=1008。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm001。
  • plTop屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alTop(頂部對齊)。
    • Height:設定控制元件高度=37。
    • Name:設定 控制元件名稱為plTop。
  • Panel2屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alBottom(底部對齊)。
    • Height:設定控制元件高度=41。
  • Panel1屬性設定

    • 該控制元件對應為TPanel元件。
    • Align:設定對齊方式=alClient(客戶區對齊)。
  • ①edtDate1屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
    • Name:設定控制元件名稱為edtDate1。
  • ②edDate2屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為edtDate2。
  • ③edtDriver屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=297。
    • Name:設定控制元件名稱為edtDriver。
  • ⑤btQuery屬性設定

    • Caption:設定按鈕顯示字幕=查詢。
    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Name:設定控制元件名稱為btQuery。
  • ⑥btnNewTask屬性設定

    • Caption:設定按鈕顯示字幕=新建任務。
    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Name:設定控制元件名稱為btnNewTask。
  • ⑦btnEditTask屬性設定

    • Caption:設定按鈕顯示字幕=編輯任務。
    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Name:設定控制元件名稱為btnEditTask。
  • ⑧cdsTask屬性設定

    • Name:設定控制元件名稱為cdsTask。
  • ⑨dsTask屬性設定

    • DataSet:設定繫結的數據集=cdsTask。
    • Name:設定控制元件名稱為dsTask。
  • ⑩DBGrid1屬性設定

    • Align:設定控制元件對齊方式=alClient。
    • DataSource:設定數據源控制元件為dsTask。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增11項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 TaskId / /
    2 TaskNo 任務編號 81
    3 Date 任務日期 115
    4 Employee 員工 49
    5 CarNumber 車牌號 60
    6 Leavetime 離廠時間 127
    7 Returntime 返廠時間 125
    8 TotalMileage 總里程 52
    9 Creator 建立人 49
    10 Status 狀態 44
    11 Start 執行中 43
    12 Note 說明 256
    • TaskId欄位的Visible屬性設定為False,即該欄位在表格列中不顯示。

# 3.2. 程式設計

# 3.2.1. 程式初始設定

  在程式啟動時,初始化查詢日期為近十天,設定連線配置。

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

# 3.2.2. 事件設定

  • ⑤btQuery-OnClick事件

  點選[查詢]按鈕,進行相應的查詢。

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

  點選[新建任務]按鈕,打開任務編輯界面進行新增操作。

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

  點選[編輯任務]按鈕,打開任務編輯界面進行操作。

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

  Timer1的觸發事件,定時重新整理查詢列表。

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

# 4. 新建任務

  該界面顯示為任務的編輯界面,包含主表的資訊以及明細表格的內容資訊。

# 4.1. 設計明細

新建任務 UI佈局

  ①:TDateTimePicker元件,控制元件名稱為dtDate。

  ②:TDBEdit元件,控制元件名稱為dbLeavetime。

  ③:TDBEdit元件,控制元件名稱為dbTaskNo。

  ④:TDBMemo元件,控制元件名稱為dbNote。

  ⑤:TDBComboBox元件,控制元件名稱為dbDriver。

  ⑥:TDBEdit元件,控制元件名稱為dbReturntime。

  ⑦:TDBEdit元件,控制元件名稱為dbStatus。

  ⑧:TPopupMenu元件,控制元件名稱為PopupMenuTaskDetail。

  ⑨:TTimer元件,控制元件名稱為Timer1。

  ⑩:TDBComboBox元件,控制元件名稱為dbCarNumber。

  (11):TDBEdit元件,控制元件名稱為dbTotalMileage。

  (12):TDBComboBox元件,控制元件名稱為dbCreator。

  (13):TPopupMenu元件,控制元件名稱為PopupMenuStatus。

  (14):TButton元件,控制元件名稱為btNewBill。

  (15):TButton元件,控制元件名稱為btnSaveTask。

  (16):TButton元件,控制元件名稱為btnDel。

  (17):TButton元件,控制元件名稱為btnCheckTask。

  (18):TButton元件,控制元件名稱為btnStatus。

  (19):TPageControl元件,控制元件名稱為PageControl1。

  (20):TButton元件,控制元件名稱為btnNewTask。

  (21):TButton元件,控制元件名稱為btnDelTask。

  (22):TRFDataSet元件,控制元件名稱為cdsTask。

  (23):TDataSource元件,控制元件名稱為dsTask。

  (24):TRFDataSet元件,控制元件名稱為cdsTaskDetail。

  (25):TDataSource元件,控制元件名稱為dsTaskDetail。

  (26):TButton元件,控制元件名稱為btnImportTask。

  (27):TDBGrid元件,控制元件名稱為DBGrid1。

  (28):TButton元件,控制元件名稱為Button1。

  • Frm001_01屬性設定

    • Caption:主窗體標題,設定為新建任務。
    • ClientHeight:窗體客戶區高度=644。
    • ClientWidth:窗體客戶區寬度=804。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm001_01。
  • Panel1屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=177。
  • Panel3屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alBottom。(底部對齊)
    • Height:設定控制元件高度=39。
  • ①dtDate屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為dtDate。
  • ②dbLeavetime屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為dbLeave。
    • DataField:設定控制元件對應的欄位名稱=Leavetime。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ③dbTaskNo屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為dbTaskNo。
    • DataField:設定控制元件對應的欄位名稱=TaskNo。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ④dbNote屬性設定

    • Height:設定控制元件高度=64。
    • Width:設定控制元件寬度=593。
    • Name:設定控制元件名稱為dbNote。
    • DataField:設定控制元件對應的欄位名稱=Note。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ⑤dbDriver屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbDriver。
    • DataField:設定控制元件對應的欄位名稱=Employee。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ⑥dbReturntime屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbReturntime。
    • DataField:設定控制元件對應的欄位名稱=Returntime。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ⑦dbStatus屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbStatus。
    • DataField:設定控制元件對應的欄位名稱=Status。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • ⑧PopupMenuTaskDetail屬性設定

    • Name:設定控制元件名稱為PopupMenuTaskDetail。
    • Items:設定功能表專案,雙擊該屬性或者點選屬性右側的[...]打開編輯器。點選新增按鈕新增如下專案。
  • ⑩dbCarNumber屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbCarNumber。
    • DataField:設定控制元件對應的欄位名稱=CarNumber。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • (11)dbTotalMileage屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbTotalMileage。
    • DataField:設定控制元件對應的欄位名稱=TotalMileage。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • (12)dbCreator屬性設定

    • Height:設定控制元件高度=21。
    • Width:設定控制元件寬度=129。
    • Name:設定控制元件名稱為dbCreator。
    • DataField:設定控制元件對應的欄位名稱=Creator。
    • DataSource:設定控制元件對應的數據源=dsTask。
  • (13)PopupMenuStatus屬性設定

    • Name:設定控制元件名稱為PopupMenuStatus。
    • Items:設定功能表專案,雙擊該屬性或者點選屬性右側的[...]打開編輯器。點選新增按鈕新增如下專案。
  • (14)btNewBill屬性設定

    • Height:設定控制元件高度=35。
    • Width:設定控制元件寬度=68。
    • Caption:設定控制元件字幕=新建。
    • Name:設定控制元件名稱為btNewBill。
  • (15)btnSaveTask屬性設定

    • Height:設定控制元件高度=35。
    • Width:設定控制元件寬度=68。
    • Caption:設定控制元件字幕=儲存。
    • Name:設定控制元件名稱為btnSaveTask。
  • (16)btnDel屬性設定

    • Height:設定控制元件高度=35。
    • Width:設定控制元件寬度=68。
    • Caption:設定控制元件字幕=刪除。
    • Name:設定控制元件名稱為btnDel。
  • (17)btnCheckTask屬性設定

    • Height:設定控制元件高度=35。
    • Width:設定控制元件寬度=68。
    • Caption:設定控制元件字幕=審覈。
    • Name:設定控制元件名稱為btnCheckTask。
  • (18)btnStatus屬性設定

    • Height:設定控制元件高度=65。
    • Width:設定控制元件寬度=136。
    • Caption:設定控制元件字幕=未審覈。
    • Name:設定控制元件名稱為btnStatus。
  • (19)PageControl1屬性設定

    • 在該控制元件中滑鼠右鍵點選[New Page]新增兩個界面,分別點選TabSheet,修改其中的Caption屬性為任務明細和情況彙報。
    • Align:設定對齊方式為alClient。(客戶區對齊)
  • (20)btnNewTask屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件字幕=新增明細。
    • Name:設定控制元件名稱為btnNewTask。
  • (21)btnDelTask屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件字幕=刪除明細。
    • Name:設定控制元件名稱為btnDelTask。
  • (22)cdsTask屬性設定

    • Name:設定控制元件名稱為cdsTask。
  • (23)dsTask屬性設定

    • Name:設定控制元件名稱為dsTask。
    • DataSet:設定數據集控制元件名稱為cdsTask。
  • (24)cdsTaskDetail屬性設定

    • Name:設定控制元件名稱為cdsTaskDetail。
  • (25)dsTaskDetail屬性設定

    • Name:設定控制元件名稱為dsTaskDetail。
    • DataSet:設定數據集控制元件名稱為cdsTaskDetail。
  • (26)btnImportTask屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件字幕=選擇明細。
    • Name:設定控制元件名稱為btnImportTask。
  • (27)DBGrid1屬性設定

    • 該控制元件位於PageControl1的任務明細標籤頁中。
    • Align:設定控制元件對齊方式=alClient。
    • DataSource:設定數據源控制元件為dsTaskDetail。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增8項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 TaskId / /
    2 TaskNo / /
    3 OrderNo 序號 35
    4 BillNo 相關單據 94
    5 BillName 單據型別 60
    6 Customer 業務單位 170
    7 Address 目的地 355
    8 Status 狀態 45
    • TaskId,TaskNo欄位的Visible屬性設定為False,即該欄位在表格列中不顯示。
  • (28)Button1屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=111。
    • Caption:設定控制元件字幕=從地圖中選擇地址。

# 4.2. 程式設計

# 4.2.1. 程式初始設定

  程式定義初始變數。

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

  設定下拉框的填充選項內容。

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

  設定程式啟動時配置連線並填充下拉框選項。

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

  更新任務單的狀態。

//任務單狀態
Procedure TMyHandler.Status;
begin
  if FThis.cdsTask.active then
  begin 
    if FThis.cdsTask.FieldByName('Status').asInteger = 0 then
       FThis.BtnStatus.Caption := '未審覈'    
    else if FThis.cdsTask.FieldByName('Status').asInteger = 1 then
       FThis.BtnStatus.Caption := '已審覈'
    else if FThis.cdsTask.FieldByName('Status').asInteger = 2 then
       FThis.BtnStatus.Caption := '已完成'
    else if FThis.cdsTask.FieldByName('Status').asInteger = 3 then
       FThis.BtnStatus.Caption := '已作廢';
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 4.2.2. 事件設定

  • (14)btNewBill-OnClick事件

  當點選[新建]按鈕時,新增單據。

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

  當數據集新增時,為新增的數據集賦值。

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

  點選[新增明細]按鈕,新增任務明細。

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

  點選[刪除明細]按鈕,刪除目前選擇的任務明細。

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

  點選[儲存]按鈕,儲存單據的修改。

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

  點選[從地圖中選擇地址],打開地圖界面,點選選擇地點。

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

  計時器的定時觸發事件,用於更新狀態與時間資訊。

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

  右鍵功能表用於更新狀態資訊,此處需將其中的MenuItem-OnClick事件指向同一個方法。

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

//任務明細狀態維護
procedure TMyHandler.MenuItemClick;
begin
  if not FThis.cdsTaskDetail.active then exit;
  if TMenuItem(Sender).Tag = 1 then
  begin     
    FThis.cdsTaskDetail.Edit;
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 0;
  end  
  else if TMenuItem(Sender).Tag = 3 then
  begin 
    FThis.cdsTaskDetail.Edit;  
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 0;
  end
  else if TMenuItem(Sender).Tag = 0 then
  begin 
    FThis.cdsTaskDetail.Edit;  
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 1;
  end
  else if TMenuItem(Sender).Tag = 2 then
  begin        
    FThis.cdsTaskDetail.Edit;
    FThis.cdsTaskDetail.FieldByName('Status').asInteger := 2;
  end;    
  btnSaveTaskClick(nil);
end;

...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
...
  this.MenuItem1.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem2.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem3.OnClick := FMyHandler.MenuItemClick;
  this.MenuItem4.OnClick := FMyHandler.MenuItemClick;
...
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  • (13)PopupMenuStatus-MenuItem-OnClick事件

  右鍵功能表用於更新狀態資訊。此處需將其中的MenuItem-OnClick事件指向同一個方法。

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

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

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
...
  this.MenuItem5.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem6.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem7.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem8.OnClick := FMyHandler.MenuItemStatusClick;
  this.MenuItem9.OnClick := FMyHandler.MenuItemStatusClick;
...
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  • (17)btnCheckTask-OnClick事件

  點選[審覈]按鈕,將單據修正爲審覈狀態。

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

  點選[刪除]按鈕,將單據刪除。

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

  點選[選擇明細]按鈕,打開明細選擇界面。

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

# 5. 地址選擇

  該界面顯示地圖,點選地圖上的地點以回傳對應的地址資訊。

# 5.1. 設計明細

地址選擇 UI佈局

  ①:TAMapView元件,控制元件名稱為AMapView1。

  ②:TPanel元件,控制元件名稱為plTop。

  ③:TRadioGroup元件,控制元件名稱為rgLang。

  ④:TPanel元件,控制元件名稱為plSatellite。

  ⑤:TCheckBox元件,控制元件名稱為ckTraffic。

  ⑥:TButton元件,控制元件名稱為btnMapQuery。

  ⑦:TTimer元件,控制元件名稱為Timer1。

  • Frm001_02屬性設定

    • Caption:主窗體標題,設定為地址選擇。
    • ClientHeight:窗體客戶區高度=640。
    • ClientWidth:窗體客戶區寬度=960。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm001_02。
  • Panel1屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alBottom。(底部對齊)
    • Height:設定控制元件高度=49。
  • ①AMapView1屬性設定

    • Align:設定對齊方式為alClient。
    • Key:設定用於顯示地圖地點資訊的金鑰,設定為3e20dffdda1288cf756ff92fb3556bbc。
  • ②plTop屬性設定

    • 該面板中包含了兩個標籤元件TLabel對應的控制元件lbJW與lbAddress。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=41。
    • Color:設定顯示的顏色=clGreen。
  • ③rgLang屬性設定

    • Height:設定控制元件高度=45。
    • Width:設定控制元件寬度=181。
    • Caption:設定單選組的標題為地圖語言。
    • Columns:設定單選組的列的數目=3。
    • Name:設定控制元件名稱為rgLang。
    • Items:設定單選的專案。雙擊該屬性或者點選屬性右側的[...]來打開選項編輯界面,編輯的內容如圖所示。
  • ④plSatellite屬性設定

    • Height:設定控制元件高度=36。
    • Width:設定控制元件寬度=41。
    • Caption:設定顯示的文字內容=衛星。
    • Color:設定面板顏色=clGreen。
    • Name:設定控制元件名稱為plSatellite。
  • ⑤ckTraffic屬性設定

    • Caption:設定顯示字幕內容=實時路況。
    • Name:設定控制元件名稱為ckTraffic。
  • ⑥btnMapQuery屬性設定

    • Caption:設定顯示的字幕內容=地圖查詢。
    • Name:設定控制元件名稱為btnMapQuery。
  • ⑦Timer1屬性設定

    • Interval:設定計時器觸發的時間間隔500。

# 5.2. 程式設計

# 5.2.1. 程式初始設定

  設定位置變數,用於儲存定位資訊。

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

  在程式啟動時,載入地圖資訊並載入地圖。

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

# 5.2.2. 事件設定

  • ③rgLang-OnClick事件

  點選地圖語言以切換地圖語言型別。

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

  點選[衛星](地圖型別)按鈕,切換地圖顯示的型別。

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

  點選[實時路況],系統將顯示目前的實時路況資訊。

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

  點選地圖,顯示對應的地址以及經緯度資訊。

procedure TMyHandler.AMapView1MapClickEvent;
var
 vAMapMarker:TCCAMapMarker;
begin
  FPos:=APos;   
  FThis.lbJW.Caption := FloatToStr(APos.Longitude)+','+ FloatToStr(APos.Latitude);  
  FThis.TagString := '';
  //TCCAMapLngLat與TCCLngLat型別不匹配
  paxfunc.GetMarkerAddress(FThis.AMapView1,APos,FThis);      
  FThis.AMapView1.Markers.Clear;
  vAMapMarker := paxfunc.AddMarker(FThis.AMapView1); 
    if FThis.AMapView1.MapLoadCompleted then
	begin  
	  with vAMapMarker do
	  begin
		Title := FThis.TagString;
		Position.Longitude := APos.Longitude;
		Position.Latitude := APos.Latitude;
		// 設定了Content屬性Icon屬性失效。要自定義豐富的標記就用Content屬性吧
		Content:='<div>';
		Content:=Content+
		  '<image src="http://webapi.amap.com/theme/v1.3/markers/n/mark_r.png"></image>';
	   //Content:=Content+'<span style="white-space: nowrap;border:1px solid #fff;background-color:#ff0000;font-size: 12px;color:white;  padding: 4px 10px;">'+FThis.TagString+'</span>';
		// 圖片19   x   31   pixels
		Content:=Content+'</div>'; // 必須有根div元素 不然縮放時圖示位置不會更新
		draw;
	  end; 
    end;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  • ⑦Timer1-OnTimer事件

  定時觸發,用於更新地址資訊。

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

  點選[地圖查詢]按鈕,顯示出發點與目的地的輸入框,輸入相應的內容點選搜索框進行查詢。

procedure TMyHandler.btnMapQueryClick;
begin
  with FThis.AMapView1.AdvancedInfoWindows[0] do
  begin
        AsOrigin:=true;//帶:從這裡出發輸入框
        AsDestination:= true;//帶:到這裡去輸入框
        PlaceSearch:=true;//帶:在附近搜索框
        show;
  end; 
end;
1
2
3
4
5
6
7
8
9
10

# 6. 單據選擇

  該界面顯示可供發貨的貨物列表。點選選擇需要發貨的貨品。

# 6.1. 設計明細

單據選擇 UI佈局

  ①:TDateTimePicker元件,控制元件名稱為edtDate1。

  ②:TDateTimePicker元件,控制元件名稱為edtDate2。

  ③:TEdit元件,控制元件名稱為edtBillNo。

  ④:TButton元件,控制元件名稱為btQuery。

  ⑤:TTimer元件,控制元件名稱為Timer1。

  ⑥:TButton元件,控制元件名稱為btnImportTask。

  ⑦:TRFDataSet元件,控制元件名稱為cdsTask。

  ⑧:TDataSource元件,控制元件名稱為dsTask。

  ⑨:TDBGrid元件,控制元件名稱為DBGrid1。

  • Frm001_03屬性設定

    • Caption:主窗體標題,設定為單據選擇。
    • ClientHeight:窗體客戶區高度=640。
    • ClientWidth:窗體客戶區寬度=960。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm001_03。
  • plTop屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=37。
    • Name:設定控制元件名稱為plTop。
  • Panel1屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alClient。(客戶區對齊)
  • ①edtDate1屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
    • Name:設定控制元件名稱為edtDate1。
  • ②edDate2屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為edtDate2。
  • ③edtBillNo屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=157。
    • Name:設定控制元件名稱為edtBillNo。
  • ④btQuery屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=查詢。
    • Name:設定控制元件名稱為btQuery。
  • ⑥btnImportTask屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=匯入任務。
    • Name:設定控制元件名稱為btnImportTask。
  • ⑦cdsTask屬性設定

    • Name:設定控制元件名稱為cdsTask。
  • ⑧dsTask屬性設定

    • Name:設定控制元件名稱為dsTask。
    • DataSet:設定數據集控制元件名稱為cdsTask。
  • ⑨DBGrid1屬性設定

    • 該控制元件位於Panel1中。
    • Align:設定控制元件對齊方式=alClient。
    • DataSource:設定數據源控制元件為dsTaskDetail。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增6項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 FDate 單據日期 73
    2 FBillNo 單據號 113
    3 FBillName 單據型別 73
    4 FCustName 客商名稱 128
    5 FEmpName 業務員 46
    6 FAddress 目的地 506

# 6.2. 程式設計

# 6.2.1. 程式初始設定

  設定初始連線設定,格式化日期為最近十天。

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

# 6.2.2. 事件設定

  • ④btQuery-OnClick事件

  點選[查詢]按鈕,獲取查詢結果。

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

  計時器定時觸發,重新整理查詢結果。

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

  點選[匯入任務]按鈕,將目前選擇的任務匯入至任務編輯界面。

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

# 7. 路線監控

  該界面用於顯示車輛位置形成的軌跡路線。

# 7.1. 設計明細

路線監控 UI佈局

  ①:TDateTimePicker元件,控制元件名稱為edtDate1。

  ②:TDateTimePicker元件,控制元件名稱為edtDate2。

  ③:TEdit元件,控制元件名稱為edtDriver。

  ④:TButton元件,控制元件名稱為btQuery。

  ⑤:TTimer元件,控制元件名稱為Timer1。

  ⑥:TRFDataSet元件,控制元件名稱為cdsTask。

  ⑦:TDataSource元件,控制元件名稱為dsTask。

  ⑧:TDBGrid元件,控制元件名稱為DBGrid1。

  ⑨:TButton元件,控制元件名稱為btnRoutetrack。

  ⑩:TButton元件,控制元件名稱為btnStart。

  (11):TButton元件,控制元件名稱為btnResumeMove。

  (12):TButton元件,控制元件名稱為btnStop。

  (13):TAMapView元件,控制元件名稱為AMapView1。

  • Frm002屬性設定

    • Caption:主窗體標題,設定為路線監控。
    • ClientHeight:窗體客戶區高度=733。
    • ClientWidth:窗體客戶區寬度=1010。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm002。
  • plTop屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=37。
    • Name:設定控制元件名稱為plTop。
  • Panel1屬性設定

    • 該控制元件對應的元件為TPanel。
    • Align:設定控制元件對齊方式=alClient。
  • Panel2屬性設定

    • 該控制元件在Panel1中,對應的元件為TPanel。
    • Align:設定控制元件對齊方式=alClient。
  • Panel3屬性設定

    • 該控制元件在Panel2中,對應的元件為TPanel。
    • Align:設定控制元件對齊方式=alBottom。
    • Height:設定控制元件高度=41。
  • ①edtDate1屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
    • Name:設定控制元件名稱為edtDate1。
  • ②edDate2屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為edtDate2。
  • ③edtDriver屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=229。
    • Name:設定控制元件名稱為edtDriver。
  • ④btQuery屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=查詢。
    • Name:設定控制元件名稱為btQuery。
  • ⑥cdsTask屬性設定

    • Name:設定控制元件名稱為cdsTask。
  • ⑦dsTask屬性設定

    • Name:設定控制元件名稱為dsTask。
    • DataSet:設定數據集控制元件名稱為cdsTask。
  • ⑧DBGrid1屬性設定

    • 該控制元件位於Panel1中。
    • Align:設定對齊方式=alLeft。(左對齊)
    • DataSource:設定數據源控制元件為dsTask。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增10項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 TaskId / /
    2 TaskNo 任務單號 87
    3 Date 任務日期 111
    4 Employee 員工 49
    5 CarNumber 車牌號 74
    6 Leavetime 離廠時間 142
    7 Returntime 返廠時間 156
    8 Creator 建立人 108
    9 TotalMileage 總里程 94
    10 Status 狀態 45
    • TaskId欄位的Visible屬性設定為False,即該欄位在表格列中不顯示。
  • ⑨btnRoutetrack屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示字幕內容=路線軌跡。
    • Name:設定控制元件名稱為btnRoutetrack。
  • ⑩btnStart屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示字幕內容=暫停移動。
    • Name:設定控制元件名稱為btnStart。
  • (11)btnResumeMove屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示字幕內容=繼續移動。
    • Name:設定控制元件名稱為btnResumeMove。
  • (12)btnStop屬性設定

    • Height:設定控制元件高度=29。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示字幕內容=結束移動。
    • Name:設定控制元件名稱為btnStop。
  • (13)AMapView1屬性設定

    • 該控制元件位於Panel2中。
    • Align:設定對齊方式=alClient(客戶區對齊)。

# 7.2. 程式設計

# 7.2.1. 程式初始設定

  新增兩個子程式。用於增加移動軌跡以及經過的折線圖。

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

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

  APolyline.Draw;
end;

//新增行經點的路線折線圖
procedure TMyHandler.AddPassedPolyline;
begin
  with FThis.AMapView1.Polylines.Add do
  begin
    //StrokeColor:=TColorRec.Red;
    draw;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

  在程式啟動時,設定數據集連線配置,初始化日期為近十天,載入地圖。

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

# 7.2.2. 事件設定

  • ④btQuery-OnClick事件

  點選[查詢]按鈕,重新整理數據顯示。

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

  計時器定時觸發事件,用於重新整理表格數據。

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

  點選[路線軌跡],在地圖上顯示車輛的路徑軌跡。

procedure TMyHandler.btnRoutetrackClick;
var
 vAMapMarker:TCCAMapMarker;  
begin
  //全部清空
  FThis.AMapView1.Markers.Clear; 
  FThis.AMapView1.Polylines.Clear; 
  
  // 新增車輛(marker)  
  vAMapMarker := paxfunc.AddMarker(FThis.AMapView1);
  with vAMapMarker do
  begin      
    Position.Longitude := FThis.AMapView1.Options.center.Longitude;
    Position.Latitude := FThis.AMapView1.Options.center.Latitude;
    Offset.X:=-26;
    Offset.Y:=-13;
    Icon.Image := 'http://webapi.amap.com/images/car.png';   
    AutoRotation := true; //車輛根據線路方向自動旋轉
    Clickable:=true;
    draw;
  end;
  // 新增路徑
  AddMovePath;
  //新增已經路過的路徑(無需設定路徑:點集合為空)
  AddPassedPolyline;
  //
  FThis.AMapView1.FitView;
  //開始移動  
  FThis.AMapView1.Markers[0].MoveAlong(FThis.AMapView1.Polylines[0],FThis.AMapView1.Polylines[1],3000);//單位是500千米每小時
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  • ⑩btnStart-OnClick事件

  點選[暫停移動],暫時停止對車輛的追蹤。

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

  點選[繼續移動],繼續進行車輛位置追蹤。

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

  點選[結束移動]按鈕,停止移動並清空路線軌跡。

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

# 8. 報表管理

  該界面可顯示程式使用的相關報表。

# 8.1. 設計明細

  ①:TDateTimePicker元件,控制元件名稱為edtDate1。

  ②:TDateTimePicker元件,控制元件名稱為edtDate2。

  ③:TEdit元件,控制元件名稱為edtDriver。

  ④:TEdit元件,控制元件名稱為edtCarNumber。

  ⑤:TButton元件,控制元件名稱為btQuery。

  ⑥:TRFDataSet元件,控制元件名稱為cdsTask。

  ⑦:TDataSource元件,控制元件名稱為dsTask。

  ⑧:TRFDataSet元件,控制元件名稱為cdsEmpCount。

  ⑨:TDataSource元件,控制元件名稱為dsEmpCount。

  ⑩:TRFDataSet元件,控制元件名稱為cdsCustCount。

  (11):TDataSource元件,控制元件名稱為dsCustCount。

  (12):TDBGrid元件,控制元件名稱為DBGrid1。

  (13):TDateTimePicker元件,控制元件名稱為DateTimePicker1。

  (14):TDateTimePicker元件,控制元件名稱為DateTimePicker2。

  (15):TButton元件,控制元件名稱為Button1。

  (16):TDBChart元件,控制元件名稱為DBChart1。

  (17):TDateTimePicker元件,控制元件名稱為edtDate3。

  (18):TDateTimePicker元件,控制元件名稱為edtDate4。

  (19):TButton元件,控制元件名稱為Button2。

  (20):TDBChart元件,控制元件名稱為DBChart2。

  • Frm003屬性設定

    • Caption:主窗體標題,設定為報表管理。
    • ClientHeight:窗體客戶區高度=748。
    • ClientWidth:窗體客戶區寬度=977。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm003。
  • PageControl1屬性設定

    • 該控制元件對應的元件為TPageControl。
    • 在界面中右鍵點選[New Page],新增三個頁面,其ActivePage.Caption分別命名為Inspector,Object Tree,Tool Palette。
    • Align:設定對齊方式為alClient(客戶區對齊)。
    • TabPosition:設定標籤頁面顯示的位置為tpBottom(底部)。
  • plTop屬性設定

    • 該控制元件位於TabSheet1中,為TPanel元件。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=37。
    • Name:設定控制元件名稱為plTop。
  • Panel1屬性設定

    • 該控制元件位於TabSheet2中,為TPanel元件。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=37。
  • Panel2屬性設定

    • 該控制元件位於TabSheet3中,為TPanel元件。
    • Align:設定對齊方式=alTop。(頂部對齊)
    • Height:設定控制元件高度=37。
  • ①edtDate1屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
    • Name:設定控制元件名稱為edtDate1。
  • ②edDate2屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為edtDate2。
  • ③edtDriver屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=149。
    • Name:設定控制元件名稱為edtDriver。
  • ④edtCarNumber屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=153。
    • Name:設定控制元件名稱為edtCarNumber。
  • ⑤btQuery屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=查詢。
    • Name:設定控制元件名稱為btQuery。
  • ⑥cdsTask屬性設定

    • Name:設定控制元件名稱為cdsTask。
  • ⑦dsTask屬性設定

    • Name:設定控制元件名稱為dsTask。
    • DataSet:設定數據集控制元件名稱為cdsTask。
  • ⑧cdsEmpCount屬性設定

    • Name:設定控制元件名稱為cdsEmpCount。
  • ⑨dsEmpCount屬性設定

    • Name:設定控制元件名稱為dsEmpCount。
    • DataSet:設定數據集控制元件名稱為cdsEmpCount。
  • ⑩cdsCustCount屬性設定

    • Name:設定控制元件名稱為cdsCustCount。
  • (11)dsCustCount屬性設定

    • Name:設定控制元件名稱為dsCustCount。
    • DataSet:設定數據集控制元件名稱為cdsCustCount。
  • (12)DBGrid1屬性設定

    • 該控制元件位於TabSheet1中。
    • Align:設定對齊方式=alClient。(客戶區對齊)
    • DataSource:設定數據源控制元件為dsTask。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增10項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 TaskId / /
    2 TaskNo 任務單號 87
    3 Date 任務日期 111
    4 Employee 員工 49
    5 CarNumber 車牌號 74
    6 Leavetime 離廠時間 141
    7 Returntime 返廠時間 156
    8 Creator 建立人 108
    9 TotalMileage 總里程 94
    10 Status 狀態 45
    • TaskId欄位的Visible屬性設定為False,即該欄位在表格列中不顯示。
  • (13)DateTimePicker1屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
  • (14)DateTimePicker2屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
  • (15)Button1屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=查詢。
  • (16)DBChart1屬性設定

    • 該控制元件位於TabSheet2中。
    • Align:設定控制元件對齊方式=alClient(客戶區對齊)。
    • 右鍵點選該控制元件,選擇[編輯圖表],打開圖表編輯器,在圖表編輯界面點選[新增...]新增系列。
    • 在彈出的選擇器中選擇棒形圖,點選[確定]。
    • 返回至編輯界面,選擇新建立的Series1,在[資料來源]中選擇資料組,選擇對應的數據集名稱cdsEmpCount,點選右側的[套用]按鈕(該過程由於未在設計模式下連線資料庫,可能會出現報錯提示,屬於正常現象)。按找圖示內容填寫卷標與長條內容。
    • 在軸中,修改左軸與下軸的標題。
    • 在標題中修改圖表標題。
  • (17)edtDate3屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=130。
    • Name:設定控制元件名稱為edtDate3。
  • (18)edtDate4屬性設定

    • Height:設定控制元件高度=26。
    • Width:設定控制元件寬度=126。
    • Name:設定控制元件名稱為edtDate4。
  • (19)Button2屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=查詢。
  • (20)DBChart2屬性設定

    • 該控制元件位於TabSheet3中。
    • Align:設定控制元件對齊方式=alClient(客戶區對齊)。
    • 右鍵點選該控制元件,選擇[編輯圖表],打開圖表編輯器,在圖表編輯界面點選[新增...]新增系列。
    • 在彈出的選擇器中選擇棒形圖,點選[確定]。
    • 返回至編輯界面,選擇新建立的Series1,在[資料來源]中選擇資料組,選擇對應的數據集名稱cdsCustCount,點選右側的[套用]按鈕(該過程由於未在設計模式下連線資料庫,可能會出現報錯提示,屬於正常現象)。按找圖示內容填寫卷標與長條內容。
    • 在軸中,修改左軸與下軸的標題。
    • 在標題中修改圖表標題。

# 8.2. 程式設計

# 8.2.1. 程式初始設定

  在程式啟動時,將時間設定為近期十天。

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

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

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

# 8.2.2. 事件設定

  • ⑤btQuery-OnClick事件

  點選Inspector標籤頁中的[查詢]按鈕,檢視報表內容。

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

  點選Object Tree中的[查詢]按鈕,打開員工出勤次數分析表。

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

  點選Tool Palette中的[查詢]按鈕,打開客戶送達次數分析表。

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

# 9. 資料維護

  該界面為基礎資料編輯界面,包含車輛資訊與駕駛員資訊等相關內容。

# 9.1. 設計明細

  ①:TDBGrid元件,控制元件名稱為DBGrid1。

  ②:TRFDataSet元件,控制元件名稱為cdsCar。

  ③:TDataSource元件,控制元件名稱為dsCar。

  ④:TRFDataSet元件,控制元件名稱為cdsEmployee。

  ⑤:TDataSource元件,控制元件名稱為dsEmployee。

  ⑥:TButton元件,控制元件名稱為btnSave。

  ⑦:TDBGrid元件,控制元件名稱為DBGrid2。

  • Frm004屬性設定

    • Caption:主窗體標題,設定為資料維護。
    • ClientHeight:窗體客戶區高度=591。
    • ClientWidth:窗體客戶區寬度=726。
    • FormStyle:設定窗體顯示的樣式=fsStayOnTop。
    • Name:設定窗體名稱=Frm004。
  • PageControl1屬性設定

    • 該控制元件對應的元件為TPageControl。
    • 在界面中右鍵點選[New Page],新增兩個頁面,其ActivePage.Caption分別命名為車輛資訊,駕駛員資訊。
    • Align:設定對齊方式=alTop(頂部對齊)。
    • Height:設定控制元件高度=555。
  • ①DBGrid1屬性設定

    • 該控制元件位於TabSheet1中。
    • Align:設定對齊方式=alClient。(客戶區對齊)
    • DataSource:設定數據源控制元件為dsCar。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增7項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 CarNumber 車牌號 104
    2 CarName 車輛名稱 98
    3 Weight 車輛載重 61
    4 Driver 駕駛員 84
    5 MaintenanceCycle 保養週期(天) 76
    6 LastMaintenanceDate 最近保養日期 122
    7 MaintenanceDate 保養日期 129
  • ②cdsCar屬性設定

    • Name:設定控制元件名稱為cdsCar。
  • ③dsCar屬性設定

    • Name:設定控制元件名稱為dsCar。
    • DataSet:設定數據集控制元件名稱為cdsCar。
  • ④cdsEmloyee屬性設定

    • Name:設定控制元件名稱為cdsEmloyee。
  • ⑤dsEmloyee屬性設定

    • Name:設定控制元件名稱為dsEmloyee。
    • DataSet:設定數據集控制元件名稱為cdsEmloyee。
  • ⑥btnSave屬性設定

    • Height:設定控制元件高度=27。
    • Width:設定控制元件寬度=75。
    • Caption:設定控制元件顯示的字幕內容=儲存。
    • Name:設定控制元件名稱為btnSave。
  • ⑦DBGrid2屬性設定

    • 該控制元件位於TabSheet2中。
    • Align:設定對齊方式=alClient。(客戶區對齊)
    • DataSource:設定數據源控制元件為dsEmployee。
    • Columns:設定表格列欄位內容。雙擊該屬性或者點選屬性右側的[...]打開欄位編輯器,點選左上角的按鈕新增7項欄位內容,分別修改如下屬性內容。
    序號 欄位名稱FieldName 表頭名稱Title.Caption 表格列寬Width
    1 Employee 駕駛員 72
    2 CarNumber 車牌號 106
    3 Position 職務 72
    4 TelPhone 手機號碼 161
    5 Note 備註 266

# 9.2. 程式設計

# 9.2.1. 程式初始設定

  在程式啟動時,設定資料庫連線並打開表格。

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

# 9.2.2. 事件設定

  • ⑥btnSave-OnClick事件

  點選[儲存]按鈕,儲存對基礎資料的修改。

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

# 10. 運行結果

  通過工具欄儲存,將程式儲存為 sdb 專案檔案。

  使用滑鼠點選工具欄運行(Run),測試運行結果。

  主界面顯示地圖相關資訊,底下[地圖語言]欄位顯示目前選擇的地圖語言資訊,點選即可切換成對應的地圖語言。點選[衛星]字樣的按鈕,可在普通與衛星之間切換,同時地圖型別也會相應切換。[實時路況]如果勾選則會顯示實時路況資訊,點選[地圖查詢]進入到地圖查詢界面。點選[測距]可使用地圖直尺功能進行距離測量。點選[結束繪製]結束測量並清空螢幕上的測量記錄。

  點選[資料維護],打開資料維護界面,在該界面中可以更新車輛資訊以及駕駛員資訊,按下↓方向鍵新增行,在行中輸入車輛資訊以及駕駛員資訊等內容。

地圖及定位
溫濕度採集與控制

← 地圖及定位 溫濕度採集與控制→

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