258

Click here to load reader

Giao trinh Lap trinh can ban B – Delphi 7

Embed Size (px)

Citation preview

Page 1: Giao trinh Lap trinh can ban B – Delphi 7

TRƯỜNG Đ I HỌC CẦN THƠ

KHOA CÔNG NGHỆ THÔNG TIN & TRUY N THÔNG

Giáo trình lý thuy t

LẬP TRÌNH CĂN BẢN B MSMH: TN035

(Áp d ng cho ch ng trình tín chỉ)

Biên so n: ThS. VŨ DUY LINH

ThS. NGUYỄN NHỊ GIA VINH

ThS. LÊ THỊ DIỄM

Năm 2010

Page 2: Giao trinh Lap trinh can ban B – Delphi 7
Page 3: Giao trinh Lap trinh can ban B – Delphi 7

Bộ môn Tin H c ng Dụng – Khoa Khoa H c Tự Nhiên – Tr ng ĐHCT Trang i

M C L C

CảƯ NẢ 1: D LẤ U VÀ TảUẬT TOÁN ................................................................ 1

I. Dữ liệu và thông tin: ............................................................................................. 1

I.1. Khái niệm ....................................................................................................... 1

I.2. Sơ đồ tổng quát c a một quá trình xử lý thông tin......................................... 1

II. Từ bài toán t i ch ơng trình ................................................................................ 1

II.1. Các giai đoạn giải một bài toán trên máy tính điện tử .................................. 1

II.2. Thuật toán (Algorithm) ................................................................................. 2

CảƯ NẢ 2: BORLAND DELPHI ............................................................................. 5

I. Tổng quan v Delphi ............................................................................................. 5

I.1. Delphi là gì ..................................................................................................... 5

I.2. Các phiên bản c a Delphi .............................................................................. 5

II. Môi tr ng phát tri n tích hợp (IDE) c a Delphi ................................................ 5

II.1. Cửa sổ chính c a Delphi ............................................................................... 6

II.2. Thanh thực đơn chính và thanh công cụ ....................................................... 6

II.3. Bảng ch a các thành phần c a Delphi (Component Palette) ....................... 7

II.4. Cửa sổ thiết kế bi u mẫu (Form Designer) và Cửa sổ soạn thảo mư lệnh (Code Editor) ................................................................................................. 8

II.5. Cửa sổ thuộc tính và sự kiện c a đ i t ợng (Object Inspector) ................... 9

II.6. Cửa sổ liệt kê các đ i t ợng dạng cây (Object TreeView) ......................... 10

III. Cấu trúc một dự án Delphi ............................................................................... 10

III.1. Tập tin dự án: (Delphi project file) ........................................................... 10

III.2. Các tập tin ch a mư lệnh (Unit file) .......................................................... 11

III.3. Các tập tin đặc tả bi u mẫu (Form file) ..................................................... 11

III.4. Các tập tin tài nguyên (Windows Resource File) ...................................... 13

IV. Các thao tác cơ bản trên Delphi ....................................................................... 14

IV.1. M một dự án m i ..................................................................................... 14

IV.2. L u dự án .................................................................................................. 14

IV.3. L u Form (tập tin unit) v i tên khác ......................................................... 18

IV.4. L u dự án v i tên khác.............................................................................. 18

IV.5. Đóng dự án ................................................................................................ 18

IV.6. Thoát kh i Delphi ..................................................................................... 18

CảƯ NẢ 3: CÁC TảÀNả PảẦN C B N CỦA NẢÔN NẢ DELPảẤ (OBJECT PASCAL) ............................................................................................. 19

I. Bộ chữ viết ......................................................................................................... 19

II. Từ khóa .............................................................................................................. 19

III. Tên danh hiệu tự đặt ......................................................................................... 20

IV. Hằng ................................................................................................................. 20

IV.1. Khái niệm .................................................................................................. 20

IV.2. Hằng tr ...................................................................................................... 20

Page 4: Giao trinh Lap trinh can ban B – Delphi 7

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT ii

IV.3. Hằng đ nh ki u: ......................................................................................... 21

V. Ki u (Type) ........................................................................................................ 21

V.1. Ð nh nghĩa .................................................................................................. 21

V.2. Cách khai báo ............................................................................................. 21

VI. Biến .................................................................................................................. 22

VII. Bi u th c ......................................................................................................... 22

VII.1. Đ nh nghĩa ................................................................................................ 22

VII.2. Th tự u tiên........................................................................................... 22

VIII. Chuy n ki u (Typecast) ................................................................................. 23

IX. L i chú thích và các chỉ dẫn biên d ch ............................................................. 24

X. Cấu trúc một dự án chế độ Form (Form Application) .................................... 25

CảƯ NẢ 4: CÁC KẤ U D LẤ U S C P CảUẨN, L Nả Đ N ....................... 26

I. Các ki u dữ liệu sơ cấp (Simple type) ................................................................ 26

I.1. Ki u s nguyên (Integer) .............................................................................. 26

I.2. Ki u ký tự (Char) ......................................................................................... 26

I.3. Ki u s thực (Real type)............................................................................... 30

I.4. Ki u logic (Boolean) .................................................................................... 34

II. Câu lệnh (statement) .......................................................................................... 34

III. Lệnh đơn (Simple statement) ........................................................................... 35

IV. Lệnh gán (Assignment statement) .................................................................... 35

V. Lệnh g i th tục và hàm .................................................................................... 35

VI. Lệnh Goto ......................................................................................................... 37

CảƯ NẢ 5: LẬP TRÌNả X LÝ SỰ KẤ N – CÁC TảÀNả PảẦN TRONẢ ẢẤAO DẤ N DELPảẤ .................................................................................... 38

I. Lập trình xử lý sự kiện ........................................................................................ 38

I.1. L p (Class) và đ i t ợng (Object) ............................................................... 38

I.2. Thuộc tính .................................................................................................... 43

I.3. Ph ơng th c (Method) ................................................................................. 44

I.4. Sự kiện (Event)............................................................................................. 44

I.5. Xử lý sự kiện (Event Handlers) .................................................................... 45

I.6. Trình hỗ trợ mư lệnh (Code Completion /IntelliSense) ................................ 46

II. Sinh mư tự động và một s cách sửa lỗi ............................................................ 46

II.1. Cách tự động sinh mư (generate code) trong Delphi ................................. 46

II.2. Cách sửa lỗi sinh mư trong Delphi ............................................................. 49

II.3. Thêm tập tin unit vào dự án ........................................................................ 54

II.4. Viết lệnh sau khi thêm unit form vào dự án................................................ 58

II.5. Gỡ b tập tin unit form ra kh i dự án ......................................................... 62

III. Bi u mẫu (TForm) ............................................................................................ 62

IV. Các thành phần (Component) giao diện phổ biến ............................................ 68

IV.1. Nhãn (TLabel) ........................................................................................... 68

IV.2. Hộp văn bản (TEdit) .................................................................................. 71

Page 5: Giao trinh Lap trinh can ban B – Delphi 7

Bộ môn Tin H c ng Dụng – Khoa Khoa H c Tự Nhiên – Tr ng ĐHCT Trang iii

IV.3. Nút lệnh (TButton) .................................................................................... 78

IV.4. Nhưn và Hộp nhập (TLabeledEdit) ........................................................... 80

IV.5. Hộp đánh dấu hay hộp ki m (TCheckbox) ............................................... 81

IV.6. Nút tùy ch n (TRadioButton) ................................................................... 87

IV.7. Nhóm tùy ch n (TRadioGroup) ................................................................ 88

IV.8. Vùng văn bản (TMemo) ............................................................................ 91

IV.9. Hộp danh sách (TListBox) ........................................................................ 96

IV.10. TSpinEdit .............................................................................................. 100

IV.11. Hộp danh sách đánh dấu (TCheckListBox) .......................................... 101

IV.12. Hộp danh sách các khoá (TValueListEditor) ........................................ 107

IV.13. Hộp liệt kê thả (TComboBox)............................................................... 113

IV.14. L i chuỗi (TStringGrid) ...................................................................... 118

IV.15. Bảng ch a các thành phần (TPanel) ...................................................... 124

IV.16. Thanh thực đơn chính (TMainMenu) .................................................... 125

IV.17. Thực đơn (TMenuItem) ........................................................................ 126

IV.18. Menu đ i t ợng (TPopupMenu) ........................................................... 134

CảƯ NẢ 6: CÁC L Nả CÓ C U TRÚC ............................................................. 138

I. Lệnh ghép (Compound statement) .................................................................... 138

II. Lệnh cấu trúc rẽ nhánh .................................................................................... 138

II.1. Lệnh if ... then ... và lệnh if ... then ... else................................................ 138

II.2. Lệnh Case ... of ......................................................................................... 146

III. Cấu trúc lệnh lặp............................................................................................. 149

III.1. Lệnh lặp có s lần xác đ nh tr c ........................................................... 149

III.2. Lệnh lặp có s lần không xác đ nh tr c ................................................ 155

CảƯ NẢ 7: CảƯ NẢ TRÌNả CON .................................................................... 164

I. Khái niệm .......................................................................................................... 164

II. Hàm.................................................................................................................. 165

III. Th tục ............................................................................................................ 172

IV. Truy n tham s ............................................................................................... 175

IV.1. Đ nh ki u và không đ nh ki u cho tham s hình th c ............................. 175

IV.2. Truy n bằng tham tr (Value parameter) ................................................. 177

IV.3. Truy n bằng tham biến (Variable parameter) ......................................... 179

IV.4. Truy n bằng tham s hằng (Constant parameter) ................................... 181

IV.5. Truy n bằng tham s xuất (Out parameter) ............................................ 184

V. Ch ơng trình con đệ quy ................................................................................. 190

CảƯ NẢ 8: KẤ U LẤ T KÊ, MẤỀN CON, TẬP ảỢP .......................................... 194

I. Ki u vô h ng liệt kê (Enumerated scalar type) .............................................. 194

I.1. Khái niệm ................................................................................................... 194

I.2. Cách khai báo: Có hai cách khai báo là gián tiếp và trực tiếp ................... 194

I.3. Một s hàm chuẩn áp dụng cho ki u vô h ng ......................................... 195

Page 6: Giao trinh Lap trinh can ban B – Delphi 7

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT iv

II. Ki u mi n con (Subrange types) ...................................................................... 196

II.1. Khái niệm .................................................................................................. 196

II.2. Cách khai báo ............................................................................................ 196

III. Ki u tập hợp (Set) ........................................................................................... 197

III.1. Khái niệm ................................................................................................ 197

III.2. Cách khai báo .......................................................................................... 197

III.3. Mô tả tập hợp ........................................................................................... 198

III.4. Một s phép toán trên ki u tập hợp ......................................................... 198

CảƯ NG 9: KẤ U M NẢ ..................................................................................... 208

I. Khái niệm v mảng (Array-type data) .............................................................. 208

II. Mảng tĩnh (Static array) ................................................................................... 208

II.1. Mảng một chi u (One-Dimensional array) ............................................... 208

II.2. Mảng nhi u chi u (Multi-Dimensional array) .......................................... 213

II.3. Mảng hai chi u .......................................................................................... 215

III. Mảng động (Dynamic array) .......................................................................... 222

III.1. Mảng động một chi u ............................................................................. 222

III.2. Mảng động nhi u chi u ........................................................................... 227

III.3. Hằng mảng ............................................................................................... 228

CảƯ NẢ 10: KẤ U CảUỖẤ KÝ TỰ ...................................................................... 229

I. Các loại chuỗi ký tự trong Object Pascal .......................................................... 229

I.1. Chuỗi ngắn (ShortString) ........................................................................... 229

I.2. Chuỗi dài 1 byte (AnsiString) .................................................................... 230

I.3. Chuỗi dài 2 byte (WideString) ................................................................... 232

II. Các thao tác trên chuỗi ..................................................................................... 232

II.1. Phép toán cộng chuỗi ................................................................................ 232

II.2. Phép toán so sánh ...................................................................................... 232

II.3. Các th tục và hàm chuẩn xử lý chuỗi ký tự ............................................. 234

PảỤ LỤC........ ......................................................................................................... 246

TÀẤ LẤ U TảAM Kả O .......................................................................................... 252

B N QUYỀN TÁC ẢẤ ............................................................................................ 252

Page 7: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 1: Dữ liệu và Thuật toán

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 1

CH NG 1: D LI U VẨ THU T TOÁN

I. D li u vƠ thông tin:

I.1. Khái ni m

Dữ liệu (Data) là các sự kiện không có cấu trúc, không có ý nghĩa rõ ràng tại th i đi m xét.

Thông tin (Information) là một khái niệm trừu t ợng đ ợc th hiện qua các thông báo, các bi u hiện,... đem lại một nhận th c ch quan cho một đ i t ợng nhận tin. Thông tin là dữ liệu đư đ ợc xử lý xong, mang ý nghĩa rõ ràng tại th i đi m xét.

Một hệ th ng thông tin (Information system) là một tiến trình ghi nhận dữ liệu, xử lý nó và cung cấp tạo nên dữ liệu m i có ý nghĩa thông tin, liên quan một phần đến một tổ ch c, đ trợ giúp các hoạt động liên quan đến tổ ch c.

I.2. S đồ t ng quát c a một quá trình x lỦ thông tin

M i quá trình xử lý thông tin bằng máy tính hay bằng con ng i đ u đ ợc thực hiện theo một quy trình sau:

Dữ liệu đ ợc nhập đầu vào (Input). Máy tính hay con ng i sẽ thực hiện quá trình xử lý nào đó đ nhận đ ợc thông tin đầu ra (Output).

Hình 1: Mô hình tổng quát quá trình xử lý thông tin

II. T bƠi toán tới ch ng trình

Trong cuộc s ng, chúng ta có rất nhi u bài toán cần phải giải quyết. Sử dụng máy tính điện tử đ giải các bài toán là đi u rất hiệu quả do khả năng tính toán c a máy tính. Đ máy tính có th hi u đ ợc, chúng ta cần phải có những b c giải cụ th c a bài toán một cách đúng logic, từ đó sử dụng một ngôn ngữ ch ơng trình hay phần m m lập trình đ h ng dẫn máy tính thực hiện các thao tác cần thiết đ tìm ra kết quả c a bài toán.

II.1. Các giai đo n gi i một bƠi toán trên máy tính đi n t Ð giải quyết một bài toán trên máy tính điện tử, cần qua các giai đoạn sau:

- Tìm hi u mục tiêu chính c a bài toán: dữ liệu nhập vào và kết quả xuất.

- Xây dựng một chuỗi thao tác tính toán theo một th tự logic, g i là thuật giải.

- Lập ch ơng trình diễn tả chi tiết các b c tính theo thuật giải.

- Nhập ch ơng trình vào máy tính, thông d ch và chạy thử đ sửa chữa lỗi.

- Thực hiện giải bài toán v i s liệu thu thập đ ợc và ghi nhận kết quả.

NH P D LI U

(INPUT)

X Lụ

(PROCESSING)

XU T D LI U

(OUTPUT)

L U TR (STORAGE)

Page 8: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 1: Dữ liệu và Thuật toán

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 2

- Thử nghiệm v i nhi u tr ng hợp dữ liệu nhập khác nhau c a bài toán đ ch ơng trình ki m tra đúng trong m i tr ng hợp tổng quát.

- Phân tích kết quả và hoàn chỉnh ch ơng trình.

Trong các b c trên, việc thiết kế thuật toán là giai đoạn quan tr ng nhất.

II.2. Thu t toán (Algorithm) II.2.1. ợịnh nghĩa

Thuật toán là một ph ơng pháp trình bày các b c giải quyết một hay nhi u bài toán theo một tiến trình xác đ nh.

II.2.2. Đặc tính c a thu t toán - Tính xác đ nh: Các thao tác c a thuật toán là rõ ràng và chắc chắn thực hiện đ ợc

đ dẫn đến kết quả nào đó.

- Tính hữu hạn và dừng: thuật toán phải có một s b c giải nhất đ nh và cu i cùng phải có kết thúc đi m dừng.

- Tính kết quả: V i dữ liệu hợp lý, thuật toán phải cho kết quả th a yêu cầu.

- Tính phổ dụng: Thuật toán phải giải đ ợc nhi u bài toán có cùng cấu trúc v i các dữ liệu khác nhau và đ u dẫn đến một kết quả mong mu n.

- Tính hiệu quả: Thuật giải phải đơn giản, dễ hi u trong các b c giải, t i thi u hoá bộ nh và th i gian thực hiện.

- Tính hình th c: Các b c trong thuật toán là máy móc, nghĩa là nó phải thực hiện đúng nh quy đ nh mà không cần biết đến mục tiêu cu i cùng.

II.2.3. Các ph ng pháp bi u di n thu t toán

Thuật toán có th đ ợc diễn giải thông qua 3 ph ơng pháp phổ biến, đó là sử dụng ngôn ngữ tự nhiên, ngôn ngữ giả và ngôn ngữ sơ đồ (l u đồ).

II.2.3.1 Ngôn ngữ tự nhiên

Là cách diễn đạt tự nhiên c a con ng i bằng ngôn ngữ c a mình đ mô tả các b c giải bài toán.

Ví d 1: Mô tả thuật toán theo ngôn ngữ tự nhiên c a ph ơng trình ax + b = 0

- B c 1: Nhập vào 2 hệ s a và b.

- B c 2: Xét đi u kiện a = 0?

Nếu đúng là a = 0, thì đi đến b c 3, nếu không (nghĩa là a 0) thì đi đến b c 4.

- B c 3: Xét đi u kiện b = 0?

Nếu b = 0, thì báo ph ơng trình có vô s nghiệm. Ði đến b c 5.

Nếu b 0, thông báo ph ơng trình vô nghiệm. Ði đến b c 5. - B c 4: Thông báo ph ơng trình có một nghiệm duy nhất là x = - b/a.

- B c 5: Kết thúc thuật toán.

Page 9: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 1: Dữ liệu và Thuật toán

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 3

II.2.3.2 Ngôn ngữ giả

Là cách diễn đạt các b c giải c a bài toán thông qua một s câu lệnh có cấu trúc (nh câu lệnh if..then..else, for..to..do, while..do, repeat..until)

Ví d 2: Mô tả thuật toán theo ngôn ngữ giả c a ph ơng trình bậc nhất ax + b = 0

- B c 1: Nhập vào 2 hệ s a và b.

- B c 2: if (a=0) then

if (b=0) then ph ơng trình vô s nghiệm

else ph ơng trình vô nghiệm

else ph ơng trình có một nghiệm duy nhất x = -b/a

- B c 3: Kết thúc thuật toán.

II.2.3.3 Ngôn ngữ lưu đồ (Flowchart) Là cách diễn đạt các b c giải c a bài toán thông qua các ký hiệu c a l u đồ. Một s

qui c ký hiệu l u đồ:

KỦ hi u Mô t

Đi m bắt đầu hoặc kết thúc thuật toán

Thao tác nhập hay xuất

Kh i xử lý công việc

Kh i quyết đ nh ch n lựa

Đi m n i

Chuẩn b

Tập hợp các tập tin dữ liệu

Kh i ch ơng trình con

Các ghi chú, giải thích

Dòng tính toán, thao tác c a ch ơng trình

Hình 2: Các ký hiệu l u đồ

Page 10: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 1: Dữ liệu và Thuật toán

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 4

Ví d 3: Mô tả thuật toán theo ngôn ngữ l u đồ c a ph ơng trình ax + b = 0

Hình 3: L u đồ thuật toán PTB1

Bắt đầu

Nhập a,b

a=0

b=0

Ph ơng trình vô s nghiệm

Ph ơng trình vô nghiệm

x := -b/a

Kết thúc

Đúng

Đúng

Sai

Sai Xuất nghiệm x

Page 11: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 5

CH NG 2: BORLAND DELPHI

I. T ng quan v Delphi

I.1. Delphi là gì

Delphi là một ngôn ngữ lập trình cấp cao, có trình biên d ch hoàn hảo, hỗ trợ mạnh v các ki u dữ liệu có cấu trúc và thiết kế h ng đ i t ợng dựa trên n n tảng ngôn ngữ lập trình h ng đ i t ợng (OOP: Object-Oriented Programming) c a Borland Pascal. Ngày nay, Delphi đư đ ợc phát tri n thành môi tr ng xây dựng ng dụng t c th i RAD (Rapid Application Development). Từ những công cụ c a RAD, bạn có th giải quyết những vấn đ ph c tạp trong qua trình phát tri n phần m m nh : lập trình ng dụng v cơ s dữ liệu (Database), lập trình mạng và Internet (Internet/Networking), lập trình Multimedia (Animation, sound), lập trình trò chơi (Game) cũng nh đồ h a (Graphic) hoặc lập trình hệ th ng, v.v… không những trên n n Windows mà còn cho cả Linux và .NET. Trong giáo trình này, chúng tôi chỉ gi i thiệu các khái niệm c a Delphi trong phạm vi hệ đi u hành Windows. V i khả năng mạnh nh vậy c a Delphi, bạn an tâm khi dùng nó đ tri n khai các ng dụng c a bạn quy mô nh hay l n. Đi u cần quan tâm Delphi là một ngôn ngữ rất thân thiện v i ng i dùng, phù hợp cho những ng i bắt đầu làm quen v i nó cũng nh những nhà lập trình chuyên nghiệp.

Vì đây là giáo trình đ ợc soạn dành cho đ i t ợng là các sinh viên bắt đầu h c Tin h c Đại c ơng thông qua ngôn ngữ Delphi. Do vậy, giáo trình này chỉ gi i thiệu những khái niệm căn bản nhằm giúp cho ng i h c có một s kiến th c nhất đ nh đ đ vận dụng vào giải các bài toán hoặc viết những ch ơng trình ng dụng nh . Các ch ơng trong giáo trình này sẽ trình bày các phần tử cơ bản c a Delphi đ tạo một ch ơng trình chạy trên n n Windows, đó chính là môi tr ng phát tri n tích hợp IDE (Integrated Development Environment) và ngôn ngữ h ng đ i t ợng Borland Pascal. Các bạn sẽ đ ợc h c cách thiết kế (Design), phát tri n (Develop) hay viết mư lệnh (Code), và ki m tra lỗi (Test) ch ơng trình ng dụng b i việc sử dụng Delphi.

I.2. Các phiên b n c a Delphi Ti n thân c a Delphi chính là ngôn ngữ đ i t ợng Borland Pascal, và đến ngày nay

Delphi đư có một quá trình phát tri n vững mạnh từ phiên bản 1 (Delphi1) vào năm 1995, đến phiên bản 8 (Delphi for .NET) năm 2005. Trong giáo trình này, chúng tôi th ng nhất trình bày v i các bạn Delphi 7. Đây là phiên bản phù hợp nhất và dễ dùng nhất hiện nay cho các bạn, đ i t ợng là các sinh viên h c Tin h c Đại c ơng.

II. Môi tr ờng phát tri n tích h p (IDE) c a Delphi

Môi tr ng soạn thảo và thiết kế ng dụng c a Delphi 7 chia ra làm 5 phần: Cửa sổ chính c a ch ơng trình Delphi, cửa sổ thiết kế bi u mẫu (Form designer), cửa sổ liệt kê các thành phần, đ i t ợng dạng cây (Object TreeView), cửa sổ thiết lập thuộc tính đ i t ợng (Object Inspector), và cửa sổ soạn thảo mư lệnh (Code Editor). V i môi tr ng IDE này, bạn sẽ có một giao diện (Interface) đ thiết kế (Design), biên d ch (Compile) và gỡ lỗi (Debug) dự án mà bạn đang phát tri n.

Page 12: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 6

Hình 1: Giao diện c a dự án m i tạo trong Delphi 7

Cửa sổ chính c a Delphi 7

Cửa sổ thiết kế bi u mẫu

Cửa sổ liệt kê các đ i t ợng dạng cây

Cửa sổ thiết lập các thuộc tính và sự kiện c a đ i t ợng

Cửa sổ soạn thảo mư lệnh

II.1. C a s chính c a Delphi Cửa sổ chính c a Delphi chính là cửa sổ có thành tiêu đ ch a tên dự án (Project

name) mà bạn đang phát tri n, nó bao gồm thực đơn chính (Main menu), thanh công cụ (Toolbar), và bảng thành phần (Component palette).

II.2. Thanh th c đ n chính vƠ thanh công c

II.2.1. Thanh th c đ n chính

Bao gồm các thực đơn thả xu ng (Drop-down menu) nh : File, Edit, Search, View,… và Help. Trong mỗi menu thả xu ng có nhi u ch c năng khác nhau nh : m một dự án m i, l u dự án, biên d ch, gỡ lỗi, chạy ch ơng trình,… mà giáo trình sẽ trình bày chi tiết phần sau.

Page 13: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 7

Hình 2: Thanh thực đơn chính

II.2.2. Thanh công c (Toolbars) Trong Delphi có nhi u thanh công cụ, nh : thanh công cụ chuẩn (Standard), thanh gỡ

lỗi (Debug), thanh hi n th (View),… Mỗi nút (Button) trên thanh công cụ th ng là một thao tác hay một lệnh mà khi ta Click vào nó sẽ thi hành, ví dụ nh : Biên d ch (Compile), chạy (Run) hoặc kết thúc chạy ch ơng trình (Program Reset), …

Hình 3: Các thanh công cụ

II.3. B ng chứa các thƠnh ph n c a Delphi (Component Palette) Thành phần (Component), hay còn đ ợc g i là đi u khi n, chính là đ i t ợng có sẵn

trong Delphi mà bạn có th thao tác trên nó trong th i đi m thiết kế form. Có 2 loại thành phần, đó là thành phần trực quan (visual component): nhìn thấy khi chạy ch ơng trình, và thành phần không trực quan (nonvisual component): không nhìn thấy khi chạy ch ơng trình. Mỗi thành phần có một s tính chất riêng, và đ ợc quản lý thông qua các thuộc tính (Properties), sự kiện (Events) và các ph ơng th c (Methods). Các thuộc tính này giúp bạn có th quản lý và đi u khi n ch ơng trình c a bạn. Khi bạn đặt một thành phần lên form, thì nó sẽ xuất hiện trong cửa sổ Object TreeView và Object Inspector – sẽ đ ợc trình bày

phần sau. Trong bảng ch a các thành phần có nhi u thẻ (tab) khác nhau, nh thẻ Standard,

Addition, Win32, System, Data Access, ADO, Internet, Rave, Server,… Trên mỗi thẻ ch a các bi u t ợng (icon) đại diện cho các thành phần.

Hình 4: Bảng ch a các thành phần trong thẻ Standard

Page 14: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 8

II.4. C a s thi t k bi u m u (Form Designer) vƠ C a s so n th o mư l nh (Code Editor)

II.4.1. C a s thi t k bi u m u

Khi bạn tạo một dự án m i, môi tr ng phát tri n tích hợp IDE c a Delphi sẽ tự tạo ra một bi u mẫu m i (Form) đ bạn tùy nghi thiết lập các giá tr c a thuộc tính dựa trên Properties, và các th tục sự kiện dựa vào Events, đ ợc xác đ nh trong Object Inspector, cho việc thiết kế ch ơng trình. Trong hầu hết tr ng hợp, một dự án th ng có ít nhất một form. Cùng v i các thành phần trên bảng các thành phần, bạn sẽ thiết kế đ ợc một giao diện cho ch ơng trình mà bạn đang xây dựng là thân thiện nhất cho ng i sử dụng.

TLabel (StdCtrls) TEdit (StdCtrls)

TButton (StdCtrls)

TMemo (StdCtrls)

Hình 5: Form “Giai phuong trinh bac nhat” và các Components

Các giá tr c a form và các giá tr c a các component đặt trên form đ ợc l u trong tập tin form (form file) và có phần m rộng .dfm, v i phần tên đ ợc xác đ nh gi ng nh phần tên c a đơn v ch ơng trình form. Tập tin form này ch a đựng các giá tr c a form cũng nh các giá tr c a các component mà ta đặt trên form trong quá trình thiết kế.

II.4.2. C a s so n th o mư l nh

Mỗi một form trong dự án đ ợc quản lý trong một tập tin đơn v ch ơng trình (Unit file/ Form unit), tên tập tin c a form unit này đ ợc đặt tên trong qua trình l u (Save) và có phần m rộng là .pas, nội dung c a tập tin form unit này ch a đựng các khai báo thông th ng c a unit (sẽ đ cập chi tiết phần sau) cũng nh các hàm sự kiện t ơng ng cho form và các component trên nó.

Page 15: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 9

Hình 6: Cửa sổ soạn thảo mư lệnh cho form unit untPtb1.Pas

Đ chuy n đổi giữa cửa sổ soạn thảo mư lệnh v i cửa sổ thiết kế bi u mẫu, ta sử dụng ch c năng View/Toggle Form/Unit từ main menu hoặc gõ phím ch c năng F12.

Ví d 1: Trong project “Giai phuong trinh bac nhat” trên, ta l u unit file v i tên untPtb1.Pas và form file sẽ đ ợc tự động đặt theo là untPtb1.dfm

II.5. C a s thuộc tính vƠ s ki n c a đối t ng (Object Inspector)

Hình 7: thẻ Properties c a Form và thẻ Events c a Button

Cửa sổ Object Inspector c a form hay component đ u có 2 thẻ: Properties và Events. Thẻ Properties dùng đ xác đ nh các tính chất c a đ i t ợng nói chung (Form, component) hiện hành một cách trực quan, chẳng hạn nh Caption, Name, Position, Visible,… Thẻ Events dùng đ lập trình sự kiện: xác đ nh những đáp ng c a đ i t ợng khi nhận tác động

Page 16: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 10

từ chuột (Mouse) hoặc bàn phím (Keyboard) nh : nhắp chuột (OnClick), đóng cửa sổ (OnClose), gõ phím Enter (OnEnter),… thông qua các th tục sự kiện.

Khi thay đổi các giá tr trong thẻ Properties trong quá trình thiết kế, thì mư lệnh t ơng ng c a đ i t ợng sẽ đ ợc thay đổi theo trong cửa sổ soạn thảo mư lệnh.

II.6. C a s li t kê các đối t ng d ng cơy (Object TreeView)

Hình 8: Cửa sổ liệt kê các đ i t ợng dạng cây trên frmPTB1

Object TreeView liệt kê các thành phần trực quan và không trực quan mà bạn đặt chúng trên form hiện hành. Mỗi th i đi m chỉ có một form duy nhất đ ợc liệt kê.

III. C u trúc một d án Delphi

III.1. T p tin d án: (Delphi project file)

Hình 9: Tập tin dự án prjPtb1.dpr

Page 17: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 11

Khi bạn bắt đầu m m i một ch ơng trình ng dụng bằng thao tác: File/New/Application, Delphi 7 sẽ tự động tạo ra một tập tin dự án có tên mặc nhiên ban đầu là Project1. Khi bạn l u dự án, Delphi sẽ lần l ợt nhắc bạn đặt tên cho các form unit và tên dự án. ví dụ giải ph ơng trình bậc nhất trên, form unit có tên là untPTB1.pas và tên dự án là prjPTB1.dpr. Phần tên c a tập tin dự án cũng chính là tên c a ch ơng trình, đ ợc khai báo sau từ khóa program.

Bạn chú ý: ti n t c a unit file là unt, còn project file là prj. Ví dụ nh untPTB1.pas và prjPTB1.dpr

Đ hi n th tập tin dự án, ta vào ch c năng Project/View Source

Mư lệnh nguồn (Source code) đ ợc Delphi tự động sinh ra trong tập tin dự án bao gồm:

- Tên ch ơng trình, đ ợc khai báo b i từ khóa program, đây cũng chính là tên ch ơng trình ng dụng (Application file).

- Các câu lệnh chỉ dẫn t i các form và các unit đ ợc sử dụng trong dự án đ ợc khái báo sau từ khóa uses.

- Chỉ th biên d ch {$R *.res}: sử dụng các tập tin tài nguyên (Resources). - Kh i lệnh thân ch ơng trình chính, bắt đầu b i từ khóa begin và kết thúc là end.

+ Initialize : Kh i động ch ơng trình ng dụng. + CreateForm : Tạo form chính (Main form).

+ Run : Chạy ch ơng trình ng dụng. Tập tin dự án là tập tin trung tâm c a một dự án đ ợc tri n khai b i Delphi. Tập tin

này ch a đựng các tham khảo (Reference) t i tất cả các file khác trong dự án và liên kết v i các form cũng nh tập tin đơn v (Unit file) kèm theo c a form. Khi ch ơng trình đ ợc thi hành (Run, execute), nó sẽ bắt đầu từ tập tin dự án này.

Tập tin này đ ợc tự động sinh ra, và nh vậy, bạn không nên thay đổi nội dung c a nó ngoại trừ trong những tr ng hợp cần thiết.

Tập tin dự án đ ợc l u v i phần m rộng .dpr

III.2. Các t p tin chứa mư l nh (Unit file) Trong mỗi ng dụng đ ợc viết b i Delphi th ng gồm có 1 tập tin dự án (Project file) và nhi u tập tin đơn v ch ơng trình (Unit file) – xem lại phần "Cửa sổ soạn thảo mư lệnh" phần trên. Mỗi khi ta thêm vào m i một form (hoặc Data Module, Frame,…) thì một tập tin unit sẽ đ ợc tạo ra. Thông th ng một dự án đ ợc tri n khai trong thực tế sẽ có nhi u tập tin unit này. Nội dung tập tin unit này ch a đựng mư lệnh c a ch ơng trình và c a các sự kiện đi u khi n (Event handles) trên form cũng trên các thành phần (Component) mà chúng đ ợc đặt trên nó.

Unit file đ ợc l u v i phần m rộng là .pas

III.3. Các t p tin đặc t bi u m u (Form file) Nội dung c a tập tin này xác đ nh một cách chi tiết các tính chất hay thuộc tính

(Properties) c a form và tất cả các đ i t ợng (nói chung) lập trình viên đư thiết kế. Tập tin này luôn đi kèm v i một tập tin unit file.

Form file đ ợc l u v i phần m rộng là .dfm

Đ hiện th nội dung tập tin này, bạn RClick trên form rồi ch n View as Text.

Page 18: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 12

Ví d 2: Xem nội dung tập tin form file có tên untPTB1.dfm nh sau:

Từ chế độ thiết kế c a form có tên là frmPTB1, bạn RClick trên form rồi ch n View as Text nh hình sau:

Hình 10: Chuy n cách hi n th từ dạng Form sang dạng Text

Nội dung c a tập tin untPTB1.dfm dạng văn bản sẽ có nh hình sau:

Hình 11: Hi n th dạng text c a untPTB1.dfm

Đ chuy n đổi từ cách hiện th dạng Text sang dạng Form, ta sử dụng ch c năng RClick ch n ch c năng View as Form hay tổ hợp phím Alt+F12:

Page 19: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 13

Hình 12: Chuy n cách hi n th dạng Text sang dạng Form.

III.4. Các t p tin tƠi nguyên (Windows Resource File) Tập tin này cũng đ ợc tự động sinh ra. Nội dung c a nó ch a đựng các thông tin v

phiên bản (Version) cũng nh bi u t ợng c a ng dụng (Application icon) dạng mư nh phân.

Tập tin này có phần m rộng .res Ta có th m tập tin tài nguyên này chế độ thiết kế (Design) bằng ch ơng trình

Image Editor đ ợc kèm theo bộ Delphi.

Hình 13: Giao diện ch ơng trình xử lý ảnh – Image Editor

Page 20: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 14

IV. Các thao tác c b n trên Delphi

IV.1. Mở một d án mới Đ tạo một dự án m i, bạn sử dụng lệnh File/New/Application. Hình ảnh một dự án

m i tạo nh hình sau:

Hình 14: Dự án m i tạo

IV.2. L u d án

Một dự án trong Delphi sẽ sinh ra khá nhi u tập tin. Do vậy, khi l u dự án, bạn cần phải tạo ra 1 th mục đ ch a các tập tin trong dự án đó. Quá trình l u dự án nh sau:

Đ l u một dự án, bạn sử dụng lệnh: File/Save All hay tổ hợp phím Shift+Ctrl+S. Thông th ng bạn phải l u các form tr c (mỗi form là một tập tin unit có phần m rộng là pas), rồi sau đó m i l u tập tin dự án (phần m rộng là dpr).

Ví d 3: L u dự án hi n th câu "Hello world!..." chỉ có một form, vào th mục S:\HelloWorld nh sau:

Hình 15: Cửa sổ thiết kế Form

Page 21: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 15

- Từ cửa sổ thiết kế, ch n lệnh File/Save All, Delphi sẽ xuất hiện ra cửa sổ "Save Uniti File" (v i i =1..n) nh sau:

Hình 16: Hộp thoại Save Uniti As

Click ch n hộp liệt kê thả "Save in" đ ch n ổ đĩa S: nh hình sau:

Hình 17: Hộp thoại Save Uniti As: Chọn đĩa

Page 22: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 16

Tiếp đến, Click ch n bi u t ợng "Create New Folder" đ tạo th mục m i ch a các tập tin c a dự án mà bạn mu n l u (th mục HelloWorld).

Hình 18: Hộp thoại Save Uniti As: T o th m c

Sau khi tạo th mục xong, bạn Click nút lệnh Open đ m th mục HelloWorld ra.

Hình 19: Hộp thoại Save Uniti As: Mở th m c

Page 23: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 17

Tiếp đến, bạn gõ tên tập tin unit mà bạn mu n l u vào trong hộp liệt kê thả "File name", đây là tên untHelloWorld.pas, rồi Click Save.

Hình 20: Hộp thoại Save Uniti As: Nh p vƠo tên t p tin unit

Đến đây, Delphi sẽ tiếp tục xuất hiện hộp thoại "Save Projecti As" đ bạn l u tập tin dự án. Bạn gõ vào tên tập tin dự án vào trong hộp liệt kê thả "File name", ví dụ này là tên prjHelloWorld.dpr, và Click Save.

Hình 21: Hộp thoại Save Projecti As: Nh p tên t p tin d án

Page 24: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 2: Borland Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 18

Dự án đư đ ợc l u và đặt tên xong. Sau việc này, nếu bạn có chỉnh sửa ch ơng trình, đ l u lại những sự thay đổi này, bạn chỉ cần ra lệnh File/Save All đ Delphi tự động l u toàn bộ lại dự án.

Hình d i đây cho bạn thấy s l ợng các tập tin trong một dự án Hello World đư đ ợc l u, thông qua cửa sổ Windows Explorer nh sau:

Hình 22: Các tập tin c a dự án Hello Wolrd trong th mục S:\HelloWorld

IV.3. L u Form (t p tin unit) với tên khác

Bạn ch n lệnh File/Save As đ l u.

IV.4. L u d án với tên khác Bạn ch n lệnh File/Save Project As đ l u dự án.

IV.5. Đóng d án Bạn ch n lệnh File/Close All đ đóng lại toàn bộ dự án.

IV.6. Thoát khỏi Delphi Sau khi l u lại toàn bộ dự án. Đ thoát kh i Delphi, bạn sử dụng lệnh: File/Exit

Page 25: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal)

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 19

CH NG 3: CÁC THẨNH PH N C B N C A NGÔN NG

DELPHI (OBJECT PASCAL)

Trong ch ơng này và ch ơng 4 tiếp theo sau, đ giúp cho việc làm quen v i các khái niệm cơ bản đ ợc dễ dàng. Giáo trình sẽ xây dựng các ví dụ theo dạng ch ơng trình chế độ văn bản (Text mode) hay không hỗ trợ đồ hoạ (Console Application). Đ tạo một project m i theo dạng Console Application, bạn sử dụng ch c năng File/New/Other/Console Application.

I. Bộ ch vi t

- Bộ 26 chữ Latin:

o Chữ in : A, B, C, ..., X, Y, Z

o Chữ th ng : a, b, c, ..., x, y, z

- Bộ chữ s thập phân : 0, 1, 2, 3, ..., 8, 9

- Ký tự gạch n i : _

- Các ký hiệu toán h c : +, -, *, /, =, <, >, (, ), [, }

II. T khóa

Là các từ riêng c a Object Pascal, có ngữ nghĩa đư đ ợc xác đ nh, không đ ợc dùng nó vào các việc khác hoặc đặt tên m i trùng v i các từ khóa.

T Ệểóa cểunỂ: program, begin, end, procedure, function

- Từ khóa đ khai báo: const, var, type, array, string, record, set, file, label, class,...

- Từ khóa c a lệnh lựa ch n: if ... then ... else, case ... of

- Từ khóa c a lệnh lặp: for... to... do, for... downto... do, while... do, repeat... until

- Từ khóa đi u khi n: with, goto, exit, halt - Từ khóa toán tử: and, or, not, in, div, mod

D i đây là danh sách một s từ khóa thông dụng:

and

array

begin

case

class

const

div

do

downto

for

function

goto

if

implementation

interface

label

mod

object

record

repeat

set

to

try

type

unit

until

uses

Page 26: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal).

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 20

else

end

finalization

finally

of

procedure

program

property

var

while

with

B ng 1: Các t khoá

III. Tên danh hi u t đặt

Trong Delphi đ đặt tên cho các biến, hằng, ki u, ch ơng trình con ta dùng các danh hiệu (Identifier). Quy tắc đặt tên c a danh hiệu trong Delphi là:

- Chi u dài t i đa: 256 ký tự.

- Bắt đầu bằng ch cái hoặc dấu _ (gạch d i); tiếp theo có th kết hợp s và các ký tự khác.

- Không đựợc ch a khoảng tr ng.

- Không trùng v i các từ khóa.

- Không phân biệt chữ hoa và chữ th ng.

- Các đ nh danh lồng nhau đ ợc dùng dấu . (dấu chấm) đ truy xuất.

Ví d 1:

- Danh hiệu tự đặt hợp lệ: x; s1; delta; pt_bac_2;

- Danh hiệu tự đặt không hợp lệ: 1S (bắt đầu bằng s ), Del ta (tên có khoảng trắng),...

IV. Hằng

IV.1. Khái ni m

Hằng là một đại l ợng có giá tr không đổi trong quá trình chạy ch ơng trình. Ta dùng tên hằng đ ch ơng trình đ ợc rõ ràng và dễ sửa đổi.

Cú pháp khai báo:

Const

Tên_hằng = bi u_th c_xác_đ nh_giá_tr _c a_hằng;

IV.2. Hằng trị Trong tr ng hợp này thì bi u_th c_xác_đ nh_giá_tr _c a_hằng là một tr xác đ nh.

Giá tr c a bi u th c này sẽ đ ợc đ nh tr một lần và không thay đổi. Ví d 2:

Const MaxSize = 100;

Const x = Abs(-100)+Length('Chao ban'); // hằng x =108

Const St = 'Borland'+ ' Delphi'; // hằng St = 'Borland Delphi'

Page 27: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal)

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 21

Chú ý: Bi u th c hằng đây có th là s , chuỗi ký tự, các hằng true, false, nil,… kết hợp v i các toán tử thích hợp. Bi u th c hằng không th ch a các l i g i hàm, biến hay con tr , ngoại trừ một s hàm đơn giản nh : Abs, Chr, Length, Succ, Odd,…

IV.3. Hằng định ki u: Có th ch a các giá tr ki u mảng, bản ghi, ki u th tục và ki u con tr . Cú pháp khai báo hằng đ nh ki u:

Const

Tên_hằng: ki u_dữ_liệu = giá_tr _hằng;

Ví d 3:

Const MaxSize : Integer =100;

Trong ví dụ trên chúng ta khai báo một hằng có tên là MaxSize, có ki u Integer và mang giá tr bằng 100. Chúng ta thấy, cách khai báo hằng ki u này rất gi ng khai báo và kh i tạo biến (chúng ta sẽ xem trong phần biến). Nếu ng i lập trình bật chỉ th biên d ch {$J+} thì hằng đ ợc xem nh biến; t c là chúng ta có thể thay đổi giá trị của hằng lúc ch ơng trình thực thi.

Hằng mảng, hằng ki u bản ghi, hằng ki u th tục chúng ta sẽ tìm hi u chi tiết trong các phần sau.

V. Ki u (Type)

V.1. ợịnh nghĩa Ngoài các ki u đư đ nh sẵn, Delphi còn cho phép ta đ nh nghĩa các ki u dữ liệu khác

từ các ki u căn bản theo qui tắc xây dựng c a Delphi.

V.2. Cách khai báo

Type

Tên_ki u = Mô_tả_xây_dựng_ki u;

Ví d 4: Đ nh nghĩa các ki u dữ liệu ng i dùng (ki u dữ liệu m i) và khai báo biến theo ki u vừa đ nh nghĩa

type //Khai báo ki u ng i dùng

SoNguyen = integer;

Diem = single;

Tuoi = 1 .. 100;

Color = (Red, Blue, Green);

Thu = (ChuNhat, Hai, Ba, Tu, Nam, Sau, Bay);

Và khi đư khai báo ki u thì ta có quy n sử dụng ki u đư đ nh nghĩa đ khai báo biến nh sau:

var //Khai báo biến theo ki u ng i dùng đ nh nghĩa

i, j: SoNguyen;

dtb: Diem;

t: Tuoi;

Page 28: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal).

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 22

mau: Color;

ngay_hoc: Thu;

VI. Bi n

Biến là một cấu trúc ghi nh có tên (đó là tên biến hay danh hiệu c a biến). Biến ghi nh một dữ liệu nào đó g i là giá tr (value) c a biến. Giá tr c a biến có th đ ợc biến đổi trong th i gian sử dụng biến.

Sự truy xuất c a biến nghĩa là đ c giá tr hay thay đổi giá tr c a biến đ ợc thực hiện thông qua tên biến.

Cú pháp khai báo biến:

Var tên_biến [hoặc danh_sách_tên_biến] : Ki u_biến;

Nếu chúng ta khai báo một danh sách các biến có cùng ki u thì mỗi tên biến cách nhau một dấu phẩy. Ki u biến là một ki u dữ liệu chuẩn trong Delphi hoặc ki u đ ợc đ nh nghĩa b i ng i dùng.

Ví d 5:

var a : extended ; // khai báo a là một biến ki u s thực

b, c : integer ; // khai báo 2 biến b, c có ki u s nguyên

hten : shortstring;

m_Ok: boolean; // khai báo m_Ok là một biến ki u logic

Chon : char; // khai báo Chon là một biến ki u ký tự

Cần khai báo các biến tr c khi sử dụng chúng trong ch ơng trình. Khai báo một biến là khai báo sự tồn tại c a biến đó và cho biết nó thuộc ki u gì.

VII. Bi u thức

VII.1. Định nghĩa

Một bi u th c là một công th c tính toán bao gồm các phép toán (toán tử), hằng, biến, hàm và các dấu ngoặc.

Ví d 6:

5 + u * sqrt(t) / sin(pi/2) ;

(a=5) and (b<>7) or (c >= 10);

max(x,y); // g i hàm

Trong đó: a, b, c, x, y, u, t là các biến đư đ ợc khai báo.

VII.2. Thứ t u tiên

Toán t : Trong Delphi gồm có các toán tử đ ợc phân chia nh sau:

- Toán tử s h c : +, -, *, /, div, mod

Page 29: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal)

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 23

- Toán tử logic : not, and, or, xor

- Toán tử quan hệ : =, >, <, <>, <=, >=

- Toán tử bitwise : not, and, or, xor, shl, shr

- Toán tử làm việc trên tập hợp : +, -, *, /, <=, >=, <>*, in

- Toán tử thao tác trên con tr : +, -, @ , ^, =, <>

- Toán tử xử lý l p đ i t ợng : as, is

Khi tính giá tr c a một bi u th c, ngôn ngữ Delphi qui c th tự u tiên c a các phép toán từ cao đến thấp nh sau:

Phép toán Thứ t u tiên

@, not u tiên 1

*, /, div, mod, and, shl, shr, as u tiên 2

+, -, or, xor u tiên 3

=, <>, <, >, <=, >=, in, is u tiên 4

B ng 2: Th tự u tiên toán tử

Qui ớc tính thứ t u tiên: Khi tính một bi u th c có 3 qui tắc v th tự u tiên nh sau:

Qui tắc 1. Các phép toán nào có u tiên cao hơn sẽ đ ợc tính tr c. Qui tắc 2. Trong các phép toán có cùng th tự u tiên thì sự tính toán sẽ đ ợc thực

hiện từ trái sang phải. Qui tắc 3. Phần trong ngoặc từ trong ra ngoài đ ợc tính toán đ tr thành một giá

tr đơn.

VIII. Chuy n ki u (Typecast)

Chuy n ki u hay còn g i là ép ki u là một kỹ thuật đ ợc dùng đ chuy n giá tr c a một bi u th c sang một ki u dữ liệu khác.

Cú pháp chuy n đổi ki u dữ liệu: Tên_Ki u(bi u_thức);

V i bi u_th c là một hằng, thì ta có cách chuy n ki u theo giá tr (value typecasts), còn v i bi u_th c là một biến, thì ta có cách chuy n ki u theo biến (variable typecasts).

Ví d 7: Chuy n ki u theo tr :

t := integer('A'); // chuy n ký tự A sang s , t = 65

v := char(65); // chuy n s sang ký tự, v = 'A' b := boolean(0); // chuy n s sang ki u Booblean, b = False

Ví d 8: Chuy n ki u theo biến:

var MyChar: char;

Shortint(MyChar) := 122; // Gán ký tự 'z' vào biến MyChar

Page 30: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal).

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 24

Ví d 9: Viết ch ơng trình minh hoạ 2 cách chuy n ki u theo tr và theo biến:

Từ File/New/Other, DClick vào Console Application đ m ra 1 dự án m i và nhập các dòng lệnh đ hoàn chỉnh nh hình sau:

Hình 1: Ch ơng trình chuy n ki u Console mode

Nhấn tổ hợp phím Ctrl+F9 đ biên d ch lỗi.

Nhấn phím ch c năng F9 đ chạy ch ơng trình, và ta có kết quả chế độ Console nh sau:

Hình 2: Kết quả chạy ch ơng trình.

IX. Lời chú thích vƠ các chỉ d n biên dịch

Trong Delphi có 3 cú pháp đ ghi chú thích nh sau:

{ chú thích ghi trong cặp dấu ngoặc móc }

(* chú thích đ ợc bao b i cặp dấu ngoặc và dấu sao*)

// chú thích trên một dòng

Hai ki u chú thích khác nhau có th thực hiện chú thích lồng nhau nh ng cùng ki u thì không đ ợc phép lồng nhau.

Page 31: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 3: Các thành phần cơ bản c a ngôn ngữ Delphi (Object Pascal)

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 25

X. C u trúc một d án ở ch độ Form (Form Application)

Cấu trúc c a một dự án (project) trong Delphi gồm 2 phần chính:

Ph n 1: Là tập tin dự án (Project file)

Hình 3: Project file.

Ph n 2: Là (các) tập tin đơn v ch ơng trình (Unit file)

Hình 4: Kết quả chạy ch ơng trình.

Page 32: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 26

CH NG 4: CÁC KI U D LI U S C P CHU N, L NH Đ N

I. Các ki u d li u s c p (Simple type)

I.1. Ki u số nguyên (Integer) Ki u s nguyên bi u diễn một tập hợp con các s . Delphi phân làm hai loại s

nguyên đ ợc đ nh nghĩa b i các từ khóa nh sau:

T khóa Ph m vi Kích th ớc

Integer -2147483648..2147483647 s nguyên có dấu 32 bit

Cardinal 0..4294967295 s nguyên d ơng 32 bit

B ng 1: Ki u nguyên

Trong đó, ki u Integer còn đ ợc chia ra thành một s tập con đ ợc đ nh nghĩa b i các từ khóa sau:

T khóa Ph m vi Kích th ớc

Shortint -128..127 S nguyên có dấu 8 bit

Smallint -32768..32767 S nguyên có dấu 16 bit

Longint -2147483648..2147483647 S nguyên có dấu 32 bit

Int64 -2^63..2^63-1 S nguyên có dấu 64 bit

Byte 0..255 S nguyên d ơng 8 bit

Word 0..65535 S nguyên d ơng 16 bit

Longword 0..4294967295 S nguyên d ơng 32 bit

B ng 2: Các ki u nguyên

I.2. Ki u kỦ t (Char) Ki u ký tự cơ bản bao gồm AnsiChar và WideChar. AnsiChar là ki u ký tự thông

th ng, chiếm kích th c một byte (t ơng tự bộ ký tự ASCII mà giáo trình sẽ đ cập phần tiếp theo). WideChar là ki u ký tự hai byte, là ki u ký tự dùng đ bi u diễn bộ mư Unicode cho tập hợp ký tự.

Tuy nhiên, các bạn vẫn có th khai báo sử dụng ki u ký tự v i từ khóa Char. Và trên thực tế thì ki u Char t ơng đ ơng v i ki u AnsiChar. Ngoài Char và AnsiChar, Delphi còn hỗ trợ tập ký tự một byte thông qua các ki u: PChar, PAnsiChar và AnsiString. T ơng tự thì Delphi cũng hỗ trợ tập ký tự Unicode (ngoài ki u WideChar) thông qua các ki u: PWideChar, WideString.

Một ký tự đ ợc viết trong cặp dấu nháy đơn (''). Ð tiện trao đổi thông tin cần phải sắp xếp, đánh s các ký tự, mỗi cách sắp xếp nh vậy g i là bảng mư. Bảng mư thông dụng hiện nay là bảng mư ASCII (American Standard Code for Information Interchange). Hệ mư ASCII dùng nhóm 7 bit hoặc 8 bit đ bi u diễn t i đa 128 hoặc 256 ký tự khác nhau và mư hóa theo ký tự liên tục theo cơ s 16.

Page 33: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 27

Hệ mư ASCII 7 bit, mư hoá 128 ký tự liên tục nh sau:

0 : NUL (ký tự rỗng)

1 – 31 : 31 ký tự đi u khi n

32 – 47 : các ký tự khoảng trắng SP (space) ! “ # $ % & ‘ ( ) * + , - . /

48 - 57 : ký s từ 0 đến 9

58 - 64 : các dấu : ; < = > ? @

65 - 90 : các chữ in hoa từ A đến Z

91 – 96 : các dấu [ \ ] _ `

97 – 122 : các chữ th ng từ a đến z

123 – 127 : các dấu { | } ~ DEL (xóa)

Hệ mư ASCII 8 bit (ASCII m rộng) có thêm 128 ký tự khác ngoài các ký tự nêu trên, gồm các chữ cái có dấu, các hình vẽ, các đ ng kẻ khung đơn và khung đôi và một s ký hiệu đặc biệt.

Ð thực hiện các phép toán s h c và so sánh, ta dựa vào giá tr s th tự mư ASCII c a từng ký tự, chẳng hạn: 'A' < 'a' vì s th tự mư ASCII t ơng ng là 65 và 97.

Hàm Chr(n): Trả v ký tự t ơng ng v i s th tự mư ASCII n. Hàm Ord(ch): Trả v s th tự c a ký tự ch trong bảng mư ASCII.

Ví d 1: V i khai báo biến var ch: char; stt:byte; thì các câu lệnh sau sẽ có giá tr nh sau:

ch := chr(65); //ch = 'A'

stt := ord('A'); //stt = 65

Page 34: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 28

B NG Mẩ ASCII với 128 kỦ t chu n

Hex 0 1 2 3 4 5 6 7 0 NUL

0 DLE

16 SP

32 0

48 @

64 P

80 `

96 p

112

1 SOH 1

DC1 17

! 33

1 49

A 65

Q 81

a 97

q 113

2 STX 2

DC2 18

“ 34

2 50

B 66

R 82

b 98

r 114

3 3

DC3 19

# 35

3 51

C 67

S 83

c 99

s 115

4 4

DC4 20

$ 36

4 52

D 68

T 84

d 100

t 116

5 5

NAK 21

% 37

5 53

E 69

U 85

e 101

u 117

6 6

SYN 22

& 38

6 54

F 70

V 86

f 102

v 118

7 BEL 7

ETB 23

‘ 39

7 55

G 71

W 87

g 103

w 119

8 BS 8

CAN 24

( 40

8 56

H 72

X 88

h 104

x 120

9 HT 9

EM 25

) 41

9 57

I 73

Y 89

I 105

y 121

A LF 10

SUB 26

* 42

: 58

J 74

Z 90

j 106

z 122

B VT 11

ESC 27

+ 43

; 59

K 75

[ 91

k 107

{ 123

C FF 12

FS 28

, 44

< 60

L 76

\ 92

l 108

| 124

D CR 13

GS 29

- 45

= 61

M 77

] 93

m 109

} 125

E SO 14

RS 30

. 46

> 62

N 78

^ 94

n 110

~ 126

F SI 15

US 31

/ 47

? 63

O 79

_ 95

o 111

DEL 127

Hình 1: Bảng mư ASCII chuẩn

Page 35: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 29

B NG Mẩ ASCII với 128 mở rộng

Hex 8 9 A B C D E F 0 Ç

128 É

144 á

160 ƅ

176 └

192 Ż

208 α

224 ≡

240

1 ü 129

æ 145

í 161

Ɔ 177

┴ 193

ŷ 209

ß 225

± 241

2 é 130

Æ 146

ó 162

Ƈ 178

┬ 194

Ÿ 210

Γ 226

≥ 242

3 â 131

ô 147

ú 163

│ 179

├ 195

Ŭ 211

π 227

≤ 243

4 ä 132

ö 148

ñ 164

┤ 180

─ 196

ū 212

Σ 228

Ŗ 244

5 à 133

ò 149

Ñ 165

Ŵ 181

┼ 197

ť 213

Ń 229

ŗ 245

6 å 134

û 150

ª 166

ŵ 182

ű 198

Ŧ 214

µ 230

÷ 246

7 ç 135

ù 151

º 167

ũ 183

Ų 199

ž 215

ń 231

≈ 247

8 ê 136

ÿ 152

¿ 168

Ũ 184

ŭ 200

Ž 216

Φ 232

° 248

9 ë 137

Ö 153

⌐ 169

Ŷ 185

ŧ 201

┘ 217

Θ 233

∙ 249

A è 138

Ü 154

¬ 170

Ť 186

ż 202

┌ 218

Ω 234

· 250

B ï 139

¢ 155

½ 171

Ū 187

Ź 203

█ 219

Ł 235

√ 251

C î 140

£ 156

¼ 172

Ű 188

ų 204

▄ 220

∞ 236

ⁿ 252

D ì 141

¥ 157

¡ 173

ů 189

ţ 205

▌ 221

φ 237

² 253

E Ä 142

₧ 158

« 174

Ů 190

ſ 206

Ƅ 222

ł 238

■ 254

F Å 143

ƒ 159

» 175

┐ 191

ź 207

▀ 223

∩ 239

255

Hình 2: Bảng ASCII m rộng

Page 36: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 30

Ví d 2: Viết ch ơng trình in ra 256 ký tự c a bảng mư ASCII: Từ File/New/Other, DClick vào Console Application đ m ra 1 dự án m i và nhập

các dòng lệnh đ hoàn chỉnh nh hình sau:

Hình 3: Ch ơng trình in bảng mư ASCII

Nhấn tổ hợp phím Ctrl+F9 đ biên d ch lỗi.

Nhấn phím ch c năng F9 đ chạy ch ơng trình, và ta có kết quả chế độ Console nh sau:

Hình 4: Kết quả ch ơng trình chế độ Console

I.3. Ki u số th c (Real type) I.3.1. Khái ni m

Delphi, ki u s thực bi u diễn một tập hợp các s mang dấu chấm động (float, real). Kích th c c a nó tùy thuộc vào từ khóa mà chúng ta sử dụng trong khai báo.

Page 37: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 31

T khóa Ph m vi Kích th ớc (byte)

Real48 2.9 x 10^-39 .. 1.7 x 10^38 6

Single 1.5 x 10^-45 .. 3.4 x 10^38 4

Double 5.0 x 10^-324 .. 1.7 x 10^308 8

Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 10

Comp -2^63+1 .. 2^63 -1 8

Currency -922337203685477.5808.. 922337203685477.5807

8

B ng 3: Các từ khoá c a ki u thực

Tuy nhiên, ki u s thực chúng ta th ng dùng đ ợc khai báo bằng từ khóa Real, trong Delphi ki u Real t ơng đ ơng v i ki u Double.

T khóa Ph m vi Kích th ớc (byte)

Real 5.0 x 10^-324 .. 1.7 x 10^308 8

B ng 4: Ki u Real

I.3.2. Một số phép toán vƠ hƠm trên ki u số (số nguyên vƠ số th c) Các phép toán s h c hai ngôi:

Phép toán Ý nghĩa Ki u toán h ng Ki u k t qu

+ Cộng integer, real integer, real

- Trừ integer, real integer, real

* Nhân integer, real integer, real

/ Chia thực integer, real real

div Chia nguyên integer integer

mod Lấy phần d integer integer

B ng 5: Các phép toán 2 ngôi Ví d 3: V i các biến x, y, z ki u integer x := 3*2; // x = 6

y := 15 div 6; // t = 2

z := 15.5 mod 5; // lỗi Tuy nhiên, phép toán + và toán - còn có th là phép toán một ngôi:

Phép toán ụ nghĩa Ki u toán h ng Ki u k t qu Ví d

+ (unary) dấu d ơng integer, real integer, real +7

- (unary) dấu âm (lấy s đ i) integer, real integer, real -7

B ng 6: Các phép toán 1 ngôi

Page 38: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 32

Khi thực hiện các phép toán chúng ta cần chú ý một s đi m đặc biệt sau:

- Kết quả c a phép chia thực (/) luôn luôn có ki u Extented, không quan tâm đến ki u c a các toán hạng.

- Phép toán mod là phép toán lấy phần d .

- Khi thực hiện phép chia x/y (hay là x mod y hoặc x div y) thì y phải khác 0, nếu y có giá tr 0 thì ch ơng trình sẽ phát sinh lỗi.

Một s hàm chuy n đổi ki u dữ liệu:

function IntToStr ( Number : Integer ) : string; //Unit: SysUtils

function IntToStr ( BigNumber : Int64 ) : string; //Unit: SysUtils

Hàm IntToStr là hàm thực hiện việc chuy n đổi một s nguyên (hoặc s int64) thành một chuỗi s .

function FloatToStr(Value: Extended): string; //Unit: SysUtils

function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;

Hàm FloatToStr chuy n đổi một s thực hay s dấu chấm động (Value) thành một chuỗi bi u diễn t ơng ng cho s đó.

Bảng d i đây là các hàm liên quan đến ki u s :

Hàm ụ nghĩa

abs(x); |x| : lấy giá tr tuyệt đ i c a s x

arctan(x:extended): extended; arctang(x)

cos(x: extended): extended; cos(x) : lấy cos c a x

exp(x: real): real; ex

frac(x:extended): extended; Trả v phần thập phân c a biến x

inc(var x [ ; n: longint ] ); tăng biến x lên 1 hoặc n giá tr

int(x: extended): extended; Trả v phần nguyên c a biến x

ln(x); ln x : lấy logarit nepe c a tr x (e 2.71828)

max(a,b: numbertype): numbertype; Trả v s l n hơn trong hai s a và b.

min(a,b: numbertype): numbertype; Trả v s nh thua trong hai s a và b.

odd(n: integer|int64):boolean;

Ki m tra n có phải là s lẻ hay không: True: Nếu n lẻ

False: Nếu n chẵn.

pi: extended; Trả v giá tr pi=3.1415926535897932385.

random[( range: integer)]; Trả v một s ngẫu nhiên x và 0 <= x < range, nếu range không chỉ ra thì 0 <= x < 1.

sqr(x); x2 : lấy bình ph ơng tr s x

sqrt(x); : lấy căn bậc 2 c a x

sin(x); sin (x) : lấy sin c a x

succ(x); Trả v giá tr sau c a x

Page 39: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 33

trunc(x: extended): int64; Lấy phần nguyên c a x

round(x: extended): int64; Làm tròn giá tr c a x, lấy s nguyên gần x nhất

B ng 7: Các hàm xử lý s

Ví d 4: Viết ch ơng trình tính chu vi và diện tích c a hình chữ nhật: Từ File/New/Other, DClick vào Console Application đ m ra 1 dự án m i và nhập

các dòng lệnh đ hoàn chỉnh nh hình sau:

Hình 5: Ch ơng trình tính chu vi diện tích hình chữ nhật

Nhấn tổ hợp phím Ctrl + F9 đ biên d ch lỗi.

Nhấn phím ch c năng F9 đ chạy ch ơng trình, và ta có kết quả chế độ Console nh sau:

Hình 6: Kết quả ch ơng trình chế độ Console

Page 40: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 34

I.4. Ki u logic (Boolean) I.4.1. Khái ni m

Một dữ liệu thuộc ki u boolean là một đại l ợng có th nhận đ ợc một trong hai giá tr logic là true (đúng) và false (sai). Delphi cung cấp 4 ki u boolean sau:

T khóa Kích th ớc (byte)

Boolean 1

ByteBool 1

WordBool 2

LongBool 4

B ng 8: Ki u logic

Trong đó, ki u Boolean là ki u t ơng thích v i ki u Boolean c a Pascal và đ ợc a thích hơn cả. Một giá tr ki u ByteBool, LongBool hoặc WordBool đ ợc xem là true nếu nó có giá tr khác 0, ng ợc lại là false.

I.4.2. Phép toán Boolean

T khóa ụ nghĩa

Not Phép toán ph định

And Phép toán và

Or Phép toán hoặc B ng 9: Các phép toán trên ki u logic

Cú pháp:

Phép toán and: (x1) and (x2) and ... and (xn) trả v kết quả là true khi tất cả các toán hạng là true, ng ợc lại trả v false.

Phép or: (x1) or (x2) or ... or (xn) cho kết quả là false khi tất cả các toán hạng là false, ng ợc lại trả v true.

Ví d 5: Ví dụ: v i x, y, z ki u boolean, ta có: x := (2<3) and (5<5) and (0<>1); // x = False

y := (2>3) or (5>5) or (0<>1); // y = True

z := not (y); // z = False

Đ hi n th giá tr boolean lên màn hình, bạn sử dụng hàm có sẵn trong Delphi: function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;

Nếu bạn mu n hi n th giá tr c a B là chuỗi ký tự True hoặc False thì cho UseBoolStrs = True; còn nếu mu n hi n th giá tr c a B là '-1' hoặc '0' thì thì cho UseBoolStrs = False.

II. Cơu l nh (statement)

Trong một ch ơng trình Delphi, sau phần mô tả dữ liệu là phần mô tả các câu lệnh. Các câu lệnh có nhiệm vụ xác đ nh các công việc mà máy tính phải thực hiện đ xử lý các dữ liệu đư đ ợc mô tả và khai báo. Câu lệnh đ ợc chia thành câu lệnh đơn giản và câu lệnh có cấu trúc.

Page 41: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 35

Các câu lệnh phải đ ợc ngăn cách v i nhau b i dấu ch m ph y (;) và các câu lệnh có th viết trên một dòng hay nhi u dòng.

III. L nh đ n (Simple statement)

Lệnh đơn là lệnh không ch a bất kỳ câu lệnh nào khác. Các lệnh đơn bao gồm: lệnh gán, lệnh g i hàm và th tục, lệnh nhảy (goto).

IV. L nh gán (Assignment statement)

Một trong các lệnh đơn giản và cơ bản nhất c a Delphi là lệnh gán. Mục đích c a lệnh này là gán cho một biến đư khai báo một giá tr nào đó cùng ki u (hay t ơng thích) v i biến.

Cú pháp c a lệnh gán là: Bi n := bi u_thức;

Lệnh gán sẽ đặt lại giá tr hiện hành c a biến bằng giá tr m i nằm bên phải toán tử gán (dấu hiệu :=).

Ví d 6: Khi đư khai báo

var

c: char; i: integer;

x: real; p, q: boolean;

thì ta có th có các phép gán sau:

c := 'A'; c := chr(90);

i := 35; i := i div 7;

x := 0.5; x := i + 1;

p:= (i >= 1) and (i < 100); q := not p;

ụ nghĩa: Biến và các phát bi u gán là các khái niệm quan tr ng c a một h các ngôn ngữ lập

trình, chúng phản ánh cách th c hoạt động c a máy tính, đó là:

- L u trữ các giá tr khác nhau vào một ô nh tại những th i đi m khác nhau.

- Một quá trình tính toán có th coi nh là một quá trình làm thay đổi giá tr c a một (hay một s ) ô nh nào đó, cho đến khi đạt đ ợc giá tr cần tìm.

V. L nh gọi th t c vƠ hƠm

Trong lập trình OOP, thuật ngữ hàm (Function), th tục (Procedure) và ph ơng th c (Method) là khái niệm quen thuộc v i ng i lập trình. Đ các bạn có th nắm bắt đ ợc kiến th c lập trình trong Delphi, Giáo trình đ a ra tr c khái niệm này một cách ngắn g n nh sau:

Hàm và th tục đ ợc g i chung là ch ơng trình con. Hàm đ ợc xây dựng thông qua tên hàm và danh sách các tham s hình th c nếu có, m i hƠm thì luôn tr v duy nh t 1 giá trị. Còn th tục thì có tên th tục và danh sách các tham s hình th c nếu có. Khác v i

Page 42: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 36

hàm, th t c KHÔNG tr v một giá trị nƠo c , nó th ng bao gồm một dưy các câu lệnh cần đ ợc thực hiện một cách tuần tự đ giải quyết một công việc nào đó.

Bạn cần phân ra 2 giai đoạn rõ ràng: Xây dựng ch ơng trình con, và sử dụng ch ơng trình con.

Ví d 7: V hàm - Function

- Xây dựng hàm: Bạn viết hàm tính tổng 2 s a và b và kết quả trả v c a hàm chính là kết quả a + b. Nó có hình dạng nh sau:

function Cong(a, b: single) : single; begin

Cong := a + b; end;

- Sử dụng hàm (L i g i hàm): bạn cần tính phép cộng c a 2 con s cụ th nào, chẳng hạn bạn mu n 5 cộng v i 7, thì nh vậy bạn sẽ truy n s 5 vào cho a và 7 vào cho b. Cụ th bạn sẽ g i nh sau:

mTong := Cong(5,7); //v i biến mTong ki u Single và mTong = 12

Nh vậy b c xây dựng: a và b đ ợc g i là tham s hình th c. Còn b c g i hàm thì 5 và 7 đ ợc g i là các tham s thực.

Ví d 8: V th tục – Procedure

- Xây dựng th tục: Bạn viết th tục hi n th ra màn hình n câu chào “Welcome to Delphi!…”, v i n có th là 1 lần, 3, 10, … 100 lần chẳng hạn:

procedure Welcome(n: integer);

var i: integer;

begin

for i:=1 to n do ╙╔i╖el═ (‘Welc║me ╖║ Del╒hi!…’); end;

- Sử dụng th tục (L i g i th tục): đây mu n hi n th 5 câu chào, thì bạn ra câu lệnh nh sau:

Welcome(5); //Hiể═ ╖hị 5 c╪╗ ch╩║

Khái niệm ph ơng th c trong một l p cũng đ ợc xem là th tục hoặc hàm (Member method). Kiến th c này các bạn sẽ đ ợc h c ch ơng 5. đây, các bạn cần chú ý đi u này: Ph ơng th c là ch ơng trình con mà Delphi đư xây dựng sẵn trong mỗi l p/thành phần (Class/Component) cho bạn (Thật kh e làm sao!…), bạn chỉ cần lấy trong “túi khôn” c a Delphi đ sử dụng viết ch ơng trình mà thôi.

Tóm lại: Khi sử dụng ph ơng th c hay các ch ơng trình con đư đ ợc xây dựng sẵn b i Deplhi, bạn cần nắm rõ mỗi ph ơng th c, th tục hoặc hàm có bao nhiêu tham s hình th c và ki u c a chúng là gì đ truy n vào cho chúng các tham s thực t ơng ng cho đúng yêu cầu c a bạn.

Ví dụ v i cú pháp th tục có sẵn trong Delphi là: procedure ShowMessage(const Msg: string);

thì bạn chỉ cần lấy ra sử dụng v i câu lệnh đơn giản nh sau: Sh║╙εe╕╕⌠ge(‘T║i d⌠═g h║c Del╒hi d⌠╛ ═he!…’);

Các bạn sẽ đ ợc h c chi tiết các khái niệm này trong ch ơng “Lập Trình Xử Lý Sự Kiện” và “Ch ơng Trình Con” các phần sau.

Page 43: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 4: Các ki u dữ liệu sơ cấp chuẩn, lệnh đơn

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 37

VI. L nh Goto

Từ thân ch ơng trình con, bạn có th sử dụng lệnh goto đ chuy n h ng thực hiện ch ơng trình t i một v trí bất kỳ thông qua một nhưn đư đ ợc khai báo tr c.

Cú pháp lệnh goto: Goto nhãn; V i nhưn đ ợc khai báo v i cú pháp sau: Label Tên_nhãn;

Lệnh goto là lệnh nhảy không đi u kiện, nó chuy n h ng thực thi c a ch ơng trình đến v trí mà nhưn đang đ ng.

Trong phong cách lập trình OOP, lệnh goto t ra b lỗi th i và rất ít khi đ ợc dân lập trình sử dụng.

Ví d 9: Minh h a lệnh goto đ tính bi u th c a/b. Từ File/New/Other, DClick vào Console Application đ m ra 1 dự án m i và nhập

các dòng lệnh đ hoàn chỉnh nh hình sau:

Hình 7: Ví dụ minh h a lệnh goto và khai báo nhãn - label

Nhấn phím ch c năng F9 đ chạy ch ơng trình, và ta có kết quả chế độ Console nh sau:

Hình 8: Kết quả ch ơng trình.

Page 44: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 38

CH NG 5: L P TRÌNH X Lụ S KI N ậ CÁC THẨNH PH N

TRONG GIAO DI N DELPHI

I. L p trình x lỦ s ki n

I.1. Lớp (Class) vƠ đối t ng (Object) Trong các ch ơng tr c, các bạn đư đ ợc biết đến cách lập trình tuần tự chế độ

Console Application và biết đ ợc một s khái niệm cơ s . ch ơng này, các bạn sẽ đ ợc trình bày một ph ơng pháp lập trình chính c a giáo trình và rất phổ biến hiện nay đó là lập trình sự kiện dựa trên n n tảng c a lập trình h ng đ i t ợng (OOP: Object-Oriented Programming).

Trong cuộc s ng, bạn thấy có nhi u đ i t ợng đ ợc xếp chung vào một loại/l p, chẳng hạn nh những ng i còn đi h c ta xếp chung v i một l p đó là l p SINHVIểN, những ng i đi làm việc thì xếp vào l p CBCNV. Nh vậy ta có hình ảnh nh sau: tất cả m i ng i đ u đ ợc xếp chung vào một l p trên cùng là l p NG I. Ta cũng có th phân chia những ng i trong l p NG I này thành hai nhóm là SINHVIểN và CBCNV dựa vào tính chất đ phân biệt là đang đi làm hay còn đi h c.

Hình 1: Mô hình các l p

Cụ th : Nếu xét một gia đình công ch c gồm 4 thực th ng i là ng i A – cha, B - mẹ: đi làm; anh C, ch D: đang đi h c chẳng hạn, thì nh thế ta có 2 đ i t ợng A, B đ ợc tạo ra từ l p CBCNV và 2 đ i t ợng C, D đ ợc sinh ra từ l p SINHVIểN và cả 4 đ i t ợng này đ u có những tính chất chung đ ợc thừa h ng từ l p NG I, và nh vậy 2 l p SINHVIểN và CBCNV là các l p dẫn xuất từ l p NG I.

I.1.1. Lớp (Class) L p là một khái niệm đ ợc sử dụng rất nhi u trong cách lập trình OOP. Việc hi u rõ

các kiến th c v l p thì nằm ngoài phạm vi c a giáo trình này. Do vậy, giáo trình chỉ đ a ra các khái niệm rất cơ bản v l p, mục đích đ các bạn dễ hi u hơn v đ i t ợng (Object), là một thành phần rất phổ biến trong lập trình c a Delphi. Nh vậy, l p đ ợc dùng đ đ nh nghĩa ra ki u dữ liệu cấu trúc mà nó bao gồm 3 thành phần cơ bản:

- Các tr ng (Fields): là các biến dữ liệu c a l p.

NG I - H tên

- Ngày sinh

- Phái

- v.v...

- Mư cán bộ

- Bậc l ơng

- v.v...

- v.v...

- Mư s SV

- Ngành h c

- v.v...

SINHVIÊN

CBCNV

Page 45: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 39

- Các ph ơng th c (Methods): là các hàm hay th tục đ thực hiện thao tác nào đó trên đ i t ợng. Có 2 ph ơng th c đặc biệt trong l p mà bạn cần l u ý đó là ph ơng th c tạo (Constructor) và ph ơng th c h y (Destructor) sẽ đ ợc dùng khi một đ i t ợng (Object) đ ợc tạo nên hoặc b h y.

- Các thuộc tính (Attributes) cuả một l p bao gồm các biến, các hằng, hay tham s nội tại c a l p đó. Tính chất quan tr ng nhất c a các thuộc tính khi chúng là biến là có th b thay đổi trong quá trình hoạt động c a một đ i t ợng. Thông th ng đ truy xuất các biến tr ng, ta dựa vào trạng thái c a thuộc tính là đ c (read) hay ghi (write) đ nhận hay là thiết lập giá tr cho chúng.

L p đ ợc khai báo theo cú pháp nh sau:

type className = class (ancestorClass) memberList

end;

Trong đó: - ancestorClass là l p cha/tổ tiên c a l p dẫn xuất (descendant) là className, l p

className sẽ đ ợc thừa h ng (inheritance) từ l p cha. Trong Delphi l p th y tổ là l p TObject.

- memberList là các thành phần c a l p là tr ng, ph ơng th c và thuộc tính c a l p đư đ ợc trình bày trên.

Trong ví dụ giải ph ơng trình bậc nhất trên, ta có một l p TfrmPTB1 đ ợc dẫn xuất từ l p cha là l p TForm, l p TForm lại đ ợc dẫn xuất từ l p TCustomForm,... và c thế nó đ ợc dẫn xuất từ l p th y tổ trong Delphi là l p TObject nh hình sau:

Hình 2: L p TfrmPTB1 và các l p tổ tiên (Ancestor Classes) c a nó

Page 46: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 40

Ví d 1: Khai báo l p TfrmPTB1 cho form unit untPtb1.Pas ví dụ trên nh sau: type

TfrmPTB1 = class(TForm)

lbl_a: TLabel;

lbl_b: TLabel;

edt_a: TEdit;

edt_b: TEdit;

lbl_KQua: TLabel;

memKQua: TMemo;

pnlLine: TPanel;

btnXuLy: TButton;

btnKetThuc: TButton;

procedure btnXuLyClick(Sender: TObject);

procedure btnKetThucClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

I.1.2. Đối t ng (Object) Đ i t ợng là thực th (Instance) đ ợc sinh ra từ một l p (Class), hay nói cách khác

khi ta khai báo một biến thuộc một l p nào đó, thì biến đó chính là một đ i t ợng m i đ ợc cấp phát. Đ i t ợng này đ ợc tạo ra b i ph ơng th c constructor và sẽ b giải phóng b i ph ơng th c destructor.

* Quy cách đặt tên đối t ng: Trong phong cách lập trình chuyên nghiệp, quy c đặt tên cho đ i t ợng th ng

đ ợc ghép 2 phần: ti n tố vƠ tên g i nhớ c a đ i t ợng đó. Ti n t th ng có 3 ký tự đ xác đ nh đ i t ợng đó thuộc loại thành phần nào. Trong giáo trình này gợi ý cho các bạn các ti n t (prefix) cho các đ i t ợng c a các thành phần nh sau:

Đối t ng Ti n tố Ví d

Form frm frmWelcome, frmMain

Label lbl lblHeSo, lblHoTen

Edit edt edt_a, edtHoTen

Button btn btnGiai, btnXuLy

SpinEdit: spe speNhietDo, speGia1TC

LabeledEdit lbe lbeDonGia, lbeThanhTien

ListBox lbx lbxBaiHat, lbxFont

CheckBox chk chkMatHang, chkDelphi

ComboBox cbo cboToanTu, cboPhai

GroupBox gbx gbxMonHoc, gbxMatHang

Page 47: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 41

Đối t ng Ti n tố Ví d

CheckListBox clb clbTenMH, clbDMVT

ValueListEditor vle vleMatHang, vleBaoGia

Memo mem memDanhSach, memKQ

RadioButton rbt rbtNam, rbtNu

RadioGroup rgp rgpGioiTinh, rgpCourses

StringGird stg stgAlphabet, stgMaTranA

Panel pnl pnlDieuKhien, pnlDrives

PopupMenu pmu pmnMauSac, pmnGames

MainMenu mmu mmuMainForm, mmuQLSV

MenuItem mni mniCopy, mniPaste

B ng 1: Quy cách đặt tên các đ i t ợng

Ví d 2: Khai báo một thực th (đ i t ợng) frmPTB1 nh sau:

var

frmPTB1: TfrmPTB1; // đ i t ợng frmPTB1 c a l p TFrmPTB1

Lập trình h ng đ i t ợng là sự gắn kết giữa dữ liệu và các hàm xử lý dữ liệu tạo thành đ i t ợng. Mỗi đ i t ợng bao gồm:

- Thuộc tính (Properties): là dữ liệu c a đ i t ợng.

- Ph ơng th c (Methods): là những hành động mà đ i t ợng có th thi hành.

- Sự kiện (Events): là những hành động c a đ i t ợng đó đáp ng lại thông qua th tục sự kiện do ng i lập trình cài đặt, khi ng i dùng t ơng tác v i ch ơng trình.

Ví d 3: Trong ch ơng này, các bạn sẽ đ ợc h c cách sử dụng các thuộc tính và các sự kiện c a các đ i t ợng thông qua một ch ơng trình đầu tiên là “prjWelcome.dpr”

- B ớc 1: Bạn vào ch c năng: File/New/Application đ tạo ra dự án m i.

Hình 3: Hình ảnh c a New Form.

Từ cửa sổ thuộc tính và sự kiện c a đ i t ợng (Object Inspector), dựa vào thuộc tính name, bạn đặt tên cho form là frmWelcome đ Delphi đ nh nghĩa ra 1 l p có tên là TfrmWelcome đ ợc dẫn xuất từ l p cha là TForm nh sau:

Page 48: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 42

type

TfrmWelcome = class(TForm)

// memberList

end;

Và khai báo một đ i t ợng có tên là frmWelcome thuộc ki u l p TfrmWelcome nh sau: var

frmWelcome: TfrmWelcome;

Hình 4: Hình ảnh l p TfrmWelcome và đ i t ợng frmWelcome

- B ớc 2: Từ bảng các thành phần (Component Palette), click vào thẻ Standard rồi lần l ợt đặt các thành phần TLabel, TEdit, và TButton lên Form:

Page 49: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 43

Hình 5: Các đ i t ợng Label, Edit và Button đặt trên Form.

Trong môi tr ng lập trình IDE, các l p trong Delphi th ng đ ợc cài đặt thành các thành phần (TComponent) đ ng i lập trình dễ dàng thừa h ng khi thiết kế và viết mư lệnh. Nh vậy: Tên l p cũng chính là tên thành phần.

Từ đây v sau, thuật ngữ “đối t ng A c a một thƠnh ph n TA” đ ợc viết ngắn g n là “đối t ng A”.

Ví d 4: Câu lệnh frmWelcome:TForm; đ c đầy đ là “đ i t ợng frmWelcome thuộc l p (thành phần) TForm”. Tuy nhiên, ta có th đ c g n lại nh : “đối t ng frmWelcome”, hoặc câu lệnh btnGiai:TButton; đ ợc đ c là “nút l nh btnGiai” hay “đối t ng btnGiai”.

I.2. Thuộc tính

Mỗi thành phần đ u có những thuộc tính đ xác đ nh những đặc tính c a thành phần đó chẳng hạn nh màu sắc (Color), v trí (Position), kích th c và trạng thái (State) c a chúng. Trong các thuộc tính này, bạn cần quan tâm nhất đến thuộc tính tên (Name) c a đ i t ợng.

- B ớc 3: Lần l ợt thiết lập các thuộc tính Name, Caption cho đ i t ợng Label và các thuộc tính Name, Text cho đ i t ợng Edit:

Hình 6: Cửa sổ thuộc tính và sự kiện c a đ i t ợng lblHoTen và edtHoTen

T ơng tự, đ i t ợng thuộc thành phần TButton có thuộc tính Name là btnChao và Caption là “&Chao”, đ i t ợng c a TForm có thuộc tính Name là frmWelcome và Caption là “Welcome to Delphi 7.0”

Cách truy xuất thuộc tính c a đ i t ợng:

Tên_đối_t ng.Thuộc_tính

Tên l p

Tên đ i t ợng

Page 50: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 44

Ví d 5: Gán thuộc tính Enabled c a lblHoTen bằng True là:

lblHoten.Enabled := True;

I.3. Ph ng thức (Method) Là th tục (Procedure) hoặc hàm (Function) đư đ ợc xây dựng sẵn cho công việc nào

đó c a đ i t ợng. Ta có th g i ph ơng th c này trong quá trình viết mư (Coding) đ chúng thi hành khi ch ơng trình chạy.

Cách truy xuất ph ơng th c đ i t ợng:

Tên_đối_t ng.Ph ng_thức;

Ví d 6: G i ph ơng th c Hide và Show đ thực hiện việc ẩn và hiện c a đ i t ợng frmWelcome là: frmWelcome.Hide;

và frmWelcome.Show;

I.4. S ki n (Event) Đó chính là một thao tác c a ng i sử dụng tác động lên đ i t ợng và nó sẽ đáp ng

lại bằng việc thực hiện một công việc nào đó. Các sự kiện thông th ng là trên mouse và keyboard nh : Click, RightClick, DoubleClick, KeyPress, Drag and drop,…

Hình 7: Sự kiện OnClick c a btnChao

Nh hình trên, đ i t ợng btnChao có nhi u sự kiện nh : OnClick, OnContextPopup, OnDragDrop,... c a tab Event t ơng ng trên cột Action. Mỗi sự kiện này t ơng ng v i một th tục sự kiện đ xử lý sự kiện đó (Event handers) nằm cột bên phải t ơng ng.

Tên sự kiện

Tên th tục sự kiện sự kiện.

Page 51: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 45

I.5. X lỦ s ki n (Event Handlers)

Đó chính là th tục sự kiện, thân th tục sự kiện này bao gồm các câu lệnh mà ng i lập trình viết trong nó đ thực hiện một công việc, ch c năng nào đó.

Cách hình thành th tục sự kiện:

procedure Tên_Thành_Phần_Form.Tên_đ i_t ợngSự_kiện([DanhSáchCácThamS ]);

Ví d 7: Th tục sự kiện OnClick cho nút lệnh btnChao c a frmWelcome (hay còn

g i là th tục sự kiện btnChaoClick c a l p TfrmWelcome) đ ợc hình thành nh sau:

procedure TfrmWelcome.btnChaoClick(Sender: TObject);

- B ớc 4: hình 5, nhắp đúp lên nút lệnh Chao, hoặc hình 7 bạn nhắp đúp lên cột bên phải c a sự kiện OnClick t ơng ng đ m ra một th tục sự kiện có tên là TfrmWelcome.btnChaoClick (Sender: TObject) nh sau:

Hình 8: Th tục sự kiện btnChaoClick m i tạo c a sự kiện OnClick

Tiếp đến bạn gõ một s lệnh vào trong thân c a th tục sự kiện nh hình sau:

tên thành phần hay tên l p form

tên nút lệnh btnChao

sự kiện OnClick

Page 52: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 46

Hình 9: Viết code cho th tục sự kiện btnChaoClick

I.6. Trình h tr mư l nh (Code Completion /IntelliSense) Trong cách lập trình h ng đ i t ợng (OOP) và nhất là khi ngôn ngữ lập trình có

hỗ trợ môi tr ng phát tri n IDE thì s thuộc tính, ph ơng th c, sự kiện và các th tục sự kiện c a từng đ i t ợng là vô cùng phong phú (do tính thừa h ng). Việc nh chính xác cú pháp c a chúng là một việc làm không t ng đ i v i bất kỳ một lập trình viên nào (vì không chỉ có duy nhất một ngôn ngữ lập trình Delphi!). Đ giúp cho ng i lập trình "dễ th " hơn, Delphi có đ a ra menu ngữ cảnh rất hữu ích đ hỗ trợ cho việc viết code này và đ ợc g i là Trình h tr mư l nh (Code Completion).

Trong lúc bạn viết code, khi bạn gõ tên đ i t ợng rồi đến dấu chấm, thì Code Completion sẽ xuất hiện nh hình sau:

Hình 10: Trình hỗ trợ mư lệnh

II. Sinh mư t động vƠ một số cách s a l i

II.1. Cách t động sinh mư (generate code) trong Delphi - Khi mới tạo m i một dự án (Form Application) nh hình ảnh sau:

Page 53: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 47

Hình 11: Mư lệnh sinh tự động trong dự án m i.

thì bạn thấy tên ki u (Type) l p TForm1 đ ợc xây dựng thông qua l p (Class) dẫn xuất từ l p cha là l p TForm. Trong ki u TForm1 (không k sự thừa h ng từ l p TForm) ch a có thuộc tính (Properties), Ph ơng th c (Methods) hoặc sự kiện (Events) nào c a chính nó, nh bạn thấy trong đoạn code sau đây:

type

TForm1 = class(TForm)

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

- Khi bạn đặt lên form (hoặc gỡ b ) một đ i t ợng (Object) c a đ i t ợng bất kỳ nh Button, Edit,... thì tên (name) c a đ i t ợng đó sẽ đ ợc tự động thêm vào (hoặc xóa b đi) trong phần thuộc tính (Property) c a Form phần đ nh nghĩa ki u l p Form. Chẳng hạn, bạn thêm vào đ i t ợng Button1 thuộc thành phần TButton (ngắn g n là Button1: TButton) lên Form nh hình sau:

Page 54: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 48

Hình 12: Thêm nút lệnh Button1

thì đoạn code sẽ tự động thêm vào biến dữ liệu là Button1: TButton nh sau: type

TForm1 = class(TForm)

Button1: TButton; //mới ╖ự độ═g ╕i═h m╬ ╖h▐m private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

- Khi bạn tạo ra 1 th tục sự kiện dựa trên sự kiện nào đó, thì Delphi sẽ tự động khai báo (Declare) thêm phần nguyên mẫu (Prototype) c a th tục sự kiện trong phần dữ liệu (thuộc tính – Properties) c a l p. Chẳng hạn, bạn tạo ra th tục (Procedure) c a sự kiện (Event) nhắp chuột (OnClick) c a nút lệnh có tên Button1, thì Delphi sẽ tự động thêm vào phần khai báo th tục sự kiện trong l p TForm1 nh đoạn code sau:

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject); //mới thêm vào private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

và sự cài đặt (Implementation) các câu lệnh cho th tục sự kiện mà ta m i tạo sau từ khóa implementation, nh đoạn code sau:

Page 55: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 49

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//------------ phần cài đặt th tục m i đ ợc tự động thêm vào ---------------- procedure TForm1.Button1Click(Sender: TObject);

begin

end;

// ---------------------------------------------------------------------------------------

end. // Kết thúc Form Unit.

II.2. Cách s a l i sinh mư trong Delphi Khi bạn m i h c sử dụng Delphi, nhất là khi m i làm quen v i lập trình, thì việc phát

sinh ra các lỗi (errors, bugs) do thao tác không đúng hoặc ch a hi u đầy đ kiến th c v OOP là dễ gặp phải. đây, sẽ chỉ ra những sai sót th ng gặp và cách sửa chúng.

a. Sai trong thao tác t o th t c s ki n: Nếu bạn làm đúng h ng dẫn trong phần

"Xử lý sự kiện" (phần I.5) thì không b sai. Tuy nhiên do ch a quen, bạn th ng tự gõ vào phần cài đặt th tục sự kiện (TTSK) mà không biết hoặc quên đ a vào phần khai báo nguyên mẫu (Prototype), gồm từ khóa procedure Tên_TTSK([các_tham_s ]); c a th tục sự kiện.

Ví dụ nh đoạn code sau:

type

TForm1 = class(TForm) Button1: TButton;

{--------- ╖hiế╗ kh⌠i ⌡╨║ ═g╗╛▐═ mẫ╗ ═╩╛ ----- procedure Button1Click(Sender: TObject);

------------------------------------------------}

Page 56: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 50

private { Private declarations }

public { Public declarations }

end;

var Form1: TForm1;

implementation

{$R *.dfm}

// ------------ phần bạn tự gõ vào -------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject);

begin ShowMessage('Welcome to Delphi 7.0!...');

end; // ---------------------------------------------------------------------------------------

end. // Kết thúc Form Unit.

thì khi bạn biện d ch, Delphi sẽ thông báo lỗi nh hình sau:

Hình 13: Báo lỗi do thiếu phần khai báo prototype

Khi xuất hiện hộp thông báo lỗi này, bạn có 3 ch n lựa: - Ch n nút lệnh Yes, nếu mu n gỡ b tên th tục sự kiện trong sự kiện t ơng ng c a

đ i t ợng. Trong ví dụ này, bạn mu n gỡ b TTSK Button1Click trong sự kiện OnClick c a nút lệnh Button1.

Page 57: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 51

Ch a gỡ b TTSK Đư gỡ b TTSK

Hình 14: Minh h a tên TTSK Button1Click trong sự kiện OnClick

- Ch n nút lệnh No, nếu không gỡ b tên th tục sự kiện trong sự kiện t ơng ng c a đ i t ợng. Trong ví dụ này, bạn vẫn mu n giữ lại TTSK Button1Click trong sự kiện OnClick c a nút lệnh Button1.

- Ch n nút lệnh Cancel thì h y b bảng thông báo lỗi này. Đi u này cũng nh ch n nút lệnh No.

Cả 3 ch n lựa trên vẫn không tự động sửa hết lỗi cho bạn. Nếu bạn nhấn phím Ctrl+F9 hoặc F9, thì Delphi sẽ nhảy con tr (con nháy) đến đúng phần cài đặt TTSK và thông báo lỗi trong cửa sổ Messages phía d i c a sổ soạn thảo mư lệnh nh hình sau:

Hình 15: Cửa sổ Messages

Hình ảnh phần cửa sổ soạn thảo mư lệnh cùng v i các cửa sổ khác.

Gỡ b TTSK

Page 58: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 52

Hình 16: Thông báo lỗi và con nháy nhảy đến TTSK b lỗi.

Đ sửa lỗi này, bạn chuy n lên phần đ nh nghĩa l p TForm1, và thêm vào phần khai báo (Prototype) c a th tục sự kiện này nh sau:

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject); //gõ thêm vào

private

{ Private declarations }

public

{ Public declarations }

end;

Cần chú ý: Nếu b c trên bạn ch n Yes, thì sau khi hết lỗi bạn phải gắn tên TTSK vào sự kiện t ơng ng cho đ i t ợng Button1; Còn nếu ch n No thì tên TTSK vẫn còn giữ nguyên (đư gắn sẵn) cho bạn.

- Một lỗi khác là bạn m TTSK không đ ợc nh khi bạn DClick lên nút lệnh Button1 thì có thông báo lỗi nh sau:

Page 59: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 53

Hình 17: Lỗi không th tạo TTSK

trong t ng hợp này, bạn ch n OK, sau đó nhấn phím ch c năng F12 đ chuy n vào cửa sổ soạn thảo mư lệnh đ sửa lỗi.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

end. //Nguyên nhân phát sinh lỗi, bạn xóa b lệnh này đi.

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage('Welcome to Delphi 7.0!');

end;

end.

Page 60: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 54

- Một lỗi khác th ng xảy ra là bạn xóa đi từ khóa end.trong tập tin unit thì sẽ nhận đ ợc thông báo:

Hình 18: Lỗi thiếu từ khóa end. trong unit form

Đ sửa lỗi này, bạn nhấn phím ch c năng F12 đ chuy n sang c a sổ mư lệnh, rồi thêm từ khóa end. vào cu i tập tin unit. * Tóm l i: Có rất nhi u lỗi khác nhau phát sinh nếu bạn thao tác không chính xác. Cần phải chú ý 2 đi m:

- Thao tác đúng theo sự h ng dẫn đư trình bày trong giáo trình. - Một TTSK phải đầy đ 2 thành phần:

+ Phần khai báo tên th tục (Prototype) trong phần đ nh nghĩa l p c a Form. + Phần cài đặt đầy đ TTSK sau phần cài đặt (Implementation).

II.3. Thêm t p tin unit vƠo d án

Việc này giúp cho bạn, tr ng nhóm lập trình viên hay ch dự án (group leader, leader team) có th ghép nhi u form khác nhau những project khác nhau c a những lập trình viên khác nhau viết, thành một dự án (thành phẩm) cu i cùng.

Ví d : Bạn thử t ng t ợng sự phân công công việc c a 1 sản phẩm "Giải Ph ơng Trình" có 2 ph ơng trình bậc nhất và bậc hai. Tr ng nhóm, anh A, phân công cho lập trình viên B viết ch ơng trình giải ph ơng trình bậc nhất (tên form: frmPTB1, unit file: untPTB1.pas, project file: prjPTB1.dpr) và lập trình viên C viết ch ơng trình bậc hai (tên form: frmPTB2, unit file: untPTB2.pas, project file: prjPTB2.dpr). Công việc c a anh A là viết giao diện (Interface) cho gói sản phẩm này (tên form: frmMain, unit file: untMain.pas, project file: prjMain.dpr). Sau khi phần ch ơng trình viết riêng biệt c a mỗi anh A, B, C đư xong, thì anh A sẽ ghép thêm frmPTB1, frmPTB2 vào dự án c a anh ta trong đó frmMain là giao diện c a ch ơng trình.

Tổ ch c c a sản phẩm "Giải Ph ơng Trình" đ ợc đặt trong 3 th mục con c a th mục S:\GT Del-03.2007\Add Form nh hình sau:

Page 61: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 55

Hình 19: Cấu trúc th mục c a sản phẩm "Giải Ph ơng Trình"

Đ làm đ ợc đi u này, từ dự án đang m c a anh A, dùng lệnh Project/ Add To Project... Shift+F11 đ thêm frmPTB1, untPTB1.pas vào dự án prjMain.dpr nh hình sau:

Hình 20: Thêm unit form untPTB1.pas vào dự án c a anh A

tiếp đến, bạn ch n tập tin unit form untPTB1.pas trong th mục PTB1 (dự án c a anh B) và nhấn nút lệnh Open đ thêm vào.

Page 62: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 56

Hình 21: Cửa sổ thêm untPTB1.pas vào dự án chính.

Hoàn toàn t ơng tự, bạn thêm vào unit form untPTB2.pas trong th mục PTB2 (dự án c a anh C).

Và nh vậy trong sản phẩm c a anh A bây gi là 1 dự án có 3 form, nh hình sau:

Hình 22: Dự án anh A đư ch a đầy đ 3 form.

Trong tập tin dự án (Project file: prjMain.dpr) có sự tham chiếu (Reference/link) t i các tập tin unit form trong các folder c a anh B và anh C nh hình sau:

Page 63: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 57

Hình 23: Sự tham chiếu t i các unit form: untPTP1.pas và untPTP2.pas

T i đây, câu h i đ ợc đặt ra là trong th mục c a anh A đư ch a đầy đ các tập tin c a sản phẩm ch a? Liệu bạn có th xóa b đi 2 th mục PTB1 và PTB2 không? Câu trả l i là không. Một yêu cầu đ ợc đặt ra là anh A (tr ng nhóm) mu n tất cả các tập tin chỉ nằm trong 1 folder c a anh ta (th mục S:\GT Del-03.2007\Add Form\Main) thì làm nh thế nào? Câu trả l i là anh A sẽ l u lại unit file: untPTB1.pas (t ơng tự cho untPTB2.pas) vào th mục Main bằng lệnh File/Save As nh sau:

Hình 24: L u lại untPTB1.pas vào th mục c a anh A

Xem lại tập tin dự án, bạn thấy các tham chiếu t i các unit file đư nằm trong th mục hiện hành (c a anh A):

Page 64: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 58

Hình 25: Các tập tin unit form đư trong cùng 1 th mục anh A

II.4. Vi t l nh sau khi thêm unit form vƠo d án

Bây gi , từ main form (frmMain), anh A mu n hi n th (Show) form c a anh B hoặc anh C thì sao? Chẳng hạn khi Click vào mục Bac 1 trong thực đơn Giai phuong trinh đ hi n th form PTB1 lên nh hình sau:

Hình 26: Hi n th form "Phuong trinh bac nhat"

Đ làm đ ợc thì anh A sẽ gõ thêm câu lệnh frmPTB1.Show; đ hi n th frmPTB1:

Page 65: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 59

Hình 27: Không xuất hiện trình Code Completion

Tuy nhiên, trình hỗ trợ mư lệnh c a Delphi (Code Completion) không tự động xuất hiện đ anh A ch n ph ơng th c Show mà lại xuất hiện thông báo lỗi trong cửa sổ Messages nh sau:

"[Pascal error] untMain.pas(1): Unable to invoke Code Completion due to errors in source code".

Thông báo lỗi này phát sinh là do trong tập tin untMain.Pas, bạn ch a khai báo sử dụng unit untPTB1 thông qua từ khóa uses

Hình 28: Ch a có khai báo unit untPTB1 và untPTB2

Page 66: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 60

Có 02 cách đ b n s a l i nƠy: - Cách 1: Nếu bạn biết chính xác tên ph ơng th c mà bạn cần, thì bạn c việc gõ

tiếp ph ơng th c Show nh sau: frmPTB1.Show; (bất chấp thông báo lỗi – không đ ợc hỗ trợ b i menu Code Completion). Sau đó, bạn biên d ch lại (nhấn tổ hợp phím Ctrl+F9), sẽ xuất hiện thông báo nh sau:

Hình 29: Thông báo thiếu khai báo unit untPTB1

Bạn Click nút lệnh Yes đ Delphi tự động khai báo thêm untPTB1 vào tập tin unit untMain. T ơng tự cho unit frmPTB2, ta cũng Click nút lệnh Yes đ thêm vào.

Hình 30: Thông báo thiếu khai báo unit untPTB2

Sau 2 b c trên, đoạn khai báo các unit sẽ nh sau:

Page 67: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 61

Hình 31: Đư khai báo xong 2 unit: untPTB1, untPTB2

- Cách 2: Vì trong unit untMain, anh A sử dụng frmPTB1 và frmPTB2. Do vậy, tr c khi anh A viết code cho 2 TTSK trên, anh A phải gõ thêm khai báo việc sử dụng 2 unit: untPTB1 và untPTB2, rồi m i viết lệnh frmPTB1.Show; vào. Cách này t t và chính xác hơn cách 1 vì có trình Code Completion hỗ trợ cho bạn khi viết lệnh nh hình sau:

Hình 32: Thêm khai báo unit tr c và có trình Code Completion

Chú ý: Bạn có th sử dụng lệnh File/Use Unit... đ thêm unit vào dự án hiện hành.

Page 68: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 62

II.5. G bỏ t p tin unit form ra khỏi d án

Công việc này giúp bạn loại b ra kh i dự án (Project) những form (unit file) không cần thiết, hoặc b sai. Đ gỡ b , bạn ch n ch c năng Project/Remove from Project...

Ví d 8: Anh A, tr ng nhóm, thấy phần ch ơng trình c a anh C – Ph ơng trình bậc hai, viết còn ch a t t (hay còn bugs). Anh A đ ngh anh C hoàn chỉnh và ki m tra (testing) phần ch ơng trình lại, sau đó g i lại đ anh A đóng gói thành phẩm. Nh vậy, anh A tạm th i gỡ b (remove) phần ch ơng trình c a anh C ra kh i dự án hiện hành. Đ làm việc đó, anh A ra lệnh Project/Remove from Project... thì Delphi sẽ xuất hiện hộp thoại "Remove From Project", rồi ch n unit untPTB2 và Click OK nh hình sau:

Hình 33: Cửa sổ gỡ b tập tin unit

Delphi yêu cầu bạn khẳng đ nh lại công việc gỡ b này ra kh i dự án, bạn ch n Yes đ gỡ b :

Hình 34: Hộp xác nhận việc gỡ b

III. Bi u m u (TForm)

Form là một đ i t ợng chuyên dụng trong môi tr ng lập trình Windows. Trong bi u mẫu form này, bạn có th đặt các đ i t ợng thuộc thành phần khác nh TLabel, TEdit, TButton,... lên nó đ thiết kế giao diện c a ch ơng trình hay còn đ ợc g i là Form chính (Main form) hoặc các bi u mẫu phụ khác trong dự án.

* Bi u t ợng:

Page 69: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 63

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng form, tên này phải có tính gợi nh đ giúp bạn dễ quản lý và lập trình, nhất là khi bạn tham gia vào những dự án l n. (Xem lại Bảng1: Quy cách đặt tên các đ i t ợng).

AutoSize Có giá tr True hoặc False: tự động hay không tự động thay đổi kích th c c a form sao cho kích th c c a nó vừa đ đ ch a các thành phần (component) đặt trong nó.

Caption Chuỗi ký tự đ ợc hi n th trên thanh tiêu đ (Title bar) c a form.

BorderStyle

Các ki u dáng hi n th form: - bsDialog: là hộp hội thoại, không thay đổi kích th c đ ợc. - bsSingle: Đ ng vi n khung đ ợc kẻ đ ng 1 nét và không thay

đổi đ ợc kích th c c a form. - bsNone: Không có đ ng vi n khung và không thay đổi đ ợc

kích th c c a form. - bsSizeable: Dạng chuẩn/ mặc nhiên c a form. Đây là dạng một cửa

sổ rất phổ biến trên môi tr ng lập trình Windows. - bsToolWindow: Gi ng bsSingle, nh ng thanh tiêu đ nh hẹp hơn. - bsSizeToolWin: Gi ng bsSizeable, nh ng thanh tiêu đ nh hẹp

hơn.

BorderIcons

Xác đ nh trên thanh tiêu đ có hộp đi u khi n hay còn g i là hộp “Control box”, “Control menu” và “System menu” bên trái thanh tiêu đ và các nút đi u khi n bên phải thanh tiêu đ : - biSystemMenu: Form có hộp đi u khi n. - biMinimize : Form có nút thu nh (Minimize) - biMaximize : Form có nút phóng to (Maximize), phục chế (Restore) - biHelp : Form có nút trợ giúp nếu bạn thiết lập giá tr c a

biMinimize = False và biMaximize = False.

Cursor Các ki u dáng hi n th con tr (Mouse) trên form.

Form style

Các ki u form: (MDI: Multi Document Interface) - fsMDIForm: MDIForm (Multi Document Interface) là form

MDI cha c a tất cả các form khác (nếu có) trong ch ơng trình. Khi bạn đóng MDIForm, thì đồng nghĩa v i việc đóng tất cả các form khác và kết thúc ch ơng trình.

- fsMDIChild: Đây là form MDI con. Trong ch ơng trình, bạn có th m ra nhi u cửa sổ MDIChild.

Đ dễ hi u, bạn có th xem MDIForm chính là cửa sổ ng dụng phần m m Microsoft Word, còn MDIChild chính là các cửa sổ tập tin nh Document1, Document2,... đ ợc tạo ra thông qua lệnh File/New

- fsNormal: Là loại form th ng dùng nhất và đây cũng là giá tr mặc đ nh (Default) khi bạn thêm 1 form m i. Loại form này không có tính chất c a loại form MDI.

- fsStayOnTop: giúp cho form luôn nổi lên trên nhất, ngay cả khi có form khác đang hoạt động (Active).

Page 70: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 64

Tên thuộc tính ụ nghĩa

Color Màu n n

Font Xác đ nh các thuộc tính v font nh : ki u chữ, màu, cỡ,...

Icon Bi u t ợng c a ch ơng trình dự án. Bi u t ợng này đ ợc nạp vào thông qua cửa sổ Picture Editor.

MainMenu Xác đ nh thanh thực đơn chính cho form thông qua thuộc tính name c a thành phần TMainMenu đư đ ợc lên form.

PopupMenu Xác đ nh menu đ i t ợng cho form thông qua thuộc tính name c a thành phần TPopupMenu đư đặt đ ợc lên form.

Position

Xác đ nh v trí hoặc kích th c c a form khi nó xuất hiện trên màn hình khi chạy ch ơng trình: - poDefault: do hệ th ng c a Delphi quyết đ nh

- poDefaultPosOnly: Delphi chỉ quyết đ nh v trí c a form còn kích th c thì vẫn giữ nguyên nh lúc thiết kế.

- poDefaultSizeOnly: Delphi chỉ quyết đ nh kích th c c a form còn v trí nh lúc thiết kế.

- poDesigned: nh tại th i đi m thiết kế. - poDesktopCenter: V trí c a form nằm trung tâm màn hình. - poScreenCenter: Gi ng nh poDesktopCenter (không xét đến ng

dụng đa màn hình, multi-monitor).

- poMainFormCenter: th ng đ ợc thiết lập cho các form không phải là form chính (Main form). Các form đ ợc thiết lập theo giá tr này sẽ đ ợc hi n th trung tâm form chính.

- poOwnerFormCenter: th ng đ ợc thiết lập cho các form không phải là form chính. Khi form đ ợc thiết lập giá tr này, thì nó xuất hiện trung tâm c a form ch c a nó (Owner).

WindowMenu Dành cho MDI form.

Visible Có giá tr True hoặc False: Có xuất hiện hay không khi chạy ch ơng trình.

WindowState

Các giá tr có ý nghĩa nh sau: - wsNormal: trạng thái thông th ng. Cách th c hi n th cửa sổ

form sẽ gi ng nh các giá tr đư đ ợc thiết lập trong thuộc tính BorderStyle.

- wsMinimized: Cửa sổ form sẽ thu nh v thanh tác vụ (Task bar). - wsMaximized: Cửa sổ form sẽ đ ợc phóng to toàn bộ màn hình. Hai ch c năng wsMinimized và wsMaximized chỉ có hiệu lực khi thuộc tính BorderStyle có giá tr là bsNone, bsSingle, hoặc bsSizeable.

B ng 2: Các thuộc tính c a TForm.

* Một s sự kiện th ng dùng:

Tên s ki n S ki n sẽ đáp ứng

ActiveControl Xác đ nh đ i t ợng c a thành phần (Component) nào trên form nhận focus khi form hi n th . Bạn xem ch c năng này t ơng

Page 71: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 65

Tên s ki n S ki n sẽ đáp ứng

đ ơng v i việc đặt TabOrder c a đ i t ợng này bằng 0.

ObjectMenuItem Xác đ nh MenuItem nào c a MainMenu tr nên không kích hoạt đ ợc (Enabled = False) khi form đ ợc hi n th . Ch c năng này rất phổ biến trên Windows ví dụ nh việc sao chép (Copy) và dán (Paste) chẳng hạn: Khi ch a thực hiện ch c năng Copy thì ch c năng Paste không kích hoạt đ ợc.

OnActivate Khi form tr nên hoạt động (hiện hành)

OnCreate Khi form đ ợc tạo ra. Đây là sự kiện đ ợc thực hiện tr c hết m i sự kiện c a form.

OnShow Khi form đ ợc hi n th , dĩ nhiên là thuộc tính Visible c a form là True.

OnClick Khi ng i sử dụng nhắp chuột trái (Click) vào đ i t ợng

OnContextPopup Khi ng i sử dụng nhắp chuột phải (RClick) vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng (PopupMenu)

OnDblClick Khi ng i sử dụng nhắp đúp (Double Click) vào đ i t ợng

OnKeyDown Khi ng i sử dụng nhấn phím bất kỳ.

OnKeyPress Khi ng i sử dụng nhấn phím bất kỳ nh ng không phải là các phím đi u khi n (ví dụ nh : F1, Ctrl, Shift,...)

OnKeyUp Khi một hoặc tổ hợp phím bất kỳ đ ợc thả ra.

OnMouseDown Khi ng i sử dụng Click, RClick, mouse giữa (hay Scroll mouse).

OnMouseMove Khi ng i sử dụng di chuy n mouse trên form.

OnMouseUp Khi ng i sử dụng thả bất kỳ phím nào c a mouse.

OnMouseWheel Khi ng i sử dụng cuộn mouse giữa theo h ng lên hoặc xu ng.

OnMouseWheelDown Khi ng i sử dụng cuộn mouse giữa theo h ng xu ng.

OnMouseWheelUp Khi ng i sử dụng cuộn mouse giữa theo h ng lên.

B ng 3: Các sự kiện c a TForm.

Page 72: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 66

Hình 35: Thiết lập giá tr các thuộc tính c a đ i t ợng frmWelcome

- B ớc 5: L u dự án, biên d ch và chạy ch ơng trình: + Ch n ch c năng File/Save All đ l u dự án vào th mục S:\Welcome

+ Nhấn Ctrl+F9 đ biên d ch

+ Nếu biên d ch thành công, nhấn phím ch c năng F9 hoặc ch c năng Run/Run

hoặc Click nút đ chạy ch ơng trình. + Kết thúc ch ơng trình, bạn sử dụng một trong các cách:

Click nút Close trên Form.

Ch n ch c năng Run/Program Reset Sử dụng tổ hợp phím Ctrl+F2

Click ch n nút công cụ

Ta có kết quả ch ơng trình nh sau:

Tên thuộc tính

Giá tr c a thuộc tính

Page 73: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 67

Hình 36: Form nhập liệu

Nhập h tên vào, chẳng hạn “Nguyen Nghia” rồi Click vào nút lệnh Chao, ch ơng trình sẽ ẩn form chính và xuất hiện hộp thông báo “Welcome”:

Hình 37: Hộp thông báo Hello

Bạn click nút lệnh OK đ đóng hộp hội thoại này và hi n th lại form chính.

Trong dự án, bạn có th có nhi u form, đ thêm form vào dự án, bạn sử dụng ch c năng: File/New/Form. Đ ch n 1 form nào đó trong s các form làm form chính, bạn sử dụng ch c năng Project /Options/Forms nh hình sau:

Hình 38: Ch n frmMain làm form chính.

Page 74: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 68

Đ các đ i t ợng trên form làm việc, t ơng tác v i nhau đúng nh ý mu n, ng i lập trình cần phải thiết lập, đ c các thuộc tính cũng nh sử dụng các ph ơng th c, th tục sự kiện c a chúng một cách hợp lý sao cho chúng gắn kết v i nhau thành một kh i th ng nhất. Đ làm đ ợc đi u này, ng ời vi t ch ng trình c n ph i có Ủ t ởng rƠnh m ch v d án đ thống nh t t quá trình thi t k (designing) đ n vi t mư (coding).

IV. Các thƠnh ph n (Component) giao di n ph bi n

Các thành phần (đi u khi n) trong Delphi rất phong phú và chúng đ ợc đặt trong các thẻ (tab) c a bảng ch a các thành phần c a Delphi (Component Palette) nh thẻ Standar, Addition, Win32,… Trong giáo trình này, các bạn sẽ đ ợc gi i thiệu nhi u đ i t ợng khác nhau phù hợp v i trình tự c a bài h c. T i thời đi m thi t k , ta Click vƠo thƠnh ph n c n s d ng rồi drag and drop đ đặt đối t ng đó lên form.

Hình 39: Bảng các thành phần

Hình 40: Các thành phần trên thẻ Standard

IV.1. Nhãn (TLabel)

Là một thành phần dùng đ hi n th một hoặc nhi u dòng văn b n tĩnh trong nó.

Bi u t ợng:

Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng nhưn (Xem lại Bảng 1: Quy cách đặt tên các đ i t ợng)

AutoSize Có giá tr True hoặc False: tự động hay không tự động thay đổi kích th c c a Label khi ch ơng trình chạy so v i thiết kế ban đầu.

Caption Chuỗi ký tự đ ợc hi n th trong nó

Page 75: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 69

Tên thuộc tính ụ nghĩa

Visible Có giá tr True hoặc False: có hi n th hay không khi chạy ch ơng trình.

Color Màu n n

Font Xác đ nh các thuộc tính v font nh : ki u chữ, màu, cỡ,...

Tranparent Màu n n c a nhưn là trong su t/không màu.

WordWrap Có giá tr True hoặc False: cho phép hi n th nhi u dòng hay chỉ 1 dòng trong đ i t ợng Label.

B ng 4: Các thuộc tính c a TLabel

Một số s ki n th ờng dùng:

Tên s ki n S ki n sẽ đáp ứng

OnClick Khi ng i sử dụng nhắp chuột trái (Click) vào đ i t ợng

OnContextPopup Khi ng i sử dụng nhắp chuột phải (RClick) vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng (PopupMenu)

OnDblClick Khi ng i sử dụng nhắp đúp (Double Click) vào đ i t ợng

B ng 5: Các sự kiện c a TLabel

- Một số hƠm đ c s d ng trong ví d : + Hàm trả v th i gian hiện hành c a hệ th ng máy tính:

function Time: TDateTime;

+ Hàm trả v ngày tháng năm hiện hành c a hệ th ng máy tính: function Date: TDateTime;

+ Hàm chuy n đổi ki u th i gian (time) sang ki u chuỗi (string) function TimeToStr(Time: TDateTime): string; overload;

+ Hàm chuy n đổi ki u ngày tháng năm (date) sang ki u chuỗi (string) function DateToStr(Date: TDateTime): string; overload;

Ví d 9: Xem ngày gi hiện hành c a hệ th ng.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong Label

Position poDestopCenter

B ng 6: Thiết lập các thuộc tính cho đ i t ợng Form.

Page 76: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 70

- Đặt đ i t ợng Label lên form và thiết lập thuộc tính:

Thuộc tính Giá tr

Name lblDateTime

Caption (đ rỗng)

Align alClient

Color clSkyBlue

BorderStyle bsDialog

B ng 7: Thiết lập các thuộc tính cho Label

- Từ cửa sổ Object Inspector, click vào nút liệt kê thả đ ch n đ i t ợng frmMain. Click ch n tab Events, DClick vào cột bên phải c a sự kiện OnCreate t ơng

ng đ sinh ra th tục sự kiện FormCreate, và gõ thêm các lệnh vào trong thân th tục sự kiện. Đoạn mư lệnh c a ch ơng trình hoàn chỉnh nh sau:

unit untDateTime; //tên unit file: untDateTime.pas

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

lblDateTime: TLabel;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);

begin

lblDateTime.Font.Color := clPurple;

lblDateTime.Font.Size:=15;

lblDateTime.Caption:=' - The curent time is ' + TimeToStr(time);

lblDateTime.Caption:=lblDateTime.Caption + Chr(10)+' - Today is ' + DateToStr(Date);

end;

end.

Page 77: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 71

- L u dự án vào th mục S:\ViDuLabel - Biên d ch dự án: Ctrl + F9

- Chạy ch ơng trình: F9

- Kết quả ch ơng trình nh hình sau:

Hình 41: Ngày gi hiện hành c a hệ th ng

IV.2. Hộp văn b n (TEdit) Là một component chuẩn đ nhập hay xuất một chuỗi ký tự trong nó khi chạy

ch ơng trình. Chú ý hộp văn bản chỉ nhập hoặc xuất đ ợc 1 dòng duy nhất.

Bi u t ợng:

Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho hộp văn bản.

AutoSize Có giá tr True hoặc False: tự động hay không tự động thay đổi kích th c hộp văn bản khi ch ơng trình chạy so v i thiết kế ban đầu.

Text Chuỗi ký tự trong hộp văn bản

CharCase Xác đ nh ki u chữ in hoa (ecUpperCase), chữ nh (ecLowerCase) hoặc ki u chữ do ng i sử dụng nhập (ecNormal)

Font Xác đ nh các thuộc tính v font nh : ki u chữ, màu, cỡ,...

Visible Có giá tr True hoặc False: có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

ReadOnly Có giá tr True hoặc False: Dữ liệu trong nó là chỉ đ c hay có th thay đổi.

B ng 8: Các thuộc tính c a TEdit

* Một s sự kiện th ng dùng:

Tên s ki n S ki n sẽ đáp ứng

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

Page 78: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 72

Tên s ki n S ki n sẽ đáp ứng

OnEnter Khi đ i t ợng nhận tiêu đi m (Got Focus) hay tr nên hoạt động (Active)

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 9: Các sự kiện c a TEdit

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Show; Th tục hi n th đ i t ợng khi chạy ch ơng trình.

Hide; Th tục ẩn đ i t ợng khi chạy ch ơng trình.

Clear; Th tục xóa hết giá tr trong TEdit

B ng 10: Các ph ơng th c c a TEdit

Ta có th sử dụng các hàm chuẩn trong Delphi đ nhập hoặc xuất dữ liệu thay cho TEdit. - Hàm InputBox:

Cú pháp:

function InputBox(const ACaption, APrompt, ADefault: string): string; Trong đó:

ACaption : là một hằng chuỗi ký tự đ làm tiêu đ c a hộp hội thoại nhập. APrompt : là một chuỗi ký tự đ làm câu nhắc cho ng i nhập liệu

ADefault : là một chuỗi ký tự đ làm giá tr mặc đ nh ban đầu

Ý nghĩa: Dùng đ nhập dữ liệu vào thông qua hộp thoại, kết quả trả v c a hàm là ki u chuỗi ký tự (String)

Ví d 10: Nhập mư s sinh viên từ hộp thoại nh sau:

mssv := InputBox('Hop nhap lieu', 'Nhap ma so sinh vien','7962343');

V i biến mssv ki u string, ta có hộp hội thoại nh sau:

Hình 42: Hộp nhập liệu bằng hàm InputBox

Page 79: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 73

- Một số khái ni m vƠ hƠm đ c s d ng trong ví d : + Bi n riêng (cục bộ): là biến chỉ có phạm vi hoạt động và tồn tại trong th tục sự kiện c a nó.

+ Hàm chuy n đổi ki u s dấu chấm động (Float) sang ki u chuỗi:

function FloatToStr(Value: Extended): string; overload;

+ Hàm chuy n đổi ki u chuỗi sang ki u dấu chấm động (Float):

function StrToFloat(const S: string): extended;

Ví d 11: Viết ch ơng trình nhập 2 s bất kỳ bằng hàm InputBox thông qua sự kiện OnCreate c a Form và cho biết kết quả c a chúng thông qua đ i t ợng c a thành phần TEdit.

- Thi t k form vƠ đặt tên các đối t ng nh sau:

Hình 43: Thiết kế form và đặt tên các đ i t ợng

- Đo n mư l nh c a ch ng trình:

unit untTinhTong;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

Label2: TLabel;

edt_KQ: TEdit;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

Page 80: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 74

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);

var x, y: Extended;

begin

x := StrToFloat(InputBox('Hop nhap','Nhap x =',''));

y := StrToFloat(InputBox('Hop nhap','Nhap y =',''));

edt_KQ.Text := FloatToStr(x+y);

end;

end.

- L u d án vào th mục S:\ViDuInputBox, biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 44: Nhập giá tr 2 biến x, y

Hình 45: Kết quả c a ch ơng trình

- Hàm InputQuery:

Cú pháp:

function InputQuery(const ACaption, APrompt: string; var Value: string): boolean;

Trong đó:

ACaption: là một hằng chuỗi ký tự đ làm tiêu đ c a hộp hội thoại nhập.

APrompt: là một chuỗi ký tự đ làm câu nhắc cho ng i nhập liệu

Value: là một tham bi n nhận giá tr nhập c a hàm.

Page 81: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 75

Ý nghĩa: Dùng đ nhập dữ liệu vào thông qua hộp thoại, kết quả trả v c a hàm là ki u boolean, và giá tr đ ợc nhập vào trong hội thoại ch a trong tham biến Value nếu ta Click nút OK.

Ví d 12: Nhập h tên từ hộp thoại nh sau:

m_OK := InputQuery('Hop nhap lieu ', 'Nhap ho ten', m_Hoten);

V i biến m_OK ki u boolean, m_Hoten ki u string, ta có hộp hội thoại nh sau:

Hình 46: Hộp nhập liệu bằng hàm InputQuery

Nếu ta click nút lệnh OK, thì m_OK = True còn m_Hoten = 'Pham Bao Thach', còn click nút Cancel thì m_OK = False.

- Th t c ShowMessage: Cú pháp: procedure ShowMessage(const Msg: string); Ý nghĩa: dùng đ hi n th thông điệp thông qua hằng chuỗi ký tự Msg

Ví d 13: Câu lệnh ShowMessage('Chao mung ban den voi Delphi phien ban 7.0!...'); đ hi n th thông báo: “Chào mừng bạn đến v i Delphi phiên bản 7.0!...”

Hình 47: Hộp thông báo

- Một số khái ni m vƠ hƠm đ c s d ng trong ví d : + Tham tr : Là cách truy n mà khi giá tr c a tham s hình th c thay đ i thì cũng

không ảnh h ng đến giá tr c a tham s thực. + Tham biến: Là cách truy n mà khi giá tr c a tham số hình thức thay đổi thì kéo

theo giá tr c a tham số th c cũng thay đ i theo.

+ Câu lệnh rẽ nhánh: if đi u_kiện then công_việc_1 else công_việc_2; Ý nghĩa: Nếu đi u kiện đúng, có giá tr True, thì máy thực hiện công việc 1, ng ợc

lại (nghĩa là đi u kiện sai, có giá tr False) thì máy sẽ thực hiện công việc 2.

Page 82: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 76

Ví d 14: Viết ch ơng trình nhập 2 s bất kỳ bằng hàm InputQuery thông qua sự kiện OnActivate c a Form và cho biết kết quả c a chúng thông qua th tục MessageBox.

- Thi t k form vƠ đặt tên các đối t ng nh sau:

Hình 48: Thiết kế form và đặt tên cho các đ i t ợng

- Đo n mư l nh c a ch ng trình:

unit untInputQuery;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormActivate(Sender: TObject);

var x, y : string;

mNhap_x, mNhap_y : boolean; // Kiem tra viec nhap x va y

begin

mNhap_x := InputQuery('Hop nhap','Nhap x =',x);

mNhap_y := InputQuery('Hop nhap','Nhap y =',y);

if (mNhap_x = False) or (mNhap_y = False) then

ShowMessage('Ban da bo qua - Cancel - viec nhap gia tri cho x hoac y.')

Page 83: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 77

else

ShowMessage('Tong cua ' + x + ' + ' + y + '= ' + FloatToStr(StrToFloat(x) + StrToFloat(y)));

end;

end.

- L u d án vào th mục S:\ViDuInputQuery, biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

+ Nếu nhập b nhập tr cho x, và nhâp tr y=7

Bạn ch n Cancel Bạn ch n OK

Hình 49: B nhập x, nhập y=7

Hình 50: Kết quả ch ơng trình sẽ thông báo lỗi

+ Nếu nhập đúng, chẳng hạn nhập x = 5, y =7, thì ta có kết quả nh sau:

Hình 51: Kết quả ch ơng trình khi nhập tr cho x, y

Page 84: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 78

IV.3. Nút l nh (TButton) Là một thành phần dùng thiết kế nút lệnh đ thi hành một công việc nào đó mà bạn

mu n.

Bi u t ợng:

Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho nút lệnh.

Caption Chuỗi ký tự là tiêu đ cho nút lệnh. Sử dụng dấu & đ gạch d i ký tự đại diện. Dùng tổ hợp phím Alt+Ký tự gạch d i đ kích hoạt nút lệnh.

Cancel Nếu có giá tr True thì khi nhấn phím Esc thì sự kiện OnClick sẽ sinh ra; còn nếu có giá tr False thì không.

Visible Có giá tr True hoặc False: Có hi n th hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho hay không cho phép ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v nút lệnh khi bạn tr mouse đến nút lệnh đó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà nút lệnh đó đ ợc nhận focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 11: Các thuộc tính c a TButton

Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnEnter Khi đ i t ợng nhận tiêu đi m (Got Focus) hay tr nên hoạt động (Active).

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus).

OnKeyDown Khi có phím bất kỳ đ ợc nhấn.

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 12: Các sự kiện c a TButton

- Một hƠm đ c s d ng trong ví d : + Hàm thử chuy n đổi một chuỗi, S, sang ki u s nguyên, out. Nếu thành công hàm

trả v giá tr True, còn nếu đổi b thất bại thì hàm sẽ trả v tr False. function TryStrToInt(const S: string; out Value: integer): Boolean;

Page 85: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 79

+ T ơng tự nh hàm trên, hàm này thử chuy n đổi một chuỗi, S, sang ki u s chấm động, out.

function TryStrToFloat(const S: string; out Value: extended): boolean;

Ví d 15: Tính tổng 2 s :

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmTong

Caption Vi du ve doi tuong Edit

B ng 13: Thiết lập các thuộc tính Form

- Đặt 3 đ i t ợng Edit và Button lên form và thiết lập thuộc tính:

Đối t ng: Thuộc tính Giá trị

Edit th nhất: Name edt_a

TabOrder 0

Edit th hai: Name edt_b

TabOrder 1

Edit th ba:

Name edtKQ

TabOrder 3

ReadOnly True

Button

Name btnTong

Caption Tinh &tong

TabOrder 2

B ng 14: Thiết lập các thuộc tính cho Edit và Button

* Đo n code hoƠn chỉnh c a ch ng trình:

unit untTinhTong;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmTong = class(TForm)

edt_a: TEdit;

Label1: TLabel;

Label2: TLabel;

edt_b: TEdit;

Page 86: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 80

edtKQ: TEdit;

Label3: TLabel;

btnTong: TButton;

procedure btnTongClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmTong: TfrmTong;

implementation

{$R *.dfm}

procedure TfrmTong.btnTongClick(Sender: TObject);

var a, b: extended;

begin

if (TryStrToFloat(edt_a.Text,a) = True) and (TryStrToFloat(edt_b.Text,b)= True) then

edtKQ.Text := FloatToStr(a+b)

else edtKQ.Text := 'Du lieu nhap bi loi!...';

end;

end.

- L u dự án vào th mục S:\ViDuEdit - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 52: Ch ơng trình tính tổng

IV.4. Nhưn vƠ Hộp nh p (TLabeledEdit) Có một thành phần kết hợp cả 2 thành phần TLabel và TEdit đ tr thành một, đó

chính là thành phần TLabeledEdit.

Page 87: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 81

Bi u t ợng:

Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng LabeledEdit.

EditLabel.Caption Tiêu đ : chuỗi ký tự hi n th trong phần nhưn c a đ i t ợng.

LabelPosition V trí c a nhưn nằm phía trên, bên d i, bên trái, bên phải so v i hộp nhập. Các giá tr t ơng ng là: lpAbove, lpBelow, lpLeft, lpRight

Text Chuỗi trong hộp nhập c a đ i t ợng LabeledEdit

Visible Có giá tr True hoặc False: Có hi n th hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v nút lệnh khi bạn tr mouse đến nút lệnh đó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà nút lệnh đó đ ợc nhận focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 15: Các thuộc tính c a TLabeledEdit

Một số s ki n th ờng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnEnter Khi đ i t ợng nhận tiêu đi m (Got Focus) hay tr nên hoạt động (Active)

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 16: Các sự kiện c a TLabeledEdit

IV.5. Hộp đánh d u hay hộp ki m (TCheckbox) Là thành phần dùng đ trình bày một tùy ch n cho ng i sử dụng ch n (đánh dấu)

hoặc không ch n (b đánh dấu). Thông th ng ch ơng trình sẽ có nhi u mục tùy ch n. Ng i sử dụng có th không ch n mục nào hoặc ch n tất cả.

Bi u t ợng:

Một s thuộc tính th ng dùng:

Page 88: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 82

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng CheckBox.

Caption Chuỗi ký tự hi n th trên nút lệnh. Sử dụng dấu & đ gạch d i ký tự đại diện. Dùng tổ hợp phím Alt+Ký tự gạch d i đ kích hoạt nút lệnh.

Checked Có giá tr True và False: xác lập trạng thái cho Checkbox là đ ợc ch n hay ch a. Mặc nhiên có giá tr False.

State Trạng thái c a Checkbox: cbChecked, cbUnchecked hoặc cbGrayed

Visible Có giá tr True hoặc False: Có hi n th hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v nút lệnh khi bạn tr mouse đến nút lệnh đó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà nút lệnh đó đ ợc nhận focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 17: Các thuộc tính c a TCheckBox

Một số s ki n th ờng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnEnter Khi đ i t ợng nhận tiêu đi m (Got Focus) hay tr nên hoạt động (Active)

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc gõ

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 18: Các sự kiện c a TCheckBox

Chú ý: Đ thuận tiện trong việc thiết kế cũng nh lập trình, bạn nên dùng thành phần

TGroupBox (có bi u t ợng ) đ ch a các thành phần Checkbox.

* Một số khái ni m đ c s d ng trong ví d : + Biến chung: là biến có tác động trong tất cả các th tục sự kiện và tồn tại trong su t quá trình ch ơng trình đang chạy (Run-time) và chỉ mất đi (giải phóng biến) khi kết thúc (Terminate/ end) ch ơng trình/dự án.

+ Câu lệnh rẽ nhánh: if đi u_kiện then công_việc_1 else công_việc_2;

Page 89: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 83

Nếu đi u kiện đúng, có giá tr true, thì máy thực hiện công việc 1; Ng ợc lại (nghĩa là đi u kiện sai, có giá tr false) thì máy sẽ thực hiện công việc 2.

Ví d 16: Đánh dấu ch n vào danh sách các ngôn ngữ lập trình mà bạn biết.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong CheckBox

B ng 19: Thiết lập thuộc tính cho Form

- Đặt đ i t ợng GroupBox lên form và đặt thuộc tính nh sau:

Thuộc tính Giá trị

Name gbxDanhSach

Caption Danh sach:

B ng 20: Thiết lập thuộc tính cho GroupBox

- Đặt các đ i t ợng Checkbox lên GroupBox, Edit lên form và thiết lập thuộc tính:

Đối t ng: Thuộc tính Giá trị

CheckBox 1: Name chkPascal

Caption Pascal

CheckBox 2: Name chkDelphi

Caption Delphi

CheckBox 3: Name chkVC

Caption C++/Visual C

CheckBox 4: Name chkVB

Caption Visual Basic

CheckBox 5: Name chkVisualFox

Caption Visual Fox

CheckBox 6: Name chkAssembler

Caption Assembler

CheckBox 7: Name chkCOBOL

Caption COBOL

CheckBox 8: Name chkJava

Caption Java

Page 90: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 84

Edit

Name edt_KQ

Text (đ rỗng)

ReadOnly True

và 2 Label v i các caption nh mô tả trong form.

B ng 21: Thiết lập các thuộc tính c a CheckBox và Edit

- Vi t mư cho ch ng trình: Cách khai báo bi n chung: Từ chế độ thiết kế Form, nhấn phím ch c năng F12 đ

chuy n sang cửa sổ soạn thảo mư lệnh, rồi cuộn lên đầu ch ơng trình và gõ vào sau từ khóa var là mDem: Byte; hoặc RClick vào mục Variables/Contants, ch n New (xem hình phía d i) đ khai báo 1 bi n chung m i có tên mDem:Byte;

Hình 53: Cửa sổ thêm biến chung

Lần l ợt nhập vào các câu lệnh cho các th tục sự kiện t ơng ng cho mỗi đ i t ợng đ hoàn thành ch ơng trình nh sau: unit ╗═╖σσδT; //C╨c ═gô═ ═gữ lậ╒ ╖╔▓═h

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TfrmMain = class(TForm)

Page 91: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 85

gbxDanhSach: TGroupBox;

chkPascal: TCheckBox;

chkDelphi: TCheckBox;

chkVC: TCheckBox;

Label1: TLabel;

chkVB: TCheckBox;

chkJava: TCheckBox;

chkAssembler: TCheckBox;

chkVisualFox: TCheckBox;

chkCOBOL: TCheckBox;

edt_KQ: TEdit;

Label2: TLabel;

procedure chkPascalClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure chkDelphiClick(Sender: TObject);

procedure chkVCClick(Sender: TObject);

procedure chkVBClick(Sender: TObject);

procedure chkJavaClick(Sender: TObject);

procedure chkVisualFoxClick(Sender: TObject);

procedure chkAssemblerClick(Sender: TObject);

procedure chkCOBOLClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

mDem: Byte; //Khai bao bien chung o day.

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);

begin

mDem:=0; //Khoi tao bien chung

end;

procedure TfrmMain.chkPascalClick(Sender: TObject);

begin

if chkPascal.Checked=True then mDem:=mDem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

Page 92: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 86

procedure TfrmMain.chkDelphiClick(Sender: TObject);

begin

if chkDelphi.Checked=True then mDem:=mdem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkVCClick(Sender: TObject);

begin

if chkVC.Checked=True then mDem:=mDem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkVBClick(Sender: TObject);

begin

if chkVB.Checked=True then mDem:=mdem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkJavaClick(Sender: TObject);

begin

if chkJava.Checked=True then mDem:=mdem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkVisualFoxClick(Sender: TObject);

begin

if chkVisualFox.Checked=True then mDem:=mDem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkAssemblerClick(Sender: TObject);

begin

if chkAssembler.Checked=True then mDem:=mDem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

procedure TfrmMain.chkCOBOLClick(Sender: TObject);

begin

if chkCOBOL.Checked=True then mDem:=mDem+1 else mDem:=mDem-1;

edt_KQ.Text:= IntToStr(mDem);

end;

end.

+ L u dự án vào th mục S:\ViDuCheckBox

+ Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 93: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 87

Hình 54: Kết quả ch ơng trình

IV.6. Nút tùy chọn (TRadioButton) Là thành phần dùng đ trình bày một tùy ch n cho ng i sử dụng ch n lựa (đánh

dấu) hoặc không ch n (b đánh dấu). Thông th ng ch ơng trình sẽ có nhi u mục tùy ch n. Khác v i TCheckBox, ng i chỉ có th ch n một mục duy nhất trong các tùy ch n đư cho.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho nút tùy ch n, tên này đ ợc đặt nh tên biến và đ ợc sử dụng trong việc viết mư lệnh c a ch ơng trình.

Caption Chuỗi ký tự hi n th trên nút lệnh. Sử dụng dấu & đ gạch d i ký tự đại diện. Dùng tổ hợ phím Alt+Ký tự gạch d i đ kích hoạt nút lệnh.

Checked Có giá tr True và False: Xác lập trạng thái cho RadioButton là đ ợc ch n hay ch a. Mặc nhiên có giá tr False.

Visible Có giá tr True hoặc False: Có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v nút lệnh khi bạn tr mouse đến nút lệnh đó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà nút lệnh đó đ ợc nhận focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 22: Các thuộc tính c a TRadioButton

Page 94: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 88

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 23: Các sự kiện c a TRadioButton

IV.7. Nhóm tùy chọn (TRadioGroup) Là thành phần đ ch a các RadioButton. Thay vì sử dụng nhi u RadioButton cùng

lúc, thì bạn nên sử dụng RadioGroup đ dễ thiết kế và lập trình g n gàng hơn.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng RadioGroup

Items Cho phép bạn nhập các phần tử vào trong đ i t ợng RadioGroup trong lúc thiết kế thông qua cửa sổ “String List Editor”.

Items[i] Danh sách các phần tử trong RadioGroup. Phần tử th nhất có chỉ s i là 0, phần tử th 2 chỉ s i là 1,… trong danh sách.

ItemIndex Trả v chỉ s phần tử hiện tại đang đ ợc ch n trong Items. Mặc nhiên có giá tr là -1 (ch a có phần tử nào đ ợc ch n)

Items.Count Trả v s phần tử trong RadioGroup

B ng 24: Các thuộc tính c a TRadioGroup

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

B ng 25: Các sự kiện c a TRadioGroup

Page 95: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 89

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Items.Add(const S: string): Integer; Hàm thêm phần tử ki u string vào phía cu i và trả v chỉ s c a phần tử này trong Items.

Items.Append(const S: string); Th tục n i thêm phần tử ki u string vào phía cu i Items.

Items.Delete(Index: Integer); Th tục xóa một phần tử chỉ s index trong Items.

Items.Insert(Index: Integer; const S: string);

Th tục xóa một phần tử kiếu string tại chỉ s index trong Items. Th tục này t ơng đ ơng câu lệnh gán vào thuộc tính Items nh sau: Items[index] := S;

Items.Clear; Th tục xóa hết các phần tử trong Items.

B ng 26: Các ph ơng th c c a TRadioGroup

Ví d 17: Ch n khóa h c Anh văn mà bạn đăng ký. - Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong RadioGroup

B ng 27: Thiết lập thuộc tính cho Form.

- Đặt đ i t ợng RadioGroup lên form và đặt thuộc tính nh sau:

Thuộc tính Giá trị

Name rgpCourses

Caption Courses:

Items

Click vào đ chèn vào 5 dòng (phần tử): Level A

Level B

Level C

IELTS

TOEFL

B ng 28: Thiết lập các thuộc tính RadioGroup

Page 96: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 90

Đo n mư l nh c a ch ng trình:

unit untDangKyAV;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TfrmMain = class(TForm)

rgpCourses: TRadioGroup;

Label1: TLabel;

procedure rgpCoursesClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.rgpCoursesClick(Sender: TObject);

var mChiSo: integer;

begin

mChiSo := rgpCourses.ItemIndex;

ShowMessage('You have decided to enroll in '+

rgpCourses.Items[mChiSo]+'.');

end;

end.

+ L u dự án vào th mục S:\ViDuRadioGroup

+ Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 97: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 91

Hình 55: Kết quả ch ơng trình c a RadioGroup

IV.8. Vùng văn b n (TMemo) Là một thành phần dùng đ ch a các dòng văn bản. Thành phần này hữu ích cho

những công việc liên quan đến văn bản có nhi u dòng nh : đ c đ hi n th nội dung c a một tập tin dạng text, soạn thảo văn bản,...

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng vùng văn bản.

Align Xác đ nh việc canh l trái, phải, trên, d i,... c a Memo bên trong thành phần ch a nó. Nếu có giá tr bằng alClient thì kích th c đ i t ợng Memo sẽ chiếm toàn bộ b mặt c a thành phần ch a nó.

Alignment Canh trái (taLeftJustify), canh phải (taRightJustify), canh giữa (taCenter) chuỗi văn bản trong Memo

Font Xác đ nh các thuộc tính v font nh : ki u chữ, màu, cỡ,...

Lines Cho phép bạn nhập các dòng văn bản vào trong Memo trong lúc thiết kế thông qua cửa sổ “String List Editor”.

Lines[i] Dòng văn bản chỉ s th i trong Memo. Dòng th nhất có chỉ s i là 0, dòng th 2 chỉ s i là 1,… trong danh sách.

Lines.Count Trả v s dòng (line) trong Memo

SelText Trả v kh i văn bản đ ợc ch n.

WantReturns Có giá tr True và False: Cho hoặc không cho phép việc sử dụng phím Enter đ xu ng hàng (ký tự Carry Return) khi soạn thảo văn bản trong Memo.

WantTabs Có giá tr True và False: Cho hoặc không cho phép việc sử dụng phím Tab khi soạn thảo văn bản trong Memo.

ReadOnly Nếu giá tr True thì nội dung văn bản trong Memo là chỉ đ c.

Page 98: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 92

Tên thuộc tính ụ nghĩa

ScrollBars Có thanh cuộn đ ng (ssVertical), ngang (ssHorizontal), cả hai thanh cuộn (ssBoth) trong Memo hoặc không có thanh cuộn nào (ssNone).

Visible Có giá tr True hoặc False: Có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v Memo khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà Memo đó đ ợc nhận focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True và WantTabs là False.

WordWrap Nếu có giá tr True: Chuỗi văn bản đ ợc nhập vào trên mỗi dòng mà dài hơn độ rộng c a vùng soạn thảo Memo thì sẽ đ ợc tự động xu ng dòng m i, ng ợc lại sẽ không tự động xu ng dòng m i.

B ng 29: Các thuộc tính c a TMemo

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnChange Khi ng i sử dụng thay đổi, cập nhật dữ liệu trong đ i t ợng Memo

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 30: Các sự kiện c a TMemo

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Lines.Add(const S: string): Integer; Hàm thêm dòng ki u string vào phía cu i và trả v chỉ s c a phần tử này trong Lines.

Lines.Append(const S: string); Th tục n i thêm phần tử ki u string vào phía cu i Lines.

Lines.Delete(Index: Integer); Th tục xóa một dòng chỉ s index trong Lines.

Page 99: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 93

Cú pháp c a ph ng thức ụ nghĩa

Lines.Insert(Index: Integer; const S: string);

Th tục xóa một phần tử kiếu string tại chỉ s index trong Lines. Th tục này t ơng đ ơng câu lệnh gán vào thuộc tính Items nh sau: Lines[index] := S;

CopyToClipboard; Th tục sao chép kh i văn bản đ ợc ch n và l u vào vùng nh Clipboard c a Windows.

CutToClipboard; Th tục cắt kh i văn bản đ ợc ch n và l u vào vùng nh Clipboard c a Windows.

PasteFromClipboard; Th tục dán vùng văn bản trong Clipboard vào Memo.

Clear; Th tục xóa hết các dòng trong Lines.

ClearSelection; Th tục xóa vùng văn bản đ ợc ch n trong Memo.

B ng 31: Các ph ơng th c c a TMemo

Ví d 18: Ch ơng trình soạn thảo NotePad đơn giản, v i 4 nút lệnh:

Clear: Xóa nội dung trong vùng soạn thảo

Quét kh i văn bản: sử dụng thao tác Drag and drop.

Copy: Sao chép; Cut: Cắt vùng văn bản đư đ ợc quét kh i

Paste: Dán kh i văn bản vừa Copy hoặc Cut vào tại v trí con nháy.

L u Ủ: Khi m i chạy ch ơng trình, các nút Copy, Cut và Paste b m đi (Disable)

Khi thực hiện việc quét kh i thì các nút lệnh Copy, Cut m i tác động (Enable).

Khi thực hiện lệnh Copy hoặc Cut thì nút lệnh Paste m i tác động.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá tr

Name frmNotePad

Caption Vi du ve doi tuong Memo

B ng 32: Thiết lập thuộc tính Form

- Đặt các thành phần lên form và đặt thuộc tính chúng nh sau:

Đối t ng Thuộc tính Giá trị

Memo

Name memNotePad

Lines rỗng ( ch a có dòng nào)

TabOrder 0

Page 100: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 94

Đối t ng Thuộc tính Giá trị

Button th 1: Name btnClear

Caption Clea&r

Button th 2: Name btnCopy

Caption &Copy

Button th 3: Name btnCut

Caption C&ut

Button th 4: Name btnPaste

Caption &Paste

và một Label v i Caption nh mô tả trong form.

B ng 33: Thiết lập các thuộc tính thành cho các đ i t ợng.

Đo n mư l nh c a ch ng trình:

unit untNotePad;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmNotePad = class(TForm)

memNotePad: TMemo;

btnCopy: TButton;

btnCut: TButton;

btnPaste: TButton;

btnClear: TButton;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

procedure memNotePadMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure btnCopyClick(Sender: TObject);

procedure btnCutClick(Sender: TObject);

procedure btnPasteClick(Sender: TObject);

procedure btnClearClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmNotePad: TfrmNotePad;

Page 101: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 95

implementation

{$R *.dfm}

procedure TfrmNotePad.FormCreate(Sender: TObject);

begin

btnCopy.Enabled:=False;

btnCut.Enabled:=False;

btnPaste.Enabled:=False;

end;

procedure TfrmNotePad.memNotePadMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if length(memNotePad.SelText)>0 then

begin

btnCopy.Enabled:=true;

btnCut.Enabled:=true;

end;

end;

procedure TfrmNotePad.btnCopyClick(Sender: TObject);

begin

memNotePad.CopyToClipboard;

btnPaste.Enabled:=True;

end;

procedure TfrmNotePad.btnCutClick(Sender: TObject);

begin

memNotePad.CutToClipboard;

btnPaste.Enabled:=True;

end;

procedure TfrmNotePad.btnPasteClick(Sender: TObject);

begin

memNotepad.PasteFromClipboard;

memNotePad.SetFocus;

end;

procedure TfrmNotePad.btnClearClick(Sender: TObject);

begin

memNotePad.Clear;

end;

end.

- L u dự án vào th mục S:\ViDuMemo

Page 102: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 96

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 56: Kết quả ch ơng trình Memo

IV.9. Hộp danh sách (TListBox) Là thành phần liệt kê một danh sách các phần tử. Các phần tử này không th nhập

trực tiếp khi chạy ch ơng trình.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho hộp danh sách.

Align Xác đ nh việc canh l trái, phải, trên, d i,... c a Listbox bên trong thành phần ch a nó. Nếu có giá tr bằng alClient thì kích th c ListBox sẽ chiếm toàn bộ b mặt c a thành phần ch a nó.

Columns S cột trong ListBox

Font Xác đ nh các thuộc tính v font nh : ki u chữ, màu, cỡ,...

Items Cho phép bạn nhập các phần tử vào ListBox lúc thiết kế thông qua cửa sổ “String List Editor”.

Items[i] Phần tử chỉ s th i trong Listbox. Chỉ s i bắt đầu từ 0 và tiếp tục là 1, 2,... trong hộp danh sách. Cách này th ng đ ợc dùng viết mư lệnh.

ItemIndex Trả v chỉ s phần tử hiện tại đang đ ợc ch n trong Items. Mặc nhiên có giá tr là -1 (ch a có phần tử nào đ ợc ch n)

Count Trả v s phần tử có mặt trong ListBox

SelCount Trả v s phần tử có đư đ ợc ch n trong Listbox

MultiSelect Có giá tr True hoặc False: Cho phép Click ch n cùng lúc nhi u phần

Page 103: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 97

Tên thuộc tính ụ nghĩa

tử (kết hợp v i phím Ctrl hoặc Shift) hay chỉ 1 phần tử.

Sorted Có giá tr True hoặc False: Sắp xếp các phần tử theo th tự chữ cái hoặc không sắp xếp.

Visible Có giá tr True hoặc False: có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v ListBox khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà ListBox đó đ ợc nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 34: Các thuộc tính c a TListBox

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 35: Các sự kiện c a TListBox

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Items.Add(const S: string): Integer; Hàm thêm phần tử ki u string vào phía cu i và trả v chỉ s c a phần tử này trong Items.

Items.Append(const S: string); Th tục n i thêm phần tử ki u string vào phía cu i Items.

Items.Delete(Index: Integer); Th tục xóa một phần tử chỉ s index trong Items.

Items.Insert(Index: Integer; const S: string);

Th tục xóa một phần tử kiếu string tại chỉ s index trong Items. Th tục này t ơng đ ơng câu lệnh gán vào thuộc tính Items nh sau: Items[index] := S;

Page 104: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 98

Cú pháp c a ph ng thức ụ nghĩa

Clear; Th tục xóa hết các phần tử trong ListBox.

ClearSelection; Th tục xóa các phần tử đư ch n.

B ng 36: Các ph ơng th c c a TListBox

Ví d 19: Đếm s phần tử mà bạn đư ch n trong ListBox

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong ListBox

B ng 37: Thiết lập thuộc tính Form.

- Đặt các đ i t ợng lên form và đặt thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

ListBox

Name lbxSo

Items rỗng ( 0 line)

Columns 2

MultiSelect True

Edit

Name edt_pt

Text rỗng

TabOrder 0

Button 1: Name btnThem

Caption &Them phan tu vao Listbox

Button 2: Name btnDem

Caption &Dem so phan tu chon

và 2 Label v i Caption nh mô tả trong form.

B ng 38: Thiết lập thuộc tính cho các đ i t ợng.

Đo n mư l nh ch ng trình:

unit untDanhSach;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Qt;

Page 105: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 99

type

TfrmMain = class(TForm)

lbxSo: TListBox;

edt_pt: TEdit;

btnThem: TButton;

btnDem: TButton;

Label1: TLabel;

Label2: TLabel;

procedure btnThemClick(Sender: TObject);

procedure btnDemClick(Sender: TObject);

procedure edt_ptKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnThemClick(Sender: TObject);

begin

lbxSo.Items.Add(edt_pt.Text);

edt_pt.Clear;

edt_pt.SetFocus;

end;

procedure TfrmMain.btnDemClick(Sender: TObject);

begin

ShowMessage('So phan tu ban da chon la: ' + IntToStr(lbxSo.SelCount));

end;

╝TTSK ╕ử dụ═g ╒h▒m E═╖e╔ để đư⌠ gi╨ ╖╔ị ═hậ╒ ╖╔║═g Edi╖ ╘╩║ ListBox }

procedure TfrmMain.edt_ptKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if Key = 13 then //Go phim Enter

begin

lbxSo.Items.Add(edt_pt.Text);

edt_pt.Clear;

end;

end;

end.

Page 106: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 100

- L u dự án vào th mục S:\ViDuListBox

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 57: Kết quả ch ơng trình ListBox

IV.10. TSpinEdit

Thành phần này nằm trong thẻ Sample. Nó cho phép bạn nhập vào một s nguyên bất kỳ nh thành phần TEdit. Tuy nhiên, TSpinEdit còn cho phép bạn thay đổi (tăng, giảm) giá tr này theo một b c nhảy (step/increment) nào đó bằng cách Click vào nút (nút UpDown) đ tăng hoặc giảm.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng.

Value Ki u integer: Giá tr c a đ i t ợng SpinEdit

MinValue Ki u integer: Giá tr thấp nhất c a SpinEdit, mặc nhiên có giá tr 0: có nghĩa là không gi i hạn và có th có giá tr nh nhất trong phạm vi ki u s nguyên là –2147483648

MaxValue Ki u integer: Giá tr cao nhất c a TSpinEdit, mặc nhiên có giá tr 0: có nghĩa là không gi i hạn và có th có giá tr l n nhất trong phạm vi ki u s nguyên là 2147483647

Increment Ki u integer: Giá tr b c nhảy (step). Mặc nhiên có giá tr là 1.

MaxLength Ki u integer: Độ dài l n nhất (hay s l ợng ký s nhi u nhất) c a s nguyên trong SpinEdit. Chẳng hạn bạn gi i hạn chỉ nhập s t i đa đến hàng ngàn thì bạn cho thuộc tính này bằng 4.

Text Ki u String: Chuỗi ký s bên trong đ i t ợng. Thuộc tính này t ơng đ ơng v i thuộc tính Value nh ng khác ki u dữ liệu.

ReadOnly Ki u boolean: Có giá tr là True, nếu KHỌNG cần thay đổi giá tr c a thuộc tính Value. Còn ng ợc lại, bạn có th thay đổi.

Page 107: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 101

Tên thuộc tính ụ nghĩa

Visible Ki u boolean: Có giá tr True hoặc False: Có xuất hiện SpinEdit và các thành phần bên nó hay không khi chạy ch ơng trình.

Enabled Ki u boolean: Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến các thành phần mà nó ch a hay không.

Hint Dòng gợi tả ngắn g n v TPanel khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà SpinEditl đó đ ợc nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 39: Các thuộc tính c a TSpinEdit

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi bạn gõ phím bất kỳ

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

OnChange Khi bạn thay đổi giá tr trong đ i t ợng c a thành phần TSpinEdit

B ng 40: Các sự kiện c a TSpinEdit

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Show; Th tục hi n th đ i t ợng khi chạy ch ơng trình.

Hide; Th tục ẩn đ i t ợng khi chạy ch ơng trình.

Clear; Th tục xóa hết giá tr trong TSpinEdit

B ng 41: Các ph ơng th c c a TSpinEdit

IV.11. Hộp danh sách đánh d u (TCheckListBox) Là thành phần kết hợp cả ch c năng c a TListBox và TCheckBox mà các bạn đư

h c. Trong TListBox, mỗi phần tử t ơng ng v i một dòng. Còn trong TCheckListBox, mỗi phần tử t ơng ng v i mỗi hộp ki m. Tính năng c a này cho ng i lập trình ch n phần tử nào trong danh sách chỉ cần đánh dấu ch n trong hộp ki m là xong. Thành phần này nằm trong thẻ Additional.

Page 108: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 102

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho hộp danh sách đánh dấu.

Align Xác đ nh việc canh l trái, phải, trên, d i,... c a TCheckListBox bên trong thành phần ch a nó. Nếu có giá tr bằng alClient thì kích th c CheckListBox sẽ chiếm toàn bộ b mặt c a thành phần ch a nó.

Columns S cột trong đ i t ợng CheckListBox

Items Cho phép bạn nhập các phần tử có d ng lƠ hộp ki m vào CheckListBox trong lúc thiết kế thông qua cửa sổ “String List Editor”.

Items[i] Phần tử chỉ s th i trong CheckListBox. Chỉ s i bắt đầu từ 0 và tiếp tục là 1, 2,... trong hộp danh sách. Cách này th ng đ ợc dùng viết mư lệnh.

Checked[i] Phần tử th i trong TCheckListBox đ ợc đánh dấu ch n. Chỉ s i bắt đầu từ 0 và tiếp tục 1, 2,…

ItemIndex Trả v chỉ s phần tử hiện tại đang đ ợc ch n trong Items. Mặc nhiên có giá tr là –1 (ch a có phần tử nào đ ợc ch n)

Count Trả v s phần tử có mặt trong CheckListBox

SelCount Trả v s phần tử có đư đ ợc ch n trong CheckListBox

MultiSelect Có giá tr True hoặc False: Cho phép Click ch n cùng lúc nhi u phần tử (kết hợp v i phím Ctrl hoặc Shift) hay chỉ 1 phần tử.

Sorted Có giá tr True hoặc False: Sắp xếp các phần tử theo th tự chữ cái hoặc không sắp xếp.

Visible Có giá tr True hoặc False: có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v CheckListBox khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà CheckListBox đó đ ợc nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 42: Các thuộc tính c a TCheckListBox

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

Page 109: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 103

Tên s ki n Đáp ứng c a s ki n

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 43: Các sự kiện c a TCheckListBox

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Items.Add(const S: string): Integer; Hàm thêm phần tử ki u string vào phía cu i và trả v chỉ s c a phần tử này trong Items.

Items.Append(const S: string); Th tục n i thêm phần tử ki u string vào phía cu i Items.

Items.Delete(Index: Integer); Th tục xóa một phần tử chỉ s index trong Items.

Items.Insert(Index: Integer; const S: string);

Th tục xóa một phần tử kiếu string tại chỉ s index trong Items. Th tục này t ơng đ ơng câu lệnh gán vào thuộc tính Items nh sau: Items[index] := S;

Clear; Th tục xóa hết các phần tử trong TCheckListBox.

ClearSelection; Th tục xóa các phần tử đư ch n.

B ng 44: Các ph ơng th c c a TCheckListBox

Ví d 20: Viết ch ơng trình Đăng ký và tính h c phí cho sinh viên

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmVidu

Caption Vi du ve CheckListBox

B ng 45: Thiết lập thuộc tính Form.

- Đặt các đ i t ợng lên form và đặt thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

CheckListBox Name clbTenMH

Page 110: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 104

Đối t ng Thuộc tính Giá trị

Items

Gồm 15 ph n t nh sau: Thuc hanh Tin hoc can ban LT Microsoft Access TH Microsoft Access LT Lap trinh Can ban B - Delphi TH Lap trinh can ban B Anh van Can ban Dai so Tuyen tinh Toan cao cap Xac xuat thong ke Ke toan dai cuong Suc ben Vat lieu Ly thuyet mang Cai dat & Quan tri mang Thiet ke Web

ListBox

Name lbxSoTC

Items

Gồm 15 ph n t nh sau: 2 3 2 3 2 2 3 3 5 4 5 5 3

5

SpinEdit

Name speGia1TC

MinValue 15000

MaxValue 30000

Value 15000

Increment 1000

Memo Name memTienHP

Lines 0 line (rỗng)

Button 1 Name btnTinhTien

Caption Tinh &tien hoc phi

Button 2 Name btnThemMH

Caption Them ten &mon hoc moi

và một s Label nh thiết kế form

Page 111: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 105

Đo n mư l nh ch ng trình:

unit untVidu;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CheckLst, Spin, ExtCtrls;

type

TfrmViDu = class(TForm)

clbTenMH: TCheckListBox;

btnTinhTien: TButton;

Label1: TLabel;

lbxSoTC: TListBox;

Label2: TLabel;

speGia1TC: TSpinEdit;

Label3: TLabel;

btnThemMH: TButton;

memTienHP: TMemo;

Label4: TLabel;

Label5: TLabel;

procedure btnThemMHClick(Sender: TObject);

procedure btnTinhTienClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmViDu: TfrmViDu;

implementation

{$R *.dfm}

procedure TfrmViDu.btnThemMHClick(Sender: TObject);

var mTenMH:string; mSoTC:integer;

begin

mTenMH := InputBox('Hop nhap','Nhap ten mon hoc','');

if TryStrToInt(InputBox('Hop nhap','Nhap so tin chi','3'), mSoTC) and (mSoTC>=1) and (mTenMH<>'') then

begin

clbTenMH.Items.Add(mTenMH);

lbxSoTC.Items.Add(IntToStr(mSoTC));

end

else ShowMessage('Ban nhap SAI du lieu ve mon hoc.')

end;

Page 112: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 106

procedure TfrmViDu.btnTinhTienClick(Sender: TObject);

var i, mSoMH, mTongSoTC, mTienHP:integer;

begin

mSoMH:=0; mTongSoTC:=0;

memTienHP.Lines.Clear;

for i:=0 to clbTenMH.Items.Count - 1 do

if clbTenMH.Checked[i] then

begin

inc(mSoMH);

inc(mTongSoTC,StrToInt(lbxSoTC.Items[i]));

end;

mTienHP:=mTongSoTC*speGia1TC.Value;

memTienHP.Lines.Add('* So mon ban da chon de dang ky la: '+ IntToStr(mSoMH));

memTienHP.Lines.Add('* Tong so tien dong hoc phi la: '+ IntToStr(mTienHP));

end;

end.

- L u dự án vào th mục S:\ViDuCheckListBox

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 58: Ch n tên môn h c và ch n Tính ti n h c phí

Page 113: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 107

Hình 59: Thêm tên môn h c m i và s tín chỉ

Hình 60: Sau khi thêm tên môn h c m i và tính lại ti n h c phí

IV.12. Hộp danh sách các khoá (TValueListEditor) Thành phần này gần gi ng nh TListBox, nh ng mỗi phần tử/dòng thì có 2 phần:

phần tên khoá (Key name) và phần trị khoá (Key value). Hai phần này đ ợc th hiện trên 2 cột và tiêu đ c a 2 cột này mặc nhiên là Key và Value. Tuy nhiên ta có th thay đổi tên tiêu đ này. Thành phần này nằm trong thẻ Additional.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng ValueListEditor, tên này đ ợc đặt nh tên biến và đ ợc sử dụng trong việc viết mư lệnh c a ch ơng trình.

TitleCaptions Tiêu đ cho các cột c a ValueListEditor. Bạn Click vào nút đ thay đổi tên tiêu đ nếu bạn cần thông qua cửa sổ “String List Editor”

DisplayOptions doColumnTitles: Có hi n th (True) hay không (False) hi n th hàng tiêu đ . Nếu có hàng tiêu đ , thì nó là hàng đầu tiên trong

Page 114: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 108

Tên thuộc tính ụ nghĩa

ValueListEditor nên có chỉ s hàng là 0.

Strings

Cho phép bạn nhập các phần tử hay hàng c a TValueListEditor, v i m i ph n t có 2 ph n: Tên khoá vƠ trị khoá vào TValueListEditor trong lúc thiết kế thông qua cửa sổ “Value List Editor” khi bạn Click vào nút

RowCount Trả v s hàng (có tính cả hàng tiêu đ ) có mặt trong ValueListEditor.

ColCount Trả v s cột trong ValueListEditor.

Strings.Count S hàng/phần tử không tính hàng tiêu đ có trong ValueListEditor

Keys[i]

Là tên khoá (ki u String) th i trong ValueListEditor. Chỉ s i bắt đầu từ 0 và tiếp tục là 1, 2,... Cách này th ng đ ợc dùng viết mư lệnh (Coding). Bạn cần chú ý là: Nếu không hi n th hàng tiêu đ , thì phần tử đầu tiên sẽ có chỉ s bắt đầu là 0. Còn nếu có hi n th hàng tiêu đ thì phần tử đầu tiên có chỉ s hàng bắt đầu từ 1.

Values[i] Là tr khoá (ki u String) th i c a ValueListEditor. Trong đó i lên tên c a khoá c a phần tử th i.

Strings[i]

Trả v tr khoá (ki u String) c a phần tử th i. Chỉ s i luôn luôn bắt đầu từ 0 rồi 1, 2,… Bạn cần chú ý là: Thuộc tính này KHỌNG tính hàng tiêu đ . Nếu có hi n th hàng tiêu đ thì phần tử đầu tiên có chỉ s là 0 và phần tử cu i cùng là RowCount-1 (hay Strings.Count). Còn nếu không hi n th hàng tiêu đ , thì phần tử đầu tiên có chỉ s là 0 và phần tử cu i cùng là RowCount-2 (hay Strings.Count-1).

Row

Trả v chỉ s hàng hiện hành c a phần tử đ ợc ch n khi chạy ch ơng trình. Nếu không hi n th hàng tiêu đ thì chỉ s hàng đầu tiên bắt đầu từ 0 rồi 1, 2, … Còn nếu có hi n th hàng tiêu đ thì chỉ s hàng đầu tiên có chỉ s hàng bắt đầu từ 1.

Col Trả v chỉ s cột hiện hành c a phần tử đ ợc ch n khi chạy ch ơng trình. Chỉ s cột bắt đầu từ 0 rồi 1, 2, …

Cell[i,j] Trả v giá tr trong ô chỉ s cột i và hàng j.

KeyOptions

Các tuỳ ch n trên cột khoá (Key): Cho phép (True) hay không cho phép (False): sửa tên khoá - keyEdit, thêm tên khoá - keyAdd, xoá tên khoá - keyDelete, ki m tra tên khoá duy nhất (không trùng khoá) - keyUnique.

Options

Các tuỳ ch n trên cột giá tr (Value) c a khoá: Cho phép (True) hay không cho phép (False): thay đổi tr khoá- goEditing, sử dụng phím Tab và tổ hợp phím Shift + Tab - goTabs, ch n cả hàng – goRowSelect,…

Visible Có giá tr True hoặc False: có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v CheckListBox khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

Page 115: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 109

Tên thuộc tính ụ nghĩa

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà đ i t ợng này nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 46: Các thuộc tính c a TCheckListBox

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

OnSelectCell Khi một ô bất kỳ trong TValueListEditor đ ợc Click ch n.

B ng 47: Các sự kiện c a TValueListEditor

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

InsertRow(const KeyName, Value: string; Append: Boolean): Integer;

Hàm chèn thêm vào một hàng (phần tử) gồm tên khoá và tr khoá. Nếu mu n chèn phía trên hàng hiện hành thì truy n tr False cho tham s Append; Còn nếu mu n chèn phần tử vào cu i danh sách thì cho Append bằng True.

DeleteRow(ARow: Integer); Th tục xoá một hàng bất kỳ.

FindRow(const KeyName: string; var Row: Integer): Boolean;

Hàm tìm một phần tử dựa vào tên khoá (Key). Nếu tìm thấy thì hàm sẽ trả v giá tr True và tham biến Row sẽ ch a chỉ s hàng c a phần tử đầu tiên đ ợc tìm thấy. Còn ng ợc lại hàm trả v giá tr False.

Strings.Add(const S: string): Integer; Hàm thêm một tr khoá (cột Value) ki u string vào phía cu i và trả v chỉ s c a phần tử này.

Strings.Append(const S: string); Th tục n i thêm một tr khoá cột Value.

Strings.Delete(Index: Integer); Th tục xóa một hàng/phần tử chỉ s index trong Items.

Strings.Clear; Th tục xóa hết các hàng (phần tử) trong TValueListEditor nga i trừ hàng tiêu đ .

B ng 48: Các ph ơng th c c a TValueListEditor

Page 116: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 110

Ví d 21: Viết ch ơng trình nhập vào danh sách các mặt hàng và đơn giá. Tìm kiếm theo mặt hàng.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve ValueListEditor

B ng 49: Thiết lập thuộc tính Form.

- Đặt các đ i t ợng lên form và đặt thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

ValueListEditor

Name vleMatHang

TitleCaptions 2 lines t ng ứng lƠ Key vƠ Value: Ten Giao Trinh:

Don Gia:

Strings

Key Value

Ly thuyet Access

Thuc hanh Access

Ly thuyet Delphi

Thuc hanh Delphi

150

145

165

140

KeyOptions KeyEdit = True, KeyAdd=True

KeyDelete = False, KeyUnique=True

LabeledEdit th 1

Name lbeTenHang

EditLabel.Caption Nhap &Ten giao trinh moi:

LabelPosistion lpAbove

Text (rỗng)

LabeledEdit th 2

Name lbeDonGia

EditLabel.Caption Nhap &Don gia:

LabelPosistion lpAbove

Text (rỗng)

LabeledEdit th 3

Name lbeKQTK

EditLabel.Caption Ket qua tim kiem.

LabelPosistion lpBelow

Text (rỗng)

Button th 1 Name btnThem

Page 117: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 111

Đối t ng Thuộc tính Giá trị

Caption Them vao &danh sach

Button th 2 Name btnTimKiem

Caption Tim &kiem

và 1 Label nh thiết kế form

Đo n mư l nh ch ng trình:

unit untViDu;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, ValEdit, StdCtrls, ExtCtrls;

type TfrmMain = class(TForm)

vleMatHang: TValueListEditor;

lbeTenHang: TLabeledEdit;

lbeDonGia: TLabeledEdit;

btnThem: TButton;

Label1: TLabel;

btnTimKiem: TButton;

lbeKQTK: TLabeledEdit;

procedure btnThemClick(Sender: TObject);

procedure btnTimKiemClick(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var frmMain: TfrmMain;

implementation {$R *.dfm}

procedure TfrmMain.btnThemClick(Sender: TObject);

var mDGia:Single; mVitri:integer;

begin if (lbeTenHang.GetTextLen>0) and TryStrToFloat(lbeDonGia.Text,mDGia) and (mDGia>0) then

Page 118: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 112

if vleMatHang.FindRow(lbeTenHang.Text,mViTri) = True then

ShowMessage('Sorry!... Giao trinh nay (Key) da ton tai roi.')

else //Chua ton tai, thi them vao

vleMatHang.InsertRow(lbeTenHang.Text, lbeDonGia.Text,True)

else ShowMessage('Ban nhap du lieu khong hop le!...');

end;

procedure TfrmMain.btnTimKiemClick(Sender: TObject);

var mOK, mTimThay:Boolean; mTenHang: string; mViTri:Integer;

begin lbeKQTK.Clear;

mOK := InputQuery('Hop Nhap','Nhap chinh xac ten giao trinh can tim: ',mTenHang);

if mOK then

begin mTimThay := vleMatHang.FindRow(mTenHang, mVitri);

if mTimThay then lbeKQTK.Text := 'Tim thay o vi tri thu '+ IntToStr(mViTri)

else lbeKQTK.Text := 'Tim KHONG thay.';

end else ShowMessage('Ban bo qua viec tim kiem.');

end;

end.

- L u dự án vào th mục S:\ViDuValueListEditor

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 61: Thêm giáo trình "Anh văn căn bản"

Page 119: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 113

- Nếu bạn nhập thêm vào tên giáo trình đư có, ví dụ nh : "Ly thuyet Delphi" thì sẽ nhận đ ợc thông báo nh sau:

Hình 62: Nhập b trùng

Hình 63: Tìm kiếm theo tên giáo trình

IV.13. Hộp li t kê th (TComboBox) Là thành phần liệt kê một danh sách các phần tử thả xu ng. Các phần tử này có th

đ ợc nhập trực tiếp hoặc không th nhập trực tiếp khi chạy ch ơng trình là tùy thuộc vào ki u (Style) mà bạn thiết lập nó quá trình thiết kế.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Page 120: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 114

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng hộp liệt kê thả.

AutoDropDown Có giá tr True hoặc False: Nút liệt kê thả tự động thả xu ng hay không khi nhấn một phím.

Items Cho phép bạn nhập các phần tử vào ComboBox lúc thiết kế thông qua cửa sổ “String List Editor”.

Items[i] Phần tử chỉ s th i trong ComboBox. Chỉ s i bắt đầu từ 0 và tiếp tục là 1, 2,... trong hộp liệt kê thả. Cách này th ng đ ợc dùng viết mư lệnh.

ItemIndex Xác đ nh chỉ s phần tử đ ợc ch n, chỉ s này có giá tr bắt từ 0, 1, 2,... Nếu ItemIndex = -1 thì ch a có phần tử nào đ ợc ch n.

Items.Count Tổng s các phần tử có trong hộp liệt kê thả.

DropDownCount S l ợng các phần tử đ ợc liệt kê trong hộp liệt kê thả tại mỗi th i đi m.

Style

Có 2 giá tr mà bạn cần phân biệt đó là: - csDropDown Cho phép bạn nhập trực tiếp thêm một phần tử m i vào trong TComboBox.

- csDropDownList chỉ cho bạn ch n từ danh sách các phần tử có sẵn trong ComboBox.

Text Xác đ nh chuỗi văn bản (hay phần tử) đang hi n th trong TComboBox

Sorted Có giá tr True hoặc False: Sắp xếp các phần tử theo th tự chữ cái hoặc không sắp xếp.

Visible Có giá tr True hoặc False: Có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v TComboBox khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà ComboBox đó đ ợc nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 50: Các thuộc tính c a TComboBox

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

Page 121: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 115

Tên s ki n Đáp ứng c a s ki n

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 51: Các sự kiện c a TComboBox

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Items.Add(const S: string): Integer; Hàm thêm phần tử ki u string vào phía cu i và trả v chỉ s c a phần tử này trong Items.

Items.Append(const S: string); Th tục n i thêm phần tử ki u string vào phía cu i Items.

Items.Delete(Index: Integer); Th tục xóa một phần tử chỉ s index trong Items.

Items.Insert(Index: Integer; const S: string);

Th tục xóa một phần tử kiếu string tại chỉ s index trong Items. Th tục này t ơng đ ơng câu lệnh gán vào thuộc tính Items nh sau: Items[index] := S;

Clear; Th tục xóa hết các phần tử trong ListBox.

B ng 52: Các ph ơng th c c a TComboBox

- Một số khái ni m đ c s d ng trong ví d : + Câu lệnh rẽ nhánh: case <biến> of

Giá_tr _i: công_việc_i;

end;

+ Hàm Trunc(x): trả v phần s nguyên c a một s lẻ thập phân x

Ví d 22: Máy tính đơn giản sử dụng thành phần ComboBox.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong ComboBox

BorderIcons []

Position poDesktopCenter

B ng 53: Thiết lập các thuộc tính TForm.

Page 122: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 116

- Đặt các đ i t ợng lên form và thiết lập các thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

ComboBox

Name cboToantu

Items

+

-

*

/

Div

Mod

Style csDropDownList

ItemIndex -1

Edit th 1

Name edt_ToanHang1

Text 0

TabOrder 0

Edit th 2

Name edt_ToanHang2

Text 0

TabOrder 1

Edit th 3

Name Edt_Kq

Text 0

ReadOnly True

Button Name btnKetThuc

Caption &Ket thuc

và 4 Label v i Caption nh mô tả trong form.

B ng 54: Thiết lập các thuộc tính c a các đ i t ợng

- L n l t nh p vƠo các cơu l nh cho các th t c s ki n nh sau:

unit untMaytinh;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

cboToantu: TComboBox;

edtToanHang1: TEdit;

edtToanHang2: TEdit;

Page 123: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 117

edt_Kq: TEdit;

btnKetThuc: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

procedure cboToantuChange(Sender: TObject);

procedure btnKetThucClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.cboToantuChange(Sender: TObject);

var a, b:extended;

begin

if (TryStrToFloat(edtToanHang1.Text,a)) and

(TryStrToFloat(edtToanHang2.Text,b)) then

case cboToantu.ItemIndex of

0: edt_Kq.Text := FloatToStr(a + b);

1: edt_Kq.Text := FloatToStr(a - b);

2: edt_Kq.Text := FloatToStr(a * b);

3: if b<>0 then

edt_Kq.Text := FloatToStr(a / b)

else edt_Kq.Text := 'Loi!... Mau so bang khong.';

4: if b<>0 then

edt_Kq.Text := IntToStr(Trunc(a) Div Trunc(b))

else edt_Kq.Text := 'Loi!... Mau so bang khong.';

5: if b<>0 then

edt_Kq.Text := IntToStr(Trunc(a) Mod Trunc(b))

else edt_Kq.Text := 'Loi!... Mau so bang khong.';

Page 124: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 118

end // end case

else // else if

edt_Kq.Text :='Du lieu nhap vao sai!...';

end;

procedure TfrmMain.btnKetThucClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViDuComboBox

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 64: Kết quả ch ơng trình ComboBox

IV.14. L ới chu i (TStringGrid) Là thành phần đ ợc thiết kế theo dạng bảng gồm các ô ch a dữ liệu ki u chuỗi. Các

ô này đ ợc xác đ nh b i đánh chỉ s cột và chỉ s hàng. Trong TStringGrid, chỉ s cột đầu tiên (cột bên trái nhất) và hàng đầu tiên (hàng trên nhất) đ ợc đánh s mặc đ nh là 1. Tuy nhiên, bạn có th thay đổi chỉ s này v 0 đ phù hợp chỉ s bắt đầu c a mảng (Array) trong Delphi là 0 (zero) dựa vào các thuộc tính c a TStringGrid đ ợc mô tả chi tiết d i đây.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính Ý nghĩa

Name Xác đ nh tên cho đ i t ợng StringGrid.

FixedCols Xác đ nh chỉ s cột đầu tiên (bên trái nhất) trong l i, các giá tr này có th bắt đầu từ 0, 1, 2,... Mặc đ nh có giá tr là 1.

FixedRows Xác đ nh chỉ s hàng đầu tiên (hàng trên nhất) trong l i, các giá tr

Page 125: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 119

Tên thuộc tính Ý nghĩa

này có th bắt đầu từ 0, 1, 2,... Mặc đ nh có giá tr là 1.

ColCount Xác đ nh s cột trong l i, s cột đ ợc đánh chỉ s bắt đầu từ 0 đến ColCount-1

RowCount Xác đ nh s hàng trong l i, s hàng đ ợc đánh chỉ s bắt đầu từ 0 đến RowCount-1

Col Chỉ s cột c a ô hiện hành

Row Chỉ s hàng c a ô hiện hành

Cells[i,j] Giá tr trong ô chỉ s cột i và hàng j

Options

Là các tùy ch n cho l i, d i đây trình bày là một s tùy ch n: - goEditing có giá tr True hoặc False, cho hay không phép soạn thảo trong các ô l i. - goTabs có giá tr True hoặc False, cho hay không cho sử dụng phím Tab đ di chuy n qua lại giữa các ô. - goRowSelect có giá tr True hoặc False, cho hay không phép ch n tất cả các ô trên toàn bộ một hàng.

ScrollBars

Xác đ nh s thanh cuộn cần hi n th , các giá tr c a nó nh sau: - ssBoth: Hi n th cả 2 thanh cuộn đ ng và ngang

- ssHorizontal: Hi n th thanh cuộn ngang

- ssVertical: Hi n th thanh cuộn đ ng

- ssNone: Không hi n th thanh cuộn nào cả

Visible Có giá tr True hoặc False: Có xuất hiện hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến nó.

Hint Dòng gợi tả ngắn g n v StringGrid khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà StringGrid nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 55: Các thuộc tính TStringGrid

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi bạn Click vào đ i t ợng

OnContextPopup Khi bạn RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi bạn DClick vào đ i t ợng

OnExit Khi bạn đ a con nháy vừa r i kh i đ i t ợng

OnKeyDown Khi bạn gõ phím bất kỳ

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các

Page 126: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 120

Tên s ki n Đáp ứng c a s ki n

phím đi u khi n nh : F1, Ctrl, Shift,...

OnSelectCell Khi bạn Click vào ô đ ợc ch n

B ng 56: Các sự kiện TStringGrid

- Một số khái ni m đ c s d ng trong ví d : + Câu lệnh bao nhóm: with tên_đ i_t ợng do

begin

các thuộc tính

và ph ơng th c c a đ i t ợng

end;

+ Câu lệnh lặp: for i := tr _đầu to tr _cu i do công_việc;

Nếu trị_cuối >= trị_đ u thực hiện công_vi c v i (tr _cu i - tr _đầu +1) lần.

Ví d 23: Hi n th bảng 26 ký tự chữ cái. Click vào ô t ơng ng trong l i đ hi n th ký tự trong ô bạn vừa ch n.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmAlphabet

Caption Vi du ve doi tuong StringGrid

Position poDesktopCenter

B ng 57: Thiết lập các thuộc tính cho Form.

- Đặt các đ i t ợng lên form và thiết lập các thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

StringGrid Name stgAlphabet

Label

Name lblAlphabet

Caption BANG 26 KY TU CHU CAI

Font.Size 12

B ng 58: Thiết lập các thuộc tính cho các đ i t ợng

Đo n mư l nh ch ng trình:

unit untAlphabet;

interface

Page 127: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 121

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Grids, StdCtrls;

type

TfrmAlphabet = class(TForm)

stgAlphabet: TStringGrid;

Label1: TLabel;

procedure FormActivate(Sender: TObject);

procedure stgAlphabetSelectCell(Sender: TObject; ACol, ARow: Integer;

var CanSelect: Boolean);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmAlphabet: TfrmAlphabet;

implementation

{$R *.dfm}

procedure TfrmAlphabet.FormActivate(Sender: TObject);

var i, j, k : Integer;

begin

k := 0;

with stgAlphabet do

begin

FixedCols:=0; // Cột trái nhất

FixedRows:=0; // Hàng trên nhất

ColCount:=5; RowCount:=6;

Options := Options+ [goEditing]; //cho phép cập nhật

for i := FixedCols to ColCount - 1 do

for j:= FixedRows to RowCount - 1 do

begin

k := k + 1;

if k <= 26 then Cells[i,j] := Chr(k+64);

Page 128: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 122

end;

end;

end;

procedure TfrmAlphabet.stgAlphabetSelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

begin

ShowMessage('Ky tu ban vua chon la: '+ stgAlphabet.Cells[ACol,ARow]);

{v i tham s ACol t ơng đ ơng v i thuộc tính Col, và ARow t ơng đ ơng Row }

end;

end.

- L u dự án vào th mục S:\ViduStringGrid

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 65: Kết quả ch ơng trình StringGrid

Ví d 24: Viết ch ơng trình hi n th 256 ký tự c a bảng mư ASCII. Sử dụng bảng có 24 cột và 11 hàng; độ cao và độ rộng mặc nhiên c a ô là 24.

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá trị

Name frmBangASCII

Caption Bang ma ASCII

Position poDesktopCenter

B ng 59: Thuộc tính c a frmBangASCII

Page 129: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 123

- Đặt các đ i t ợng lên form và thiết lập các thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

StringGrid

Name grdASCII

DefaulColWidth 24

DefaulRowHeight 124

FixedCols 0

FixRows 0

và đ i t ợng nhưn Label.

B ng 60: Thuộc tính các đ i t ợng trên form

- Đo n mư l nh ch ng trình: unit untBangASCII;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TfrmBangASCII = class(TForm)

grdASCII: TStringGrid;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmBangASCII: TfrmBangASCII;

implementation

{$R *.dfm}

procedure TfrmBangASCII.FormCreate(Sender: TObject);

var i,k,j:integer;

begin

k:=0;

for i:=0 to grdASCII.ColCount-1 do

for j:=0 to grdASCII.RowCount-1 do

begin

Page 130: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 124

if k<=256 then grdASCII.Cells[i,j]:=chr(k);

k:=k+1;

end;

end;

end.

- L u dự án vào th mục S:\ViduStringGrid2

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 66: Hi n th bảng mư ASCII

IV.15. B ng chứa các thƠnh ph n (TPanel) Th ng đ ợc dùng đ nhóm các thành phần khác nhau cùng đặt bên trong nó đ gm

lại thành nhóm riêng biệt cho dễ quản lý, lập trình và thao tác.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho đ i t ợng Panel.

Align Xác đ nh việc canh l trái, phải, trên, d i,... c a Panel bên trong thành phần ch a nó. Nếu có giá tr bằng alClient thì kích th c Panel sẽ chiếm toàn bộ b mặt c a thành phần ch a nó.

Alignment Canh trái (taLeftJustify), canh phải (taRightJustify), canh giữa (taCenter) tiêu đ .

Caption Tiêu đ c a TPanel

Page 131: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 125

Tên thuộc tính ụ nghĩa

BorderStyle Không kẻ khung (bsNone), có kẻ khung (bsSingle)

Visible Có giá tr True hoặc False: Có xuất hiện Panel và các thành phần bên nó hay không khi chạy ch ơng trình.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến các thành phần mà nó ch a hay không.

Hint Dòng gợi tả ngắn g n v Panel khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

TabOrder Đ ợc đánh th tự bắt đầu từ 0, 1, 2,... đ xác đ nh th tự mà Panel đó đ ợc nhận Focus khi bạn nhấn phím Tab. Ch c năng này chỉ có tác động khi thuộc tính TabStop có giá tr True.

B ng 61: Các thuộc tính c a TPanel

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi ng i sử dụng Click vào đ i t ợng

OnContextPopup Khi ng i sử dụng RClick vào đ i t ợng, hoặc thực hiện việc bật lên menu đ i t ợng.

OnDblClick Khi ng i sử dụng DClick vào đ i t ợng

OnExit Khi đ i t ợng mất tiêu đi m (Lost Focus)

OnKeyDown Khi có phím bất kỳ đ ợc nhấn

OnKeyPress Gần nh sự kiện OnKeyDown, nh ng không đáp ng cho các phím đi u khi n nh : F1, Ctrl, Shift,...

B ng 62: Các sự kiện c a TPanel

* Một s ph ơng th c (Method) th ng dùng:

Cú pháp c a ph ng thức ụ nghĩa

Show; Th tục hi n th đ i t ợng khi chạy ch ơng trình.

Hide; Th tục ẩn đ i t ợng khi chạy ch ơng trình.

B ng 63: Các ph ơng th c c a TPanel

IV.16. Thanh th c đ n chính (TMainMenu) Th ng đ ợc sử dụng khi ch ơng trình c a bạn có nhi u ch c năng khác nhau. Đ

giúp cho ng i sử dụng dễ dàng sử dụng ch ơng trình hơn, ng i ta th ng thiết kế một thanh thực đơn chính. Thanh thực đơn này bao gồm nhi u thực đơn (Menu Item) ghép lại.

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Page 132: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 126

Tên thuộc tính Ý nghĩa

Name Xác đ nh tên cho thực đơn chính, tên này đ ợc đặt nh tên biến và đ ợc sử dụng trong việc viết mư lệnh c a ch ơng trình và gắn kết vào các đ i t ợng khác (nếu có).

Items

Cho phép bạn nhập các thực đơn (MenuItem) vào MainMenu tại th i đi m thiết kế thông qua ch c năng “Menu Designer”. Bạn cũng có th RClick, DClick vào bi u t ợng MainMenu hoặc tên đ i t ợng trong cửa sổ Object TreeView đ thiết kế thanh thực đơn này. Bạn chú ý là mỗi thực đơn đ ợc tạo ra b i thành phần TMenuItem đ ợc dẫn xuất từ l p cha (Ancestor class) là TComponent. L p TMenuItem này đ ợc trình bày phần tiếp theo.

Images

Danh sách các hình ảnh (thông qua thành phần TImageList trên tab Win32) đ ợc gắn vào các thực đơn c a thanh menu. Bạn cũng có th gắn từng hình ảnh vào từng thực đơn thông qua thuộc tính Bitmap c a mỗi thực đơn (TMenuItem)

B ng 64: Các thuộc tính c a TMainMenu

* Cách s d ng: Th ng một thanh thực đơn đ ợc đặt trong một cửa sổ chính (giao diện ch ơng trình). Đ gắn TMainMenu này vào form chính (MainForm), bạn m MainForm chế độ thiết kế, và từ thuộc tính Menu bạn Click ch n tên (name) c a MainMenu cần gắn lên.

IV.17. Th c đ n (TMenuItem)

* Bi u t ợng: Không có. Nó đ ợc tự động tạo ra b i ch c năng “Menu Designer” trong quá trình thiết kế thanh thực đơn chính (Main Menu).

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho thực đơn, tên này đ ợc đặt nh tên biến và đ ợc sử dụng trong việc viết mư lệnh c a ch ơng trình.

AutoCheck Có giá tr True thì lúc bạn chạy ch ơng trình và Click vào thực đơn thì Delphi sẽ tự động bật/tắt dấu Check lên phía tr c c a thực đơn; ng ợc lại thì có giá tr False.

Checked Có giá tr True và False: Bạn đánh dấu check vào thực đơn này ngay th i đi m thiết kế.

Bitmap Gắn hình ảnh vào thực đơn

Caption Tiêu đ c a thực đơn

ImageIndex Là chỉ mục hình ảnh trong danh sách hình c a ImageList. Mặc nhiên có giá tr là –1 : không sử dụng hình ảnh trong ImageList.

Enabled Có giá tr True hoặc False: Cho phép hay không ng i sử dụng truy xuất đến các thành phần mà nó ch a hay không.

Hint Dòng gợi tả ngắn g n v MenuItem khi bạn tr mouse đến nó. Ch c năng này chỉ có tác động khi thuộc tính ShowHint là True.

Page 133: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 127

Tên thuộc tính ụ nghĩa

ShortCut Xác đ nh (tổ hợp) phím nóng cho thực đơn.

Visible Có giá tr True hoặc False: Cho hi n th hay không cho hi n th TMenuItem.

B ng 65: Các thuộc tính c a TMenuItem

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnClick Khi bạn Click ch n vào thực đơn lúc chạy ch ơng trình.

B ng 66: Sự kiện c a TMenuItem

Ví d 25: Ch ơng trình tiện ích

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a main form (Giao diện chính) nh sau:

Thuộc tính Giá tr

Name frmMain

Caption Vi du ve doi tuong MainMenu

Position poMainFormCenter

B ng 67: Thiết lập các thuộc tính cho form frmMain

- Đặt các thành phần lên form và thiết lập thuộc tính nh sau. Chú ý TMainMenu chỉ có 1 thực đơn (TMenuItem) là Tien ich, trong thực đơn Tien ich thì có 4 thực đơn cấp con (TMenuItem) là May tinh, Xem ngay gio, Đ ờng phơn cách (dấu - ) và Thoat

Đối t ng

Thuộc tính

Giá trị

MainMenu

Name mmuMainForm

Items

Có 5 TMenuItem nh sau:

Thứ Name Caption Shortcut Bitmap

1 mniTienIch &Tien ich

2 mniMayTinh &May tinh Ctrl+M Calculator.bmp

3 mniXemngaygio Xem &ngay gio

Ctrl+D Clock.bmp

4 mniN1 -

5 mniThoat &Thoat Ctrl+Q Close.bmp

B ng 68: Thiết lập các thuộc tính cho các đ i t ợng trên Form

Page 134: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 128

- Tạo thêm form “May tinh don gian” nh hình sau:

Hình 67: Thiết kế form frmMayTinh

Thuộc tính Giá trị

Name frmCalculator

Caption May tinh don gian

B ng 69: Thiết lập các thuộc tính frmMayTinh

Đối t ng Thuộc tinh Giá trị

RadioGroup

Name rgpPhepToan

Items

Cong Tru Nhan Chia Div Mod

Edit th 1 Name edt_a

Edit th 2 Name edt_b

Edit th 3 Name edt_Kq

và một s nhưn theo form.

B ng 70: Các đ i t ợng trên frmMayTinh

- Tạo thêm form “Ngay gio hien hanh” nh hình và các thuộc tính sau:

Hình 68: Thiết kế form frmDateTime

Page 135: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 129

Đối t ng Thuộc tính Giá trị

Form Name frmDateTime

Caption Ngay gio hien hanh

Position poMainFormCenter

Label Name lblDateTime

B ng 71: Thiết lập các thuộc tính frmDateTime và lblDateTime

- Đoạn code c a ch ơng trình unit file untMain nh sau: unit untMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus;

type

TfrmMain = class(TForm)

mmuMainForm: TMainMenu;

mniTienIch: TMenuItem;

mniMayTinh: TMenuItem;

mniXemngaygio: TMenuItem;

mniN1: TMenuItem;

mniThoat: TMenuItem;

procedure mniMayTinhClick(Sender: TObject);

procedure mniXemngaygioClick(Sender: TObject);

procedure mniThoatClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

uses untMaytinh,untDateTime;

{$R *.dfm}

procedure TfrmMain.mniMayTinhClick(Sender: TObject);

begin

frmCalculator.ShowModal;

end;

Page 136: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 130

procedure TfrmMain.mniXemngaygioClick(Sender: TObject);

begin

frmDateTime.ShowModal;

end;

procedure TfrmMain.mniThoatClick(Sender: TObject);

begin

Close;

end;

end.

- Đoạn code c a ch ơng trình unit file untMayTinh nh sau: unit untMayTinh;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TfrmCalculator = class(TForm)

rgpPhepToan: TRadioGroup;

edt_a: TEdit;

edt_b: TEdit;

Label1: TLabel;

Label2: TLabel;

edt_Kq: TEdit;

Label3: TLabel;

procedure rgpPhepToanClick(Sender: TObject);

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmCalculator: TfrmCalculator;

implementation

{$R *.dfm}

procedure TfrmCalculator.rgpPhepToanClick(Sender: TObject);

var a, b: extended;

begin

Page 137: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 131

if TryStrToFloat(edt_a.Text,a) and TryStrToFloat(edt_b.Text,b) then

begin

Case rgpPhepToan.ItemIndex of

0: edt_Kq.Text := FloatToStr(a + b);

1: edt_Kq.Text := FloatToStr(a - b);

2: edt_Kq.Text := FloatToStr(a * b);

3: if b<> 0 then edt_Kq.Text := FloatToStr(a / b)

else edt_Kq.Text := 'Loi! Phep toans chia 0.';

4: edt_Kq.Text := FloatToStr(Trunc(a) DIV Trunc(b));

5: edt_Kq.Text := FloatToStr(Trunc(a) MOD Trunc(b));

end; // end case

end // end begin

else ShowMessage('Loi! Du lieu nhap sai.');

end;

procedure TfrmCalculator.FormActivate(Sender: TObject);

begin

edt_a.Clear;

edt_b.Clear;

edt_Kq.Clear;

end;

end.

- Đoạn code c a ch ơng trình unit file untDateTime; nh sau: unit untDateTime;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmDateTime = class(TForm)

lblDateTime: TLabel;

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmDateTime: TfrmDateTime;

Page 138: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 132

implementation

{$R *.dfm}

procedure TfrmDateTime.FormActivate(Sender: TObject);

begin

lblDateTime.Font.Color := clBlue;

lblDateTime.Font.Size:=15;

lblDateTime.Alignment:=taCenter;

lblDateTime.Caption:=DateToStr(Date)+ Chr(32)+ TimeToStr(time);

end;

end.

- Vào ch c năng Project/Options/tab Forms ch n Main Form là frmMain nh hình:

Hình 69: Ch n frmMain làm form chính.

- L u dự án vào th mục S:\ViduMainMenu

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 139: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 133

Hình 70: Kết quả ch ơng trình c a frmMain

- Click ch n ch c năng May tinh, ta có hình nh sau:

Hình 71: Hi n th form frmMayTinh

- Click ch n ch c năng Xem ngay gio, ta có hình nh sau:

Hình 72: Hi n th form frmDateTime

ví dụ trên, chúng ta sử dụng các form bình th ng (fsNormal) đ tạo giao diện chính (Main form). Tuy nhiên, khi bạn đư khá hi u v Delphi thì có một công cụ hữu ích là

Page 140: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 134

MDIForm (Multi Document Interface) đ tạo giao diện chính và quản lý dự án c a bạn hiệu quả và chuyên nghiệp hơn.

IV.18. Menu đối t ng (TPopupMenu) Còn đ ợc g i là trình đơn ngữ cảnh, hay menu tắt. Ch c năng th ng đ ợc sử dụng

vào mục đích bật một menu tại bất kỳ nơi nào trên đ i t ợng ch a nó khi bạn sử dụng thao tác RClick .

* Bi u t ợng:

* Một s thuộc tính th ng dùng:

Tên thuộc tính ụ nghĩa

Name Xác đ nh tên cho menu đ i t ợng, tên này đ ợc đặt nh tên biến và đ ợc sử dụng trong việc viết mư lệnh c a ch ơng trình và gắn kết vào các đ i t ợng khác (nếu có).

Alignment V trí xuất hiện c a TPopupMenu góc trên bên trái (paLeft), góc trên bên phải (paRight), góc trên giữa (paCenter) c a mouse.

AutoPopup Có giá tr True và False: Tự động bật hay không khi ng i sử dụng RClick.

Items

Cho phép bạn nhập các thực đơn (MenuItem) vào PopupMenu tại th i đi m thiết kế thông qua ch c năng “Menu Designer”. Bạn cũng có th Rclick, DClick vào thành phần TMainMenu hoặc tên đ i t ợng trong cửa sổ Object TreeView đ thiết kế thanh thực đơn này. Mỗi thực đơn trong PopupMenu đ ợc tạo ra b i thành phần TMenuItem nh đư trình bày phần trên.

Images

Danh sách các hình ảnh (thông qua thành phần ImageList trên tab Win32) đ ợc gắn vào các thực đơn c a thanh thực đơn. Bạn cũng có th gắn từng hình ảnh vào từng thực đơn thông qua thuộc tính Bitmap c a mỗi thực đơn (TMenuItem)

B ng 72: Các thuộc tính c a TPopupMenu

* Một s sự kiện th ng dùng:

Tên s ki n Đáp ứng c a s ki n

OnPopup Khi bạn RClick, chú ý rằng sự kiện này sẽ xảy ra tr c khi PopupMenu bật lên.

B ng 73: Sự kiện c a TPopupMenu

Ví d 26: Sử dụng TPopup đ thay đổi màu n n c a form:

- Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Page 141: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 135

Thuộc tính Giá trị

Name frmMain

Caption Vi du ve doi tuong PoupMenu

PopupMenu {Đ ợc xác lập b c sau}

B ng 74: Thiết lập các thuộc tính cho TForm

- Đặt các đ i t ợng lên form và thiết lập các thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

PopupMenu

Name pmuMauSac

Items

Có 6 TMenuItem nh sau:

Th Name Caption

1 mniMauXanh Mau &Xanh

2 mniMauDo Mau &Do

3 mniMauTim Mau &Tim

4 mniMauVang Mau &Vang

5 mniN1 -

6 mniMauBandau Mau &Ban dau

B ng 75: Thiết lập các thuộc tính cho các đ i t ợng trên form.

- Tr lại thuộc tính PopupMenu c a form frmMain, bạn gắn pmuMauSac vào form.

- Đo n code c a ch ng trình nh sau: unit untPopup;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus;

type

TfrmPopup = class(TForm)

pmuMauSac: TPopupMenu;

mniMauXanh: TMenuItem;

mniMauDo: TMenuItem;

mniMauTim: TMenuItem;

mniMauVang: TMenuItem;

mniN1: TMenuItem;

mniMauBandau: TMenuItem;

procedure mniMauXanhClick(Sender: TObject);

procedure mniMauDoClick(Sender: TObject);

procedure mniMauTimClick(Sender: TObject);

Page 142: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 136

procedure mniMauVangClick(Sender: TObject);

procedure mniMauBandauClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmPopup: TfrmPopup;

implementation

{$R *.dfm}

procedure TfrmPopup.mniMauXanhClick(Sender: TObject);

begin

frmPopup.Color := clBlue;

end;

procedure TfrmPopup.mniMauDoClick(Sender: TObject);

begin

frmPopup.Color := clRed;

end;

procedure TfrmPopup.mniMauTimClick(Sender: TObject);

begin

frmPopup.Color := clPurple;

end;

procedure TfrmPopup.mniMauVangClick(Sender: TObject);

begin

frmPopup.Color := clYellow;

end;

procedure TfrmPopup.mniMauBandauClick(Sender: TObject);

begin

frmPopup.Color := clBtnFace;

end;

end.

- L u dự án vào th mục S:\ViduPopup

- Biên d ch và chạy ch ơng trình, RClick lên Form, ta có kết quả nh sau:

Page 143: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 5: Lập trình xử lý sự kiện – Các thành phần c a Delphi

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 137

Hình 73: Kết quả ch ơng trình PopupMenu

Page 144: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 138

begin

Lệnh 1; Lệnh 2; ...

Lệnh n; end;

CH NG 6: CÁC L NH CÓ C U TRÚC

I. L nh ghép (Compound statement)

Một nhóm câu lệnh đơn đ ợc đặt giữa từ khoá begin ... end; sẽ tạo thành một câu lệnh ghép.

Trong Pascal ta có th đặt các lệnh ghép con trong các lệnh ghép l n hơn bao ngoài c a nó và có th hi u t ơng tự nh cấu trúc ngoặc đơn ( ) trong các bi u th c Toán h c.

* S đồ:

Hình 1: Lệnh ghép begin .. end;

hình minh h a trên ta thấy các lệnh đ ợc nhóm lại thành từng kh i (block). Một kh i lệnh bắt đầu bằng begin và chấm d t end; Trong một kh i lệnh cũng có th có các kh i lệnh con nằm trong nó. Một kh i ch ơng trình th ng đ ợc dùng nhóm từ 2 lệnh đơn tr lên đ tạo thành một Công_vi c c a các lệnh có cấu trúc, bạn sẽ gặp khái niệm này trong các ví dụ các phần sau.

II. L nh c u trúc rẽ nhánh

Lệnh có cấu trúc rẽ nhánh đ ợc sử dụng trong tr ng hợp ch ơng trình chỉ cần ch n một trong các công việc đ thực hiện tại một th i đi m.

II.1. L nh if ... then ... vƠ l nh if ... then ... else..

II.1.1. L nh if ... then

* L u đồ diễn tả các lệnh và ý nghĩa:

Hình 2: Lệnh if ... then ..;

* Cú pháp:

if <đi u_kiện> then công_việc;

* ụ nghĩa:

Nếu đi u_kiện có giá tr đúng thì sẽ thực hiện công_việc rồi kết thúc lệnh.

Ng ợc lại (đi u kiện có giá tr sai) thì sẽ b qua công_việc và kết thúc lệnh.

đi u_kiệ

công_việc

kết thúc lệnh if

true

false

Page 145: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 139

Ví d 1: Đoạn ch ơng trình sau mô tả cách thực hiện lệnh if ... then

begin { Lệnh mô tả một câu lệnh if ..then đơn giản v i đi u kiện luôn có giá tr True và ch ơng trình thực hiện công việc chỉ có 1 lệnh đơn } if true then

ShowMessage( ' Dieu kien dung.' );

// Lệnh này gi ng nh lệnh trên nh ng ch ơng trình thực hiện công việc bao gồm 2 lệnh

if (1 = 1) or ( true >= false) then // Đi u kiện có tr đúng begin //bắt đầu lệnh ghép ShowMessage( ' Dieu kien dung ' ); ShowMessage( ' Chao cac ban den voi Delphi - phiên bản 7.0' ); end; //hết lệnh ghép if 'Delphi' = 'Java' then // Đi u kiện có giá tr sai ShowMessage( ' Oh, dieu kien sai. Lenh se bi bo qua ' );

end;

II.1.2. L nh if ... then ... else

Hình 3: lệnh if ... then ... else

Chú ý:

- Đi u kiện là một bi u th c Boolean (có giá tr đúng: True hoặc sai: False).

- Nếu công việc sau then hoặc sau else có nhi u hơn một lệnh thì ta phải gói lại trong ghép begin ... end;

- Toàn bộ lệnh if ... then ... else xem nh 1 lệnh đơn.

- Lệnh đ ng tr c từ khóa else thì không có dấu chấm phẩy (;) cu i lệnh.

* Cú pháp:

if <đi u kiện> then

công_việc_1

else

công_việc_2;

*ụ nghĩa:

Nếu đi u kiện đúng thì thực hiện công việc 1 (không thực hiện công việc 2).

Ng ợc lại (đi u kiện sai) thì sẽ thực hiện công việc 2 (không thực hiện công việc 1).

đi u_kiện

công_việc_1

true

false

công_việc_2

kết thúc

Page 146: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 140

Ví d 2: Đoạn ch ơng trình sau mô tả cách thực hiện lệnh if ... then ... else

var x: single;

begin if 4>=4 then begin

x := 2*sin(PI/2)/sqrt(9);

ShowMessage( ' x = ' + FormatFloat('0.000', x);

end //không có dấu ;

else ShowMessage( 'Dieu kien sai');

// Kết quả hi n th giá tr biến x = 0.667

// Các lệnh IF lồng vào nhau if true Then if false Then ShowMessage(' I ' ) else ShowMessage(' LOVE ' ) else ShowMessage(' DELPHI ' );

end;

// Kết quả hi n th từ: LOVE

Ví d 3: Viết ch ơng giải ph ơng trình bậc nhất ax + b = 0

H ớng d n: - Tạo dự án m i: File/New/Application

L u Ủ: Do các bạn đư h c xong ch ơng 5, nên giáo trình sẽ trình bày cách viết ch ơng trình một cách ngắn g n hơn. Bạn phải tự xác đ nh và thiết lập các thuộc tính cho các đ i t ợng trong ch ơng trình sao cho thích hợp nhất theo ý c a mình. Giáo trình chỉ đ a ra các tên (name) c a đ i t ợng đ viết code cho dự án mà thôi.

- Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh sau:

Hình 4: Tên (name) c a các đ i t ợng

Page 147: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 141

- Thiết kế giao diện trên form:

Hình 5: Giao diện ph ơng trình bậc nhất

- Đoạn code c a ch ơng trình nh sau:

L u Ủ: Đ viết ch ơng trình cho chính xác, bạn cần phải xác đ nh đúng th tục sự kiện mà bạn xác đ nh là c a đối t ng nƠo ứng với s ki n gì trên form. Bạn có th xem lại trong phần “Cách hình thành th tục sự kiện” ch ơng 5.

unit untPtb1;//tên untPtb1 là do lưu unit file ╘ới ╖▐═ ╗═╖P╖⌡1.╒⌠╕ interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TfrmPTB1 = class(TForm)

lbl_a: TLabel;

lbl_b: TLabel;

edt_a: TEdit;

edt_b: TEdit;

lbl_KQua: TLabel;

memKQua: TMemo;

pnlLine: TPanel;

btnXuLy: TButton;

btnKetThuc: TButton;

procedure btnXuLyClick(Sender: TObject);

procedure btnKetThucClick(Sender: TObject);

Page 148: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 142

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmPTB1: TfrmPTB1;

implementation

{$R *.dfm}

procedure TfrmPTB1.btnXuLyClick(Sender: TObject);

var a, b, x: extended;

begin

memKQua.Lines.Clear;

if (TryStrToFloat(edt_a.Text, a)=true) and (TryStrToFloat(edt_b.Text, b)=true) then

begin

if a=0 then

if b=0 then

memKQua.Lines.Text:='Phuong trinh vo so nghiem'

else

memKQua.Lines.Text:='Phuong trinh vo nghiem'

else //a <>0

begin

memKQua.Lines.Add('Phuong trinh co nghiem:');

x:=-b/a;

memKQua.Lines.Add(' x= '+ FloatToStr(x));

end;

end

else

begin

memKQua.Lines.Text:='Nhap sai! Nhap lai he so a va b.';

edt_a.Clear; edt_b.Clear;

edt_a.SetFocus;

end;

end;

Page 149: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 143

procedure TfrmPTB1.btnKetThucClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViduPTB1

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 6: Chạy ch ơng trình

Ví d 4: Giải ph ơng trình ax2 + bx +c = 0

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 7: Tên các đ i t ợng và giao diện ch ơng trình

Page 150: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 144

- Đo n code c a ch ng trình nh sau: unit untPTB2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmPTB2 = class(TForm)

edt_a: TEdit;

edt_b: TEdit;

edt_c: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

btnGiai: TButton;

memKQ: TMemo;

Label4: TLabel;

btnNhapLai: TButton;

procedure btnGiaiClick(Sender: TObject);

procedure btnNhapLaiClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmPTB2: TfrmPTB2;

implementation

{$R *.dfm}

procedure TfrmPTB2.btnGiaiClick(Sender: TObject);

var a, b, c, delta, x1, x2: single;

mOK1, mOK2, mOK3: boolean;

begin

mOK1 := False; mOK2 := False; mOK3 := False;

memKQ.Lines.Clear;

mOK1 := TryStrToFloat(edt_a.Text,a);

mOK2 := TryStrToFloat(edt_b.Text,b);

mOK3 := TryStrToFloat(edt_c.Text,c);

if (mOK1 = True) and (mOK2 = True) and (mOK3 = True) then //nhap du lieu dung

Page 151: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 145

begin

if a = 0 then // giai ptb1

if b = 0 then

if c = 0 then memKQ.Lines.Add('Phuong trinh Vo so nghiem')

else memKQ.Lines.Add('Phuong trinh Vo nghiem')

else memKQ.Lines.Add('Phuong trinh co nghiem la ' + FloatToStr(c/b))

else // a <> 0, bat dau giai ptb2

begin

delta := sqr(b) - 4*a*c;

if delta < 0 then

memKQ.Lines.Add('Phuong trinh Vo nghiem.')

else

if delta = 0 then

memKQ.Lines.Add('Phuong trinh co nghiem kep x1 = x2 = '+FloatToStr(-b/(2*a)))

else

begin

x1 := (-b + sqrt(delta))/(2*a);

x2 := (-b - sqrt(delta))/(2*a);

memKQ.Lines.Add('Phuong trinh co 2 nghiem phan biet:');

memKQ.Lines.Add(' x1= '+FormatFloat('#,##0.00',x1));

memKQ.Lines.Add(' x2= '+FormatFloat('#,##0.00',x2));

end;

end; // end else a<>0

end // end if mOK1...

else // el╕e if: σhậ╒ dữ liệ╗ ╕⌠i. ShowMessage('Ban nhap he so a, b, c KHONG hop le!...');

end;

procedure TfrmPTB2.btnNhapLaiClick(Sender: TObject);

begin

edt_a.Clear;

edt_b.Clear;

edt_c.Clear;

memKQ.Lines.Clear;

edt_a.SetFocus;

end;

end.

- L u dự án vào th mục S:\ViduPTB2

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 152: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 146

Hình 8: Chạy ch ơng trình

II.2. L nh Case ... of

* Cú pháp, Ủ nghĩa: Case <bi u_th c> of // Xét giá tr c a bi u th c:

GT1 : công_việc_1 ; // Nếu bi u_th c = GT1 (giá tr 1) thì thực hiện công_việc_1,

GT2 : công_việc_2 ; // nếu bi u_th c = GT2 thì thực hiện công_việc_2,

GTn : công_việc_n ; // nếu bi u_th c = GTn thì thực hiện công_việc_n

[else công_việc_0 ;] //Ng ợc lại sẽ thực hiện công_việc_0

End; //end case

* Lưu đồ:

Hình 9: L u đồ lệnh Case ... of ... end;

công_việc_1

BI U TH C

công_việc_2 .... công_việc_n công_việc_0

case

of

end;

else

GT1 GT2 GTn GT0 GT...

Page 153: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 147

Chú ý:

- Lệnh Case ... of có th không có else

- Bi u th c trong Case... of phải có ki u dữ liệu r i rạc/đếm đ ợc nh : Integer, Char,...

- Nếu mu n ng v i nhi u giá tr khác nhau c a bi u th c mà máy vẫn thi hành một Công_việc thì các giá tr này có th viết trên cùng một hàng cách nhau b i dấu phẩy (,):

k1, k2, ..., kp : công_việc;

Ví d 5: Đoạn ch ơng trình sau mô tả cách sử dụng lệnh Case ... of var color: integer ;

begin color := StrToInt(InputBox('Hop nhap lieu', 'Nhap so tu 1 den 5','1'));

case color of

1, 2: ShowMessage('Mau do');

3, 4: ShowMessage('Mau trang');

5: ShowMessage('Mau xanh');

end;

end;

Ví d 6: Viết ch ơng trình nhập vào hai s thực a, b và một ký tự ch là phép tính cần thực hiện (+, -, *, /). Sau đó thực hiện phép tính và hi n th kết quả lên màn hình.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 10: Tên các đ i t ợng và giao diện ch ơng trình

Page 154: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 148

- Đo n code c a ch ng trình nh sau: unit untCaseOf;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

edt_a: TEdit;

Label2: TLabel;

edt_b: TEdit;

Label3: TLabel;

edt_PT: TEdit;

btnXemKQ: TButton;

btnKetThuc: TButton;

Label4: TLabel;

memKQua: TMemo;

procedure btnKetThucClick(Sender: TObject);

procedure btnXemKQClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnXemKQClick(Sender: TObject);

var a, b:extended; ch:char;

begin

memKQua.Lines.Clear;

a:=StrToFloat(edt_a.Text);

b:=StrToFloat(edt_b.Text);

ch:=edt_PT.Text[1]; // lấ╛ ký ╖ự đầ╗ ╖i▐═ case ch of

'+': memKQua.Lines.Add(' a+b= '+FloatToSTR(a+b));

'-': memKQua.Lines.Add(' a-b= '+FloatToSTR(a-b));

'*': memKQua.Lines.Add(' a*b= '+FloatToSTR(a*b));

'/': if b=0 then

memKQua.Lines.Add('Loi! Phep chia 0.')

else

Page 155: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 149

memKQua.Lines.Add(' a/b= '+FloatToStr(a/b));

else

memKQua.Lines.Add('Phep tinh khong thuc hien duoc');

end;

end;

procedure TfrmMain.btnKetThucClick(Sender: TObject);

begin

close;

end;

end.

- L u dự án vào th mục S:\ViduCaseOf

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 11: Chạy ch ơng trình

III. C u trúc l nh lặp

Lệnh có cấu trúc lặp th ng đ ợc sử dụng khi ch ơng trình phải thực hiện công việc lặp đi lặp lại nhi u lần.

III.1. L nh lặp có số l n xác định tr ớc

Lệnh lặp for cho phép ch ơng trình thực hiện công việc nhi u lần và v i s lần lặp đư biết tr c. Lệnh for có 2 dạng:

For ... to ... do : đếm lên,

và For ... downto ... do : đếm xu ng.

* Cú pháp đ m lên:

for <biến_đếm := tr _đầu> to <tr _cu i> do công_việc;

Page 156: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 150

Kết thúc

Đúng

Đúng

tăng biến đếm lên 1

Sai

Sai

* L u đồ:

Hình 12: L u đồ lệnh lặp for ... to ... do

Chú ý: Biến đếm, tr đầu, tr cu i là ki u dữ liệu đếm đ ợc (r i rạc) nh : s nguyên, Char, ki u liệt kê (Enum).

Ví d 7: Tính tổng s = 1 + 2 + 3 + 4 + 5.

var i, s : integer;

begin

s := 0; //Kh i tạo biến tổng

n:= 5;

for i:=1 to n do s := s + i;

ShowMessage( 'Bien dem i = '+IntToStr(i) + ', Tri cuoi n = '+IntToStr(n)

+ ', va tong s= ' + IntToStr(s) );

end;

Hình 13: Kết quả ch ơng trình tính tổng

*ụ nghĩa l u đồ:

Đầu tiên ki m tra tr đầu nhỏ h n hoặc bằng tr cu i không? Nếu:

+ Sai, kết thúc lệnh.

+ Đúng, thì thực hiện công việc và tăng biến đếm lên 1, sau đó ki m tra biến đếm có còn nhỏ h n hoặc bằng tr cu i không? Nếu đúng thì lặp lại việc thực hiện công việc cho đến khi biến đếm không còn nhỏ h n hoặc bằng tr cu i nữa thì thoát kh i vòng lặp và kết thúc lệnh.

biến đếm := tr đầu

biến đếm <= tr cu i

công việc

{lặp}

tr đầu <= tr cu i

Page 157: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 151

Ví d 8: Biến đếm là ki u liệt kê

var suit : (Hearts, Clubs, Diamonds, Spades);

begin // Lệnh For lặp 3 lần for suit := Hearts to Diamonds do ShowMessage( ' Suit = ' + IntToStr(Ord(suit)) ); end;

Ví d 9: Viết ch ơng trình nhập vào một s nguyên d ơng n, sau đó tính tổng S1 nh sau: S1 = 1 + 2 + 3 + 4 + ... + n

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 14: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untTongS1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

edt_n: TEdit;

btnXemKQ: TButton;

btnKThuc: TButton;

Page 158: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 152

Label2: TLabel;

memKQua: TMemo;

procedure btnXemKQClick(Sender: TObject);

procedure btnKThucClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnXemKQClick(Sender: TObject);

var n,i,s1:integer;

begin

memKQua.Lines.Clear;

n:=StrToInt(edt_n.Text);

╕1:=0; // khởi ╖ạ║ ⌡iế═ ╖ổ═g for i:=1 to n do s1:=s1+i;

memKQua.Lines.Add( ' Tong S1 = ' + IntToStr(S1));

end;

procedure TfrmMain.btnKThucClick(Sender: TObject);

begin

close;

end;

end.

- L u dự án vào th mục S:\ViduTongS1

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 15: Ch ơng trình tính tổng

Page 159: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 153

* Cú pháp đ m xuống: for <biến_đếm := tr _đầu> downto <tr _cu i> do công_việc;

Ý nghĩa: T ơng tự nh đếm lên. Lặp đếm xu ng có tr _đầu>= tr cu i, mỗi lần lặp biến đếm tự động giảm xu ng 1.

Ví d 10: Đếm giảm

var c : char;

begin

for c := 'E' downto 'A' do ShowMessage('c = '+c);

end;

Ví d 11: Nhập s nguyên d ơng n và một s thực a bất kỳ. Hưy tính giá tr c a bi u

th c X:

n

aaaX

n

aX

n

*...*2*1

*...**

!

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 16: Tên các đ i t ợng và giao diện ch ơng trình

Đoạn code của chương trình: unit untTinhX;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

Page 160: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 154

TfrmTinhX = class(TForm)

lbe_n: TLabeledEdit;

btnTinhX: TButton;

lbeKQ: TLabeledEdit;

btnNhapLai: TButton;

lbe_a: TLabeledEdit;

procedure btnTinhXClick(Sender: TObject);

procedure btnNhapLaiClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmTinhX: TfrmTinhX;

implementation

{$R *.dfm}

procedure TfrmTinhX.btnTinhXClick(Sender: TObject);

var mGiaiThua, mLuyThua, a, X : single;

i, n:Integer;

begin

if TryStrToInt(lbe_n.Text, n) and (n>=0) and TryStrToFloat(lbe_a.Text, a) then

begin

if n = 0 then X:=1 //a^0 =1 va 0! =1

else

begin

mGiaiThua := 1;

mLuyThua :=1;

for i:=1 to n do

begin

mGiaiThua := mGiaiThua * i;

mLuyThua := mLuyThua * a;

end;

X := mLuyThua/mGiaiThua;

end;

lbeKQ.Text :=' X = '+FormatFloat('#,#00.000',X);

end

else

ShowMessage('Ban phai nhap n la so nguyen duong.');

end;

Page 161: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 155

procedure TfrmTinhX.btnNhapLaiClick(Sender: TObject);

begin

lbe_n.Clear; lbe_a.Clear; lbeKQ.Clear;

lbe_n.SetFocus;

end;

end.

- L u dự án vào th mục: S:\ViduTinhX - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 17: Kết quả ch ơng trình

III.2. L nh lặp có số l n không xác định tr ớc

III.2.1. L nh lặp while .. do

Lệnh lặp while..do là vòng lặp ki m tra đi u kiện tr c và thực hiện công việc sau. Nó cho phép ch ơng trình thực hiện công việc nhi u lần và v i s lần lặp không đ ợc xác đ nh tr c.

* Cú pháp t ng quát:

* L u đồ:

Hình 18: L u đồ lệnh lặp while ... do

đi u_kiện

Kết thúc

đúng

công_việc

sai

{lặp}

while <đi u_kiện> do công_việc;

Page 162: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 156

* ụ nghĩa: Đầu tiên là ki m tra đi u kiện, nếu đi u kiện đúng thì thực hiện công việc, rồi quay

tr v đi u kiện đ ki m tra. Vòng lặp sẽ c tiếp tục cho đến khi đi u kiện không còn đúng nữa thì sẽ kết thúc lệnh.

Chú ý:

Đi u kiện trong cấu trúc lặp while … do là một bi u th c trả v giá tr kết quả có ki u Boolean (kết quả chỉ có 2 giá tr là Đúng (True) hoặc Sai (False)).

Ví d 12: Ch ơng trình sau hi n th kết quả bình ph ơng giá tr c a biến a (ban đầu a = 1) và tăng dần biến a cho đến khi kết quả bình ph ơng giá tr c a biến a l n hơn 100.

var num, bp: integer;

begin

num := 1;

bp := num * num; //bình ph ơng

while bp <= 100 do

begin // Hi n th kết quả bình ph ơng giá tr c a biến num

ShowMessage( IntToStr(num) + ' squared = ' + IntToStr(bp) );

inc(num); // Tăng giá tr c a biến num lên 1

bp := num * num;

end;

end.

Ví d 13: Viết ch ơng trình tìm s nguyên d ơng k l n nhất th a: 4k < m, v i m>1 là một s thực đ ợc nhập từ bàn phím.

H ớng d n:

- Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Page 163: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 157

Hình 19: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untVongLapWhile;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

edt_a: TEdit;

btnKetThuc: TButton;

btnXemKQua: TButton;

Label2: TLabel;

memKQua: TMemo;

procedure btnKetThucClick(Sender: TObject);

procedure btnXemKQuaClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnKetThucClick(Sender: TObject);

var k:integer;

s, m:extended;

begin

memKQua.Lines.Clear;

Page 164: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 158

m:=StrToFloat(edt_a.Text);

k:=0;

s:=1;

while s < m do

begin

s:=s*4;

k:=k+1;

end;

memKQua.Lines.Add('Gia tri k tim duoc la: '+ IntToStr(k-1));

memKQua.Lines.Add('Tong S= '+ FloatToStr(s/4));

end;

procedure TfrmMain.btnXemKQuaClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViduWhile

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 20: Tìm s d ơng k l n nhất

Ví d 14: Viết ch ơng trình nhập vào một s nguyên d ơng n bất kỳ. Hưy tính tổng các s hạng c a s n này?

Cụ th v i: n = 356789107 => S = 3 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 7

S = 46

n = 1257 => S = 1 + 2 + 5 + 7

S = 15

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Page 165: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 159

Hình 21: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit TachSoHang;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmViDu = class(TForm)

edtN: TEdit;

Label1: TLabel;

btnTinh: TButton;

edtKQ: TEdit;

Label3: TLabel;

procedure btnTinhClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmViDu: TfrmViDu;

implementation

{$R *.dfm}

procedure TfrmViDu.btnTinhClick(Sender: TObject);

var n, s: integer;

begin

if TryStrToInt(edtN.Text,n) and (n>=1) then

begin

s:=0;

while (n>0) do

begin

s:=s + n MOD 10;

n:=n DIV 10;

end;

Page 166: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 160

đúng

công_việc

sai

{lặp}

edtKQ.Text:=IntToStr(s);

end

else ShowMessage('Ban nhap du lieu KHONG thoa.');

end;

end.

- L u dự án vào th mục: S:\ViduTachSoHang - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 22: V i n = 356789107

Hình 23: V i n = 1257

III.2.2. L nh lặp Repeat ... until

Lệnh lặp repeat ... until là vòng lặp thực hiện công việc tr c, ki m tra đi u kiện sau. Nó cho phép ch ơng trình thực hiện công việc nhi u lần và v i s lần lặp không đ ợc xác đ nh tr c.

* Cú pháp:

repeat

công_việc;

until đi u_kiện;

Hình 24: L u đồ lệnh lặp repeat ... until

đi u_kiện

Kết thúc

Page 167: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 161

* Ý nghĩa: Lệnh lặp repeat ... until sẽ tiếp tục thực hiện công việc cho đến khi đi u kiện đ ợc

th a, nghĩa là khi đi u kiện có giá tr True thì sẽ thoát kh i vòng lặp.

Chú ý:

- Trong lệnh lặp repeat..until, nếu công việc có từ hai lệnh tr lên thì không nhất thiết phải dùng cặp từ khóa begin ... end; đ nhóm các lệnh đơn này lại.

- Trong lệnh lặp while ... do, do đi u kiện đ ợc ki m tra đầu tiên nên công việc có th không đ ợc thực hiện lần nào. Còn trong lệnh lặp repeat ... until thì công việc đ ợc thực hiện tr c và đi u kiện sau từ khóa until đ ợc ki m tra sau nên công việc đ ợc thực hiện ít nhất một lần.

Ví d 15: Ch ơng trình sau hi n th kết quả bình ph ơng giá tr c a biến num (ban đầu num = 1) và tăng dần biến num cho đến khi kết quả bình ph ơng giá tr c a biến num l n hơn 100.

var

num, bp : integer;

begin

num := 1;

bp := num * num;

repeat

ShowMessage( IntToStr(num) + ' squared = ' + IntToStr(bp) );

Inc(num);

bp := num * num;

until bp >100;

end;

Ví d 16: Viết ch ơng trình tìm s nguyên d ơng k l n nhất th a: 4k < a

Trong đó a>1 là một s thực đ ợc nhập từ bàn phím.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Page 168: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 162

Hình 25: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit VongLapRepeat;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmMain = class(TForm)

Label1: TLabel;

edt_a: TEdit;

btnXemKQ: TButton;

btnKetThuc: TButton;

Label2: TLabel;

memKQ: TMemo;

procedure btnXemKQClick(Sender: TObject);

procedure btnKetThucClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnXemKQClick(Sender: TObject);

var k:integer;

s, a:extended;

begin

memKQ.Lines.Clear;

a:=StrToFloat(edt_a.Text);

Page 169: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 6: Các lệnh có cấu trúc

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 163

k:=0; s:=1;

repeat

s:=s*4;

k:=k+1;

until s >= a;

memKQ.Lines.Add('Gia tri k tim duoc la: ' + IntToStr(k-1));

memKQ.Lines.Add('Tong S= ' + FloatToStr(s/4));

end;

Procedure TfrmMain.btnKetThucClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViduRepeat

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 26: Chạy ch ơng trình tìm k l n nhất

Page 170: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 164

CH NG 7: CH NG TRÌNH CON

I. Khái ni m

Khi lập trình, chúng ta th ng có những đoạn ch ơng trình hay phép tính lặp đi lặp lại nhi u lần cho một công việc/nhiệm vụ nào đó. Nếu mỗi lần lặp lại, ta phải viết những đoạn lệnh gi ng nhau này lặp đi lặp lại nhi u lần, thì ch ơng trình c a chúng ta tr nên dài dòng không cần thiết. Đ khắc phục đi u này, ta sử dụng ch c năng ch c năng sẵn có trong Delphi là ch ơng trình con hay còn g i là th ng trình con (Routines).

Ch ơng trình con th ng đ ợc viết d i dạng th tục (procedure) và hàm (function). Bên trong thân mỗi ch ơng trình con đ u ch a một dưy các câu lệnh đ làm nhiệm vụ cho ch ơng trình con đó. Nh vậy, sau khi đư xây dựng xong ch ơng trình con thì khi bạn mu n thi hành công việc mà ch ơng trình con đó đảm nhận, bạn chỉ cần g i đến nó bất kỳ nơi nào, và s lần g i tùy ý từ bên trong ch ơng trình thông qua tên c a ch ơng trình con đó.

Đi m khác biệt nhất giữa hàm và th tục là: Hàm luôn luôn trả v duy nhất một giá tr khi nó thi hành xong, còn th tục thì không trả v giá tr nào cả. Nh vậy, hàm đ ợc xem nh là một phần c a một bi u th c còn th tục thì không.

Ví d 1: Trong Delphi, nếu ta sử dụng lệnh: ShowMessage(‘Day la mot thu tuc.’); thì bạn thấy câu lệnh này chỉ làm nhiệm vụ in

lên màn hình câu thông báo “Day la mot thu tuc.” mà không có giá tr nào trả v cả.

Và câu lệnh x := 10 + Sin(Pi/2); thì bạn biết Sin(Pi/2) chính là một hàm vì nó trả v giá tr là 1 và nh vậy, nó có th tham gia vào bi u th c cộng trên.

Bạn cũng cần chú ý phân biệt ch ơng trình con khác v i các th tục sự kiện mà bạn đư đ ợc h c các ch ơng tr c, nhi u nhất là ch ơng 5. Ch ơng trình con là ch ơng trình do bạn tự khai báo nó và tự viết các lệnh trong thân c a nó. Còn việc khai báo th tục sự kiện thì sẽ đ ợc Delphi tự động sinh ra t ơng ng v i một sự kiện cụ th mà bạn đư ch n cho l p/thành phần nào đó, còn các câu lệnh trong thân c a nó thì bạn m i cần viết mà thôi.

V trí đ đặt các ch ơng trình con là trong phần cài đặt c a unit, nghĩa là ngay sau từ khóa implementation c a unit.

Khi đ cập đến ch ơng trình con, bạn cần phải biết v các loại biến đ ợc sử dụng bên trong ch ng trình và bên trong ch ng trình con là khác nhau:

· Bi n toƠn c c (Global variable): Còn đ ợc g i là biến chung, là biến đ ợc khai báo đầu ch ơng trình c a unit form (form file), nó đ ợc sử dụng bên trong tập tin dự án (Project file) và cả bên trong ch ơng trình con c a unit file đó. Biến toàn cục sẽ tồn tại trong su t quá trình thực hiện ch ơng trình.

· Bi n c c bộ (Local variable): Còn đ ợc g i là biến riêng, là biến đ ợc khai báo đầu ch ơng trình con, và nó chỉ đ ợc sử dụng bên trong thân ch ơng trình con hoặc bên trong thân ch ơng trình con khác nằm bên trong nó (các ch ơng trình con lồng nhau). Biến cục bộ chỉ tồn tại khi ch ơng trình con đang hoạt động, nghĩa là biến cục bộ sẽ đ ợc cấp phát bộ nh khi ch ơng trình con đ ợc g i đ thi hành, và nó sẽ đ ợc giải phóng ngay sau khi ch ơng trình con kết thúc.

Page 171: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 165

· Tham số hình thức (Formal parameter) là biến đ ợc khai báo ngay sau tên ch ơng trình con, nó dùng đ nhận giá tr c a tham s thực truy n đến. Tham s hình th c cũng là một biến cục bộ, ta có th xem nó nh là các đ i s c a hàm Toán h c. Nó đ ợc sử dụng trong quá trình xơy d ng ch ơng trình con. Trong Delphi có nhi u loại tham s nh : tham s tr (Value parameter), tham s biến (Variable parameter), tham s hằng (Constant parameter), tham s xuất (Out parameter). Ý nghĩa và cách vận dụng các loại tham s này nh thế nào sẽ đ ợc trình bày kỹ phần “Truy n tham s ” mục sau.

· Tham số th c (Actual parameter) là tham s mà nó có th là biến toàn cục, bi u th c hoặc giá tr s và cũng có th là biến cục bộ khi sử dụng ch ơng trình con lồng nhau. Nó đ ợc sử dụng khi bạn mu n truy n giá tr c a tham s thực cho tham s hình th c t ơng ng c a ch ơng trình con khi ra lệnh l i g i ch ơng trình con.

Ví d 2: Trong Delphi đư xây dựng sẵn hàm sin(x). Còn khi sử dụng hàm, bạn phải cụ th là tính sin c a x là bao nhiêu, chẳng hạn x =/2. Trong Delphi ta có hàm sin(pi/2). Nh vậy, x là tham s hình th c, còn pi/2 là tham s thực nghĩa là giá tr thực sự mà bạn cần tính.

* Lời gọi ch ng trình con (th t c vƠ hƠm): Ð ch ơng trình con đ ợc thi hành, ta phải có l i g i đến ch ơng trình con, l i g i

ch ơng trình con thông qua tên ch ơng trình con và danh sách các tham s thực t ơng ng (nếu có). Các qui tắc c a l i g i ch ơng trình con:

· Trong thân ch ơng trình chính hoặc thân ch ơng trình con, ta chỉ có th g i t i các ch ơng trình con trực thuộc nó.

· Trong ch ơng trình con, ta có th g i các ch ơng trình con ngang cấp đư đ ợc thiết lập tr c đó.

II. Hàm

function Tên_hàm[(danh_sách_tham_s _hình_th c)]: ki u_trả_v ; [các_chỉ_dẫn;]

[Khai_báo_cục_bộ]

begin

// Các câu lệnh trong thân c a function.

end;

Trong đó:

- Tên_hàm đ ợc đặt tên theo đúng quy cách c a danh hiệu tự đặt trong Delphi.

- Ki u_tr _v là một ki u vô h ng, bi u diễn ki u c a giá tr trả v c a hàm.

- Các_chỉ_d n (directives) là các chỉ th v quy c g i hàm nh register, pascal, cdecl, stdcall, và safecall; hoặc chỉ th khai báo tr c forward; hoặc khai báo ngoài external,... Do sự gi i hạn c a c a giáo trình, nên phần này không đ ợc trình bày đây. Nếu các bạn nào mu n tìm hi u thêm, các bạn hưy truy cập vào trang web c a Delphi là http://delphi.about.com/ hoặc xem phần help c a bộ Delphi.

Page 172: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 166

- Một hàm có th có 1 hay nhi u tham s hình th c, khi có nhi u tham s hình th c cùng một ki u giá tr thì ta có th viết chúng cách nhau bằng dấu phẩy (,). Tr ng hợp các tham s hình th c khác ki u thì ta viết chúng cách nhau bằng dấu chấm phẩy (;).

Ví d 3: function Tinh_tong (x, y: integer; z:extended): extended;

- Đ tìm đ ợc giá tr kết quả c a hàm cần trả v , th ng cần phải thông qua nhi u b c trung gian đ đạt đến kết quả cu i cùng. Do vậy, chúng ta th ng sử dụng 1 biến cục bộ đ ch a kết quả trung gian này và đ ợc g i là bi n trung gian. Ki u c a biến trung gian này phải t ng thích hoặc chính xác v i ki u trả v c a hàm. Sau khi tính đ ợc kết quả này xong, bạn cần phải gán kết quả tính đ ợc trong biến trung gian này cho tên hàm hoặc bạn có th sử dụng biến đ ợc đ nh nghĩa sẵn trong Delphi là result đ nhận kết quả trả v c a hàm. Bạn chú ý rằng, ki u c a biến result luôn luôn t ơng thích v i kết quả trả v c a hàm.

L u Ủ: V trí đ viết các ch ơng trình con (hàm hoặc th tục) là sau từ khóa implementation và {$R *.dfm}

Ví d 4: Hàm tính xn đ ợc tính bằng cách sử dụng biến đ nh sẵn result

function So_mu(x: single; n: integer): single;

var

i: integer;

begin

result := 1.0;

i := n;

while i > 0 do

begin

if odd(i) then

result := result * x;

i := i div 2;

x := sqr(x);

end;

end;

- Khi khai báo ki u dữ liệu cho các tham s hình th c là ki u string mà có độ dài xác đ nh tr c hay ki u array trong th tục và hàm, ta phải sử dụng cách khai báo gián tiếp (thông qua từ khóa type) nh sau:

Ví d 5: function So_sanh(hten1, hten2: string[40]): boolean; //sai cú pháp.

procedure In_mang(a: array[1..10] of integer); //sai cú pháp.

Ta có th sửa lại nh trong ví dụ sau:

Page 173: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 167

Ví d 6: Sử dụng cách khai báo gián tiếp đ sửa

type

Str40 = string[40];

Arr10 = array[1..10] of integer;

function So_sanh(hten1, hten2: Str40): boolean; //đúng cú pháp.

procedure In_mang(a: Arr10); //đúng cú pháp.

Hoặc sử dụng mảng động đ khai báo nh sau:

procedure In_mang(a: array of integer); //đúng cú pháp.

- Khái ni m thêm cho ví d nƠy: Câu lệnh bắt lỗi lúc ch ơng trình đang chạy (run-time):

try

các câu lệnh;

except // có phát sinh lỗi

// Delphi thông báo lỗi, hoặc bạn có th đ a ra thông báo lỗi c a riêng mình.

on E: Exception do ErrorDialog(E.Message, E.HelpContext);

end;

Chú ý: Bạn ch n ch c năng Tools/Debugger Options/Language Exceptions và b ch n (clear) hộp ki m Stop on Delphi Exceptions đ Delphi bắt lỗi.

Hình 74: Hộp thoại Debugger Options

Page 174: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 168

Ví d 7: Viết ch ơng trình tính giai thừa bằng ch ơng trình con: - Tạo một dự án m i File/New/Application

- Thiết lập các thuộc tính c a form nh sau:

Thuộc tính Giá tr

Name frmGiaiThua

Caption Vi du ve ham – Function

Position poScreenCenter

B ng 1: Thiết lập thuộc tính cho Form

- Đặt các đ i t ợng lên form và thiết lập các thuộc tính nh sau:

Đối t ng Thuộc tính Giá trị

Lable Name lblKetqua

Caption Ket qua n!

Edit Name edt_Kq

Text Rỗng

Button 1 Name btnNhap

Caption &Nhap n

Button 2 Name btnKetThuc

Caption &Ket thuc

B ng 2: Thi t l p thuộc tính cho các đối t ng

- ví dụ này, giáo trình mu n trình bày v i bạn cách sử dụng bi n chung: Đ khai báo một biến chung có tên biến là num_str và ki u là string thì từ cửa sổ thiết kế form, bạn nhấn phím ch c năng F12 đ chuy n sang cửa sổ mư lệnh. Bạn chuy n con nháy lên phía đầu unit và ngay sau phần khai báo biến biến chung là:

var

frmGiaiThua: TfrmGiaiThua;

bạn thêm vào 1 biến chung num_str nh sau: num_str: string;

Hoặc bạn có th sử dụng cách đư đ ợc trình bày phần hộp ki m (TCheckbox) đ thêm biến num_str.

Sau khi hoàn thành, phần khai báo c a bạn sẽ nh sau: var

frmGiaiThua: TfrmGiaiThua;

num_str: string; //⌡iế═ ch╗═g

implementation

{$R *.dfm}

Page 175: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 169

- Ngay sau từ khóa implementation và {$R *.dfm} là ph n đ b n nh p các ch ng trình con, bạn nhập vào hàm Giai_thua nh sau:

function Gi⌠i_╖h╗⌠(═:i═╖ege╔):e╚╖e═ded; //═ l╩ ╖h⌠m ╕ố h▓═h ╖hức var i: i═╖ege╔; k╓╖g: e╚╖e═ded; // ⌡iế═ ╔i▐═g begin

kqtg := 1; //khởi ╖ạ║ ⌡iế═ ╖╔╗═g gi⌠═ if n <= 0 then Giai_thua := 1

else

begin

for i := 1 to n do k╓╖g := k╓╖g * i ; //kế╖ ╓╗ả ╖╔╗═g gi⌠═ Giai_thua := kqtg; //g╨═ gi╨ ╖╔ị củ⌠ k╓╖g ch║ ╖▐═ h╩m

end ;

end;

- Tiếp theo, bạn lần l ợt nhập vào các câu lệnh cho các th tục sự kiện.

- Ch ơng trình hoàn chỉnh sẽ có đoạn mư lệnh nh sau:

unit untGiaithua;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmGiaiThua = class(TForm)

edt_Kq: TEdit;

lblKetqua: TLabel;

btnKetThuc: TButton;

btnNhap: TButton;

procedure btnKetThucClick(Sender: TObject);

procedure btnNhapClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmGiaiThua: TfrmGiaiThua;

num_str:string; //bien chung

implementation

{$R *.dfm}

Page 176: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 170

//--------Phần để bắt đầu viết các chương trình con (nếu có)-----

function Giai_thua(n: integer): extended;

var i:integer; kqtg:extended; //bien rieng

begin

kqtg := 1;

if n <= 0 then Giai_thua := 1

else

begin

for i := 1 to n do kqtg := kqtg * i ;

Giai_thua := kqtg;

end ;

end;

//---------các thủ tục sự kiện -----

procedure TfrmGiaiThua.btnKetThucClick(Sender: TObject);

begin

Close;

end;

procedure TfrmGiaiThua.btnNhapClick(Sender: TObject);

var num:integer;

begin

edt_Kq.Clear;

try

num_str:= InputBox('Nhap du lieu', 'Nhap n= ','15');

num := StrToInt( num_str);

if num>=0 then

begin

lblKetqua.Caption:= 'Ket qua ' + num_str + '! la:';

edt_Kq.Text:=FormatFloat('#,##0',Giai_thua(num));

end

else ShowMessage('Khong tinh giai thua cua so am.');

except

ShowMessage('Gia tri "' + num_str + '" khong hop le de tinh giai thua.');

end; // end try

end;

end.

* Chú ý: Bạn có th thay câu lệnh try ... except ... end; bằng câu lệnh TryStrToInt nh các ví dụ đư trình bày phần trên.

Page 177: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 171

- L u dự án vào th mục S:\ViduGiaiThua

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 1: Kết quả tính n!

Nếu bạn nhập lầm giá tr là n= 2o, thì ch ơng trình sẽ bắt lỗi và thông báo cho bạn nh sau:

Hình 2: Lỗi nhập sai ki u dữ liệu

Hoặc bạn nhập vào giá tr là n= –7, thì ch ơng trình cũng sẽ thông báo cho bạn biết:

Hình 3: Lỗi nhập sai giá tr âm

Từ ví dụ trên, bạn thấy biến num_string đư đ ợc khai báo làm biến chung, vậy theo bạn có th khai báo nó làm biến riêng trong th tục sự kiện procedure TfrmMain.btnNhapClick(Sender: TObject); đ ợc không? Câu trả l i là đ ợc. Tùy theo yêu cầu/ý nghĩa c a ch ơng trình mà bạn quyết đ nh sử dụng cách khai báo là chung hay riêng cho hợp lý.

Page 178: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 172

III. Th t c

Procedure Tên_th _tục[(Danh_sách_tham_s _hình_th c)]; [Các_chỉ_dẫn;]

[Khai_báo_cục_bộ]

begin

// Các câu lệnh trong thân c a procedure.

end;

Các khái niệm nh tên th tục, tham s hình th c, các chỉ dẫn thì gi ng nh phần đư trình bày function.

Ví d 8: Viết ch ơng trình hi n th câu chào t i anh/ch bất kỳ bằng th tục, v i h tên đ ợc nhập từ bàn phím.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 4: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untLoiChao; //δời ch╩║

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmLoiChao = class(TForm)

btnNhap: TButton;

procedure btnNhapClick(Sender: TObject);

Page 179: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 173

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmLoiChao: TfrmLoiChao;

implementation

{$R *.dfm}

//--------- Phầ═ ╖hủ ╖ục ---------------- procedure Loi_chao(hten:string);

begin

ShowMessage('Hi! chao ban '+hten+'. Chuc ban mot ngay vui ve!');

end;

//--------- Phầ═ ╖hủ ╖ục ╕ự kiệ═ -------- procedure TfrmLoiChao.btnNhapClick(Sender: TObject);

var hoten:string; //bien rieng

begin

hoten:=InputBox('Nhap du lieu','Ten ban ten la gi? ','');

Loi_chao(hoten); //loi goi thu tuc

hoten:=InputBox('Hop nhap','Hay nhap ten ma ban yeu thich:','');

Loi_chao(hoten); //loi goi thu tuc

end;

end.

- L u dự án vào th mục S:\ViduLoiChao

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Ban đầu, ch ơng trình sẽ đ ngh bạn nhập h tên c a bạn vào, nh “Vũ Phạm Minh Châu” chẳng hạn:

Hình 5: Ch ơng trình ví dụ v th tục- nhập tên lần một

Page 180: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 174

tiếp đến, ch ơng trình sẽ g i th tục Loi_chao(hoten) đ in ra câu chào nh sau:

Hình 6: L i chào cho lần g i th tục th nhất

Khi bạn Click vào nút lệnh OK, thì ch ơng trình sẽ cho bạn nhập thêm h tên m i, chẳng hạn nh “Thúy An”, tiếp đến ch ơng trình sẽ g i lại th tục Loi_chao(hoten) đ in ra l i chào tiếp theo:

Hình 7: Nhập tên lần hai

Hình 8: L i chào cho lần g i th tục th hai

Nh vậy, th tục Loi_chao(hoten) đư đ ợc g i 2 lần trong ch ơng trình và nh thế bạn thấy ch ơng trình sẽ sáng s a và rõ ràng hơn.

Page 181: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 175

IV. Truy n tham số

Trong Delphi có nhi u cách truy n tham s nh : tham s tr (value), tham s biến (variable), tham s hằng (constant), tham s xuất (out). ng v i mỗi loại truy n tham s , mà chúng có ý nghĩa khác nhau khi truy n từ tham s thực đến tham s hình th c.

IV.1. Định ki u vƠ không định ki u cho tham số hình thức

Ta có 2 khái niệm v đ nh ki u dữ liệu cho các tham s hình th c đó là: tham s đ nh ki u (typed parametter) và tham s không đ nh ki u (untyped parametter). Tham s đ nh ki u là tham s khi ta khai báo phải chỉ rõ ki u dữ liệu cho nó, còn tham s không đ nh ki u thì không cần phải chỉ ra tr c ki u c a nó và nh vậy tham s không đ nh ki u có th t ng thích v i bất kỳ ki u dữ liệu c a tham s thực khi truy n đến. V i cách khai báo tham s không đ nh ki u, nếu ta sử dụng giá tr c a các tham s này, thì tr c hết ta phải chuy n đổi ki u (typecast) cho chúng tr c.

Ví d 9: Viết th tục Cong2So v i 2 tham s a, b là không đ nh ki u:

- Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 9: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untKhongDinhKieu;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmVidu = class(TForm)

btnNhap: TButton;

procedure btnNhapClick(Sender: TObject);

private

Page 182: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 176

{ Private declarations }

public

{ Public declarations }

end;

var

frmVidu: TfrmVidu;

implementation

{$R *.dfm}

procedure Cong2So(const a,b; chon:char);

var kq:Extended;

begin

case chon of

'1': begin

kq:= Integer(a) + Extended(b); //chuyen kieu - casting

ShowMessage('Truong hop '+ chon+': Tong 2 so = '+ FloatToStr(kq));

end;

'2': begin

kq:= Extended(a) + Integer(b); //chuyen kieu - casting

ShowMessage('Truong hop '+ chon+': Tong 2 so = '+ FloatToStr(kq));

end;

end;

end;

procedure TfrmVidu.btnNhapClick(Sender: TObject);

var x1:integer; x2:extended;

begin

x1:= -5; x2:=130.5;

Cong2So(x1,x2,'1'); { Truy n x1 ki u integer cho tham s hình th c a, truy n x2 ki u extended cho tham s hình th c b. }

x1:=10;x2:=15.5;

Cong2So(x2,x1,'2'); { Truy n x2 ki u extended cho tham s hình th c a,

truy n x1 ki u integer cho tham s hình th c b. }

end;

end.

- L u dự án vào th mục S:\ViduKhongDinhKieu

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 183: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 177

Hình 10: K t qu ch ng trình.

Khi chạy ch ơng trình, ta có kết quả bằng 125.5 và 25.5. Nh vậy, từ 2 tr ng hợp trên ta nhận thấy: tham số a cũng nh tham số b đ u có th nh n c 2 ki u d li u Integer và extended.

IV.2. Truy n bằng tham trị (Value parameter)

- Cú pháp: Không có từ khóa nào đ ng tr c tham s hình th c.

- ụ nghĩa: Không làm thay đổi giá tr c a tham s thực khi giá tr c a tham tr thay đổi.

- Tham số th c: có th là một biến, một bi u th c, một hằng, hoặc một giá tr s bất kỳ mà có ki u t ơng thích v i ki u c a tham tr .

- L u Ủ: Bắt buộc sử dụng tham s hình th c đ nh ki u (typed)

Ví d 10: Ch ơng trình tính lập ph ơng bằng tham trị

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 11: Tên các đ i t ợng và giao diện ch ơng trình

Page 184: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 178

- Đoạn code c a ch ơng trình có sử dụng tham số trị nh sau: unit untThamTri;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmThamTri = class(TForm)

btnNhap: TButton;

Label1: TLabel;

procedure btnNhapClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmThamTri: TfrmThamTri;

implementation

{$R *.dfm}

procedure LapPhuong(a: integer); //a la tham tri.

begin

a := a*a*a; // tinh lap phuong

end;

procedure TfrmThamTri.btnNhapClick(Sender: TObject);

var x:integer;

begin

x := StrToInt(InputBox('Nhap du lieu', 'Nhap so x = ','2'));

LapPhuong(x); {tham so thuc x duoc truyen cho tham tri a}

ShowMessage('Lap phuong cua so vua nhap la ' +IntToStr(x));

end;

end.

- L u dự án vào th mục S:\ViduThamTri

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 185: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 179

Hình 12: K t qu tính l p ph ng c a 2

- Khi chạy ch ơng trình, chẳng hạn bạn nhập x = 2, bạn có đoán đ ợc kết quả c a ch ơng trình sau khi tính lập ph ơng c a 2 là bao nhiêu không?... x = 2 hay x = 8? Kết quả thật bất ng : lập ph ơng c a 2 vẫn bằng 2. Suy ra ch ơng trình đư cho kết quả sai. Vì th tục LapPhuong trên đư sử dụng cách truy n bằng tham tr , do vậy, mặc dù trong thân th tục giá tr c a tham s a đ ợc gán giá tr 8, nh ng x vẫn giữ nguyên giá tr c a nó là 2 mà không thay đổi theo giá tr c a a.

IV.3. Truy n bằng tham bi n (Variable parameter)

- Cú pháp: Có từ khóa Var đ ng tr c tham s hình th c.

- ụ nghĩa: Làm thay đổi giá tr c a tham s thực khi giá tr c a tham s hình th c thay đổi.

- Tham số th c: chỉ có th là bi n và có ki u t ơng thích v i ki u c a tham s hình th c.

- L u Ủ: có th sử dụng cách tham s đ nh ki u hoặc không đ nh ki u.

Ví d 11: Ch ơng trình tính lập ph ơng bằng tham bi n:

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 13: Tên các đ i t ợng và giao diện ch ơng trình

Page 186: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 180

- Đoạn code c a ch ơng trình có sử dụng tham biến var nh sau: unit untThamBien;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmThamBien = class(TForm)

btnNhap: TButton;

Label1: TLabel;

procedure btnNhapClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmThamBien: TfrmThamBien;

implementation

{$R *.dfm}

procedure LapPhuong(var a: integer); {a la tham bien}

begin

a := a*a*a; // tinh lap phuong

end;

procedure TfrmThamBien.btnNhapClick(Sender: TObject);

var x:integer; //bien rieng

begin

x := StrToInt(InputBox('Nhap du lieu', 'Nhap so x = ','2'));

LapPhuong(x); {tham so thuc x duoc truyen cho tham bien a}

ShowMessage('Lap phuong cua so vua nhap la ' +IntToStr(x)) ;

end;

end.

- L u dự án vào th mục S:\ViduThamBien

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 187: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 181

Hình 14: Kết quả ch ơng trình tính lập ph ơng x

- Khi chạy ch ơng trình, chẳng hạn bạn nhập x = 2, thì kết quả ch ơng trình trả v là x = 8. Suy ra ch ơng trình cho kết quả đúng. Do th tục LapPhuong trong ch ơng trình phía trên đư sử dụng cách truy n bằng tham biến, do vậy bên trong thân th tục LapPhuong, c a tham s a đ ợc gán giá tr 8, thì giá tr c a x cũng sẽ thay đổi theo a và nh vậy x = 8.

IV.4. Truy n bằng tham số hằng (Constant parameter)

- Cú pháp: Có từ khóa Const đ ng tr c tham s hình th c.

- ụ nghĩa: Gi ng nh tính chất c a tham tr , nh ng bạn không th thay đổi giá tr c a c a tham s hằng trong thân ch ơng trình con đ ợc.

- Tham số th c: có th là một biến, một bi u th c, một hằng, hoặc một giá tr s bất kỳ mà có ki u t ơng thích v i ki u c a tham s hình th c.

- L u Ủ: có th sử dụng cách tham s đ nh ki u hoặc không đ nh ki u.

Ví d 12: Tr ng hợp sai khi thay đổi giá tr c a tham s hằng a trong th tục LapPhuong:

procedure LapPhuong(Const a:integer); {a là một tham s hằng}

begin

a := a*a*a; // lỗi cú pháp

end;

Ví d 13: Xây dựng hàm so sánh chuỗi, nếu 2 chuỗi bằng nhau thì hàm trả v giá tr 0, chuỗi th nhất l n hơn chuỗi thi 2 thì hàm trả v 1, còn lại hàm trả v giá tr -1

H ớng d n: - Tạo dự án m i: File/New/Application

Page 188: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 182

- Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object TreeView, và thiết kế form nh hình sau:

Hình 15: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untThamSoHang;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmThamSoHang = class(TForm)

btnSoSanh: TButton;

Label1: TLabel;

edt_Chuoi1: TEdit;

edt_Chuoi2: TEdit;

Label2: TLabel;

Label3: TLabel;

procedure btnSoSanhClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmThamSoHang: TfrmThamSoHang;

implementation

{$R *.dfm}

function SoSanhChuoi(const chuoi1, chuoi2: string): shortint;

//chuoi1 va chuoi2 la 2 tham so hang.

begin

if chuoi1 = chuoi2 then result := 0 //bang nhau

Page 189: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 183

else

if chuoi1 > chuoi2 then result :=1 //chuoi1 lon hon chuoi 2

else result := -1; //chuoi1 nho hon chuoi 2

end;

procedure TfrmThamSoHang.btnSoSanhClick(Sender: TObject);

var kq: shortint;

begin

kq := SoSanhChuoi(edt_Chuoi1.Text, edt_Chuoi2.Text);

case kq of

-1: ShowMessage(edt_Chuoi1.Text +' < '+edt_Chuoi2.Text);

0: ShowMessage(edt_Chuoi1.Text +' = '+edt_Chuoi2.Text);

1: ShowMessage(edt_Chuoi1.Text +' > '+edt_Chuoi2.Text);

end;

end;

end.

- L u dự án vào th mục S:\ViduThamSoHang

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 16: Chạy ch ơng trình

Hình 17: Kết quả so sánh.

Chú ý: chuoi1 và chuoi2 không đ ợc thay đổi giá tr c a nó trong thân ch ơng trình con So_sanh_chuoi vì chúng là những tham s hằng.

Page 190: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 184

IV.5. Truy n bằng tham số xu t (Out parameter)

- Cú pháp: Có từ khóa Out đ ng tr c tham s hình th c.

- ụ nghĩa: Làm thay đổi giá tr c a tham s thực khi giá tr c a tham s xuất thay đổi. Tham s xu t này chỉ dùng trong tr ng hợp bạn không cần quan tâm đến giá tr đ u vƠo c a tham s thực tr c khi truy n đến nó mà chỉ quan tâm đến kết quả đ u ra.

- Tham số th c: chỉ có th là bi n và có ki u t ơng thích v i ki u c a tham s hình th c.

- L u Ủ: có th sử dụng cách tham s đ nh ki u hoặc không đ nh ki u.

Ví d 14: Ch ơng trình tính lập ph ơng bằng tham số xu t: H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 18: Tên các đ i t ợng và giao diện ch ơng trình

- Đoạn code c a ch ơng trình có sử dụng tham s out nh sau: unit untThamSoXuat;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmThamSoXuat = class(TForm)

btnNhap: TButton;

Label1: TLabel;

procedure btnNhapClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Page 191: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 185

var

frmThamSoXuat: TfrmThamSoXuat;

implementation

{$R *.dfm}

Procedure LapPhuong(a: integer; out kq:integer);

// a la tham tri, kq la tham so xuat

begin

kq := a*a*a; // tinh lap phuong

end;

procedure TfrmThamSoXuat.btnNhapClick(Sender: TObject);

var x, kqlp:integer;

begin

x := StrToInt(InputBox('Nhap du lieu', 'Nhap so x = ','2'));

LapPhuong(x,kqlp); {tham so thuc x duoc truyen cho tham tri a

va tham so thuc kqlp duoc truyen cho tham so xuat kq}

ShowMessage('Lap phuong cua '+IntToStr(x)+' la: ' + IntToStr(kqlp));

end;

end.

- L u dự án vào th mục S:\ViduThamSoXuat

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 19: Kết quả ch ơng trình

- Khi chạy ch ơng trình, thì biến kqlp sẽ đ ợc truy n đến cho tham s xuất kq. Vì khi kq thay đổi giá tr thì kqlp sẽ thay đổi theo. Do vậy, nếu bạn nhập x = 2, thì khi thực hiện th tục LapPhuong, tham s xuất kq = 8 và suy ra biến kqlp cũng bằng 8.

Ví d 15: Viết ch ơng trình nhập vào s nguyên d ơng n. Tính tổng S = [f(1)]2/g(1) + [f(2)]2/g(2) + … + [f(n)]2/g(n)

Page 192: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 186

Trong đó: f(k) = 20 + 21 + 22 + … + 2k

g(k) = 0! + 1! + 2! + … + k!

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 20: Tên các đ i t ợng và giao diện ch ơng trình

Đo n code c a ch ng trình nh sau: unit untTongS; //tên unit file

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmTinhTong = class(TForm)

edt_n: TEdit;

Label1: TLabel;

btnTinh: TButton;

edt_KQ: TEdit;

Label3: TLabel;

procedure btnTinhClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmTinhTong: TfrmTinhTong;

implementation

Page 193: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 187

{$R *.dfm}

function GT(n: integer): extended; //h╩m gi⌠i ╖hừ⌠ củ⌠ ═ var i:integer;

begin

result:=1;

for i:=1 to n do result:=result*i;

end;

function δT(⌠:e╚╖e═ded; ═: i═╖ege╔): e╚╖e═ded; //h╩m ⌠ lũ╛ ╖hừ⌠ ═ var i:integer;

begin

result:=1;

for i:=1 to n do result:=result*a;

end;

function g(k: integer): extended;

var i:integer;

begin

result:=0;

for i:=0 to k do result:=result+ GT(i);

end;

function f(k: integer): extended;

var i:integer;

begin

result:=0;

for i:=0 to k do result:=result+ LT(2,i);

end;

procedure TfrmTinhTong.btnTinhClick(Sender: TObject);

var i,n: integer;

S: extended;

begin

S := 0;

n := StrToInt(edt_n.Text);

for i := 1 to n do

S := S + LT(f(i),i)/g(i);

edt_Kq.Text :='S= ' + FloatToStr(S);

end;

end.

- L u dự án vào th mục: S:\TongS - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 194: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 188

Hình 21: Kết quả ch ơng trình

Ví d 16: Viết ch ơng trình tìm s nguyên d ơng n l n nhất sao cho tổng S th a bi u th c: S= 1! + x2 + 3! + x4 +…+ (n-1)! + xn <= V

V i x>0, V>0 bất kỳ đ ợc nhập từ bàn phím. In kết quả S và n tìm đ ợc.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 22: Tên các đ i t ợng và giao diện ch ơng trình

unit untTongCoDK;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmViDu = class(TForm)

edtX: TEdit;

Label1: TLabel;

edtV: TEdit;

Label2: TLabel;

btnTinh: TButton;

edtKQ: TEdit;

Page 195: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 189

Label3: TLabel;

procedure btnTinhClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmViDu: TfrmViDu;

implementation

{$R *.dfm}

function GT(n: integer): extended; // Hàm n!

var i:integer;

begin

result:=1;

for i:=1 to n do result:=result*i;

end;

function LT(a:extended; n: integer): extended; // Hàm an

var i:integer;

begin

result:=1;

for i:=1 to n do result:=result*a;

end;

procedure TfrmViDu.btnTinhClick(Sender: TObject);

var n:integer;

S, x, V: extended;

begin

if TryStrToFloat(edtX.Text,x) and (x>0) and

TryStrToFloat(edtV.Text,V) and (V>=1) then

begin

n:=0; S:=0;

while S <= V do

begin

inc(n);

if odd(n) then s := s + GT(n)

else s := s + LT(x,n);

end;

if odd(n) then S:= S-GT(n)

else S := S - LT(x,n);

n:= n-1;

edtKQ.Text :='Gia tri n= ' + IntToStr(n) + '; S = ' +

Page 196: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 190

FloatToStr(S);

end

else ShowMessage('Du lieu nhap khong thoa');

end;

end.

- L u dự án vào th mục: S:\TongCoDK - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 23: Kết quả ch ơng trình

V. Ch ng trình con đ quy

Một ch ơng trình con mà trong quá trình thiết lập, nó sẽ g i chính bản thân nó thì ch ơng trình con có tính đệ qui (recursion).

Đệ quy sử dụng cấu trúc dữ liệu ngăn xếp (Stack) có tính chất là vƠo tr ớc- ra sau trong quá trình đệ quy.

Ví d 17: Viết ch ơng trình tính giai thừa theo cách đệ quy.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 24: Tên các đ i t ợng và giao diện ch ơng trình

Page 197: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 191

- Đoạn code c a ch ơng trình tính giai thừa bằng ph ơng pháp đ quy nh sau: unit untGT_DeQuy;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmGT_DeQuy = class(TForm)

edt_n: TEdit;

lbl_n: TLabel;

edt_KQ: TEdit;

lblKQ: TLabel;

btnTinh: TButton;

btnKetThuc: TButton;

procedure btnTinhClick(Sender: TObject);

procedure btnKetThucClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmGT_DeQuy: TfrmGT_DeQuy;

implementation

{$R *.dfm}

function Giaithua(n: integer): extended;

begin

if n=0 then

Giaithua:=1 // truong hop neo

else

Giaithua:=n*Giaithua(n-1); // de quy

end;

procedure TfrmGT_DeQuy.btnTinhClick(Sender: TObject);

var num:integer;

begin

try

num := StrToInt(edt_n.Text);

if num>=0 then

begin

Page 198: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 192

lblKq.Caption:=edt_n.Text+'!=';

edt_KQ.Text:= FormatFloat('#,##0',Giaithua(num));

end

else

begin

ShowMessage('Khong tinh giai thua cua so am.');

edt_n.Clear;

edt_KQ.Clear;

edt_n.SetFocus;

end;

except

begin

ShowMessage('Gia tri ' + edt_n.Text + ' khong hop le.');

edt_n.Clear;

edt_Kq.Clear;

edt_n.SetFocus;

end;

end;

end;

procedure TfrmGT_DeQuy.btnKetThucClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViduDeQuy

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 25: Ch ơng trình đệ quy n!

- Sơ đồ minh h a tính đệ quy và tính kết quả c a hàm đệ quy Giaithua nh sau:

Page 199: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 7: Ch ơng trình con

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 193

Giả sử ta nhập n = 3, thì ch ơng trình sẽ g i hàm đệ quy Giaithua(3) và ta có sơ đồ nh sau:

Hình 26: Sơ đồ đệ quy c a hàm Giaithua(3)

Chú ý:

- u đi m c a thuật toán đệ quy là ngắn g n. Nó có khả năng đ nh nghĩa một tập hợp rất l n các đ i t ợng bằng một s các câu lệnh hữu hạn. Thuật toán đệ quy có vẻ thích hợp cho các bài toán mà tự thân cấu trúc dữ liệu c a nó đư đ ợc đ nh nghĩa theo l i đệ quy.

- Có một s thuật toán đệ quy sử dụng cho các bài toán đơn giản có th đ ợc thay thế bằng một thuật toán khác không tự g i chúng, sự thay thế đó đ ợc g i là Ệể đ quy.

- Trong một s bài toán ta có th giải theo 2 cách: thuật toán không đệ quy và thuật toán đệ quy. Thông th ng, cách giải theo thuật toán không đệ quy thì t t hơn so v i thuật toán đệ quy vì đệ quy đòi h i thêm bộ nh và th i gian. Khi đó các thanh ghi đ ợc sử dụng cho l u trữ và khi quay tr v phải khôi phục lại trạng thái cũ trong mỗi lần g i đến ch ơng trình con. M c độ ph c tạp có th gia tăng khi trong ch ơng trình con theo thuật toán đệ quy có ch a những ch ơng trình con khác. Vì vậy, khi dùng đệ quy ta cần thận tr ng, nhất là thuật toán này th ng không cho ta thấy rõ trực tiếp toàn bộ quá trình giải các b c. Nói chung, chỉ khi nào không th dùng thuật toán lặp ta m i nên sử dụng thuật toán đệ quy.

Giaithua(3)

3*Giaithua(2)

2*Giaithua(1)

1*Giaithua(0)

1

1

1*1=1

2*1=2

3*2 = 6

Page 200: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 194

CH NG 8: KI U LI T Kể, MI N CON, T P H P

I. Ki u vô h ớng li t kê (Enumerated scalar type)

I.1. Khái ni m

Ki u liệt kê là ki u đ nh nghĩa một tập hợp hữu hạn có th tự c a các phần tử đơn giản bằng cách liệt kê danh sách các giá tr nằm trong cặp dấu ngoặc đơn.

I.2. Cách khai báo: Có hai cách khai báo lƠ gián ti p vƠ tr c ti p

I.2.1. Khai báo gián ti p Sử dụng từ khóa type đ đ nh nghĩa ra ki u dữ liệu m i, rồi khai báo biến thông qua

ki u dữ liệu m i vừa đ nh nghĩa ra.

type Tên_ki u_liệt_kê = (danh_sách_giá_tr _liệt_kê); var

danh_sách_biến: tên_ki u_liệt_kê;

Ví d 1: Khai báo gián tiếp

type Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;

Colors = (Red, Yellow, Green, White, Blue, Black);

var Ngay : Days;

Mauve: Colors;

V i các khai báo trên chúng ta có đ nh nghĩa hai ki u liệt kê có tên là Days và Colors. Ki u liệt kê Days ch a 7 phần tử có giá tr đ ợc liệt kê nh trên. Sau đó chúng ta khai báo biến Ngay có ki u là ki u liệt kê Days.

I.2.2. Khai báo tr c ti p

Ki u dữ liệu c a biến đ ợc khai báo trực tiếp sau tên biến.

var

danh_sách_biến: (danh_sách_giá_tr _liệt_kê);

Ví d 2: Khai báo trực tiếp

var Ngay : (Sun, Mon, Tue, Wed, Thu, Fri, Sat);

Mauve : (Red, Yellow, Green, White, Blue, Black);

Ta có th gán cho biến các giá tr c a ki u t ơng ng:

Page 201: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 195

Ngay := Mon;

MauVe := Red;

Biến theo đ nh nghĩa c a ki u nào chỉ nhận giá tr c a ki u đó mà thôi.

Theo khai báo nh ví dụ trên, ta không th có MauVe := Mon;

Ki u vô h ng liệt kê là một ki u đếm đ ợc.

Theo đ nh nghĩa ki u vô h ng liệt kê, th tự danh sách giá tr liệt kê đ ợc ngầm đánh s tăng tuyến tính bắt đầu từ s 0 tr đi theo th tự từ trái sang phải. Nh vậy, ví dụ trên: Sun < Mon < Tue < Wed .... và Red < Yellow < Green ...

I.3. Một số hƠm chu n áp d ng cho ki u vô h ớng

* HƠm thứ t Ord (x) Hàm này trả v th tự c a giá tr x trong ki u vô h ng liệt kê.

Ví d 3: Theo ví dụ trên, ta có:

Ord (Sun) = 0 là đúng vì Sun có th tự là 0

Ord (Mon) = 1 là đúng vì Mon có th tự là 1

Ord (Green) = 3 là sai vì Green có th tự là 2

Ord (n) = n trong đó n là một giá tr ki u Longint

* Hàm Pred (x)

Hàm này trả v giá tr đ ng tr c x c a ki u vô h ng liệt kê.

Ví d 4: Theo ví dụ trên, ta có:

Pred (Mon) = Sun

Pred (Green) = Yellow

Pred (n) = n - 1

* Hàm Succ (x)

Hàm này cho giá tr đ ng sau x trong đ nh nghĩa ki u c a x.

Ví d 5: Theo ví dụ trên, ta có:

Succ (Mon) = Tue

Succ (Green) = White

Succ (n) = n + 1

* HƠm chuy n một số nguyên thƠnh một giá trị vô h ớng

Tên hàm này chính là tên ki u vô h ng mà ta đư khai báo tr c.

Page 202: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 196

Ví d 6: Theo ví dụ trên, ta có:

Days(2) = Tue

Colors(3) = White

Longint (n) = n

II. Ki u mi n con (Subrange types)

II.1. Khái ni m

Khi khai báo một s tr ng hợp, ví dụ tuổi th c a ng i nếu ta khai báo:

var

TuoiTho: Integer ; //Integer có mi n xác đ nh -2147483648..2147483647

thì sẽ t n ô nh vì Integer có kích th c 4. Làm nh vậy sẽ không cần thiết vì tuổi con ng i chỉ trong khoảng từ 0 đến 150.

Trong Delphi cho phép ta xác đ nh một biến lấy giá tr trong một khoảng nào đó đ ợc gi i hạn một hằng cận d i (Low) và một hằng cận trên (Hight). Hai giá tr này phải cùng một ki u vô h ng đếm đ ợc và hằng cận trên có giá tr l n hơn hằng cận d i. Khai báo nh vậy g i là khai báo ki u mi n con (Subrange type). Hay nói một cách khác ki u mi n con chính là một đ nh nghĩa thu hẹp c a các ki u có th tự khác. Trong lúc chạy ch ơng trình, ta có th ki m tra giá tr c a biến không đ ợc v ợt ra kh i mi n giá tr c a mi n con.

II.2. Cách khai báo

II.2.1. Khai báo gián ti p

type

tên_ki u_mi n_con = hằng_cận_d i .. hằng_cận_trên; var

danh _sách_biến: Tên_ki u_mi n_con;

Ví d 7: Khai báo gián tiếp

type

TuoiTho = 0 .. 150;

GioiTinh = 0..1; // nữ = 0, nam =1

var

tuoi: TuoiTho;

phai: GioiTinh;

Page 203: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 197

II.2.2. Khai báo tr c ti p

var

danh_sách_biến: hằng_cận_d i .. hằng_cận_trên;

Ví d 8: Khai báo trực tiếp

var

tuoi : 0 .. 150;

phai: 0..1; // nữ = 0, nam =1

III. Ki u t p h p (Set)

III.1. Khái ni m

Ki u tập hợp là một tập các giá tr cùng ki u đếm đ ợcc và đ ợc g i là các phần tử c a tập hợp. S phần tử t i đa trong một tập hợp là 256, bao gồm cả tập hợp rỗng. Khái niệm tập hợp trong Delphi t ơng tự nh khái niệm tập hợp trong Toán h c.

III.2. Cách khai báo

III.2.1. Khai báo gián ti p

type

tên_ki u_tập_hợp = Set of ki u_cơ_bản; var

danh_sách_biến : Tên_ki u_tập_hợp;

Ví d 9: Khai báo gián tiếp

type Day100 = 1..100; //Địnể nỂểĩa một dãy con đ dùnỂ ệàm Ệi u c b n

TapSoNguyen = Set of Day100;

var TapHop1, TapHop2: TapSoNguyen;

III.2.2. Khai báo tr c ti p

var

danh_sách_biến : Set of ki u_cơ_bản;

Ví d 10: Khai báo trực tiếp

var TapHop1, TapHop2 : Set of 0..250; // khai báo đúng

Page 204: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 198

Chu : Set of char; // khai báo đúng

So : Set of 0 .. 9; // khai báo đúng

X : Set of integer; // sai, vì v ợt quá gi i hạn t i đa 256 phần tử

Z : Set of real; // sai, do ki u dữ liệu không r i rạc/đếm đ ợc

III.3. Mô t t p h p

Một tập hợp đ ợc mô tả bằng cách liệt kê các phần tử c a tập hợp, chúng cách nhau bằng một dấu phẩy (,) và đ ợc đặt giữa hai dấu móc vuông [ ], các phần tử có th là hằng, biến hoặc bi u th c.

Ví d 11: Các ví dụ tập hợp trong Delphi

[] // tập hợp rỗng, không có các phần tử

[5 .. 15] // tập hợp các chữ s nguyên từ 5 đến 15

[1, 3, 5] // tập hợp 3 s 1, 3 và 5

[i, i + j*2, 4, 5] {tập hợp các biến nguyên gồm s 4, 5 và

các s nhận từ i, i +j*2 v i i, j là 2 biến byte}

III.4. Một số phép toán trên ki u t p h p

III.4.1. Phép gán

Ta có th gán giá tr các tập đư đ ợc mô tả vào các biến tập cùng ki u. Riêng tập hợp rỗng có th gán cho m i biến ki u tập hợp khác nhau.

Ví d 12: Các phép gán tập hợp

So:=[]; // tập rỗng

TapHop1 := [0,1,3,5,7,9];

TapHop2 := [0,2,4,6,8,9];

TapNguyenAm:=['A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u']; // tập các nguyên âm

III.4.2. Phép h p

Hợp c a 2 tập hợp A và B là một tập hợp ch a tất cả các phần tử c a tập A hoặc B hoặc cả A và B.

Ký hiệu c a phép hợp là dấu cộng (+). Phép hợp có tính giao hoán:

A + B = B+A

Ta có th mô tả phép hợp qua hình ảnh sau :

Hình 1: Hợp 2 tập

Page 205: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 199

Ví d 13: Hợp c a 2 tập

A := [0,1,3,5,7,9];

B := [0,2,4,6,8,9];

C := A + B; // C = [0,1,2,3,4,5,6,7,8,9]

III.4.3. Phép giao

Giao c a 2 tập hợp A và B là một tập ch a các phần tử c a cả A và cả B.

Ký hiệu A * B. Phép giao cũng có tính giao hoán, nghĩa là A * B = B * A

Minh h a nh sau:

Hình 2: Giao 2 tập

Ví d 14: Giao c a 2 tập.

V i tập hợp A = [0,1,3,5,7,9] và tập B= [0,2,4,6,8,9]: D := A * B ; // tập D = [0,9]

III.4.4. Phép hi u Hiệu c a 2 tập hợp A và B, ký hiệu là A - B, là một tập hợp ch a các phần tử chỉ

thuộc A mà không thuộc B.

Lưu ý : A - B thì khác B - A.

Ví d 15: Hiệu c a 2 tập:

A := [3 .. 7] ;

B := [1.. 6, 10, 15] ;

Thì: A - B = [7], còn B – A = [1, 2, 10, 15]

III.4.5. Phép thuộc IN Phép thuộc in cho phép thử (ki m tra) xem một giá tr nào đó thuộc v một tập hay

không? Phép thuộc in cho kết quả có ki u boolean. Nếu đúng thì nó sẽ cho kết quả là true, ng ợc lại là false.

Ví d 16: Phép toán thuộc

var

Kytu : char;

NguyenAm : Set of char;

Page 206: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 200

Sau đó ta gán:

Kytu := 'a';

NguyenAm:= ['A', 'E', 'I', 'U','O','a', 'e', 'i', 'u','o'];

Thì phép toán: Kytu in NguyenAm sẽ cho kết quả là true

III.4.6. Các phép so sánh =, <>, <=, và >=

Mu n so sánh hai tập hợp v i nhau thì chúng phải có cùng ki u cơ bản. Kết quả c a các phép so sánh là giá tr ki u Boolean, t c là True hoặc False.

Hai tập hợp A và B g i là bằng nhau (A = B) chỉ khi chúng có các phần tử gi ng v i nhau từng đôi một (không kế th tự sắp xếp các phần tử trong hai tập). Ng ợc lại c a phép so sánh bằng nhau (=) là phép so sánh khác nhau (<>). Nghĩa là, nếu A = B là True thì A <> B sẽ là False và ng ợc lại.

Phép so sánh nh hơn hoặc bằng (<=) c a A <= B sẽ cho kết quả là True nếu m i phần tử có trong A đ u có trong B. Ð nh nghĩa này cũng t ơng tự nh l n hơn hoặc bằng. V i A >= B thì m i phần tử c a B đ u có trong A, kết quả này True, ng ợc lại là False.

Chú ý: Trong Dephi không có phép so sánh nh hơn (<) và l n hơn (>). Ð ki m tra xem tập A có thực sự nằm trong tập B hay không (A nh hơn B), ta phải sử dụng thêm các phép logic nh sau:

if (a <> b) and (a <= b) then ShowMessage('a < b') ;

Ví d 17: Nhập các phần tử ki u nguyên thuộc mi n giá tr từ 0 đến 100 cho tập A và tập B. Nếu nhập phần tử trùng (đư tồn tại) thì không thêm vào tập hợp và thông báo cho biết đư có. Hưy cho biết kết quả c a các phép toán trên tập hợp.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

2121

21

];''..'[':2

];'[':1taptap

taptap

taptap

catap

atap

Page 207: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 201

Hình 3: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untTapHop;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmTapHop = class(TForm)

edtNew: TEdit;

Label1: TLabel;

btnTapHopA: TButton;

btnTapHopB: TButton;

Label4: TLabel;

lbxTapHopA: TListBox;

lbxTapHopB: TListBox;

btnXoa: TButton;

btnGiao: TButton;

edtKetQua: TEdit;

Label2: TLabel;

btnHop: TButton;

btnHieu: TButton;

btnSoSanh: TButton;

Label3: TLabel;

btnDong: TButton;

procedure btnTapHopAClick(Sender: TObject);

Page 208: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 202

procedure FormCreate(Sender: TObject);

procedure btnTapHopBClick(Sender: TObject);

procedure btnXoaClick(Sender: TObject);

procedure btnGiaoClick(Sender: TObject);

procedure btnHopClick(Sender: TObject);

procedure btnHieuClick(Sender: TObject);

procedure btnSoSanhClick(Sender: TObject);

procedure btnDongClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmTapHop: TfrmTapHop;

taphopA, taphopB, taphopC: Set of byte;

implementation

{$R *.dfm}

procedure TfrmTapHop.FormCreate(Sender: TObject);

begin

╖⌠╒h║╒A:=[]; //Khởi ╖ạ║, ╖ậ╒ ╔ỗ═g. taphopB:=[];

taphopC:=[];

end;

procedure TfrmTapHop.btnTapHopAClick(Sender: TObject);

var pt:integer;

begin

if TryStrToInt(edtNew.Text,pt) and (pt>=0) and (pt<=100) then

if (pt in taphopA) then

ShowMessage('Phan tu '+edtNew.Text+' da co trong tap hop A.')

else

begin

taphopA:=taphopA+[pt];

lbxTapHopA.Items.Add(IntToStr(pt));

end

else ShowMessage('Chuong trinh chi xet cac phan tu co gia tu 0 den 100.');

edtNew.SetFocus;

end;

Page 209: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 203

procedure TfrmTapHop.btnTapHopBClick(Sender: TObject);

var pt:integer;

begin

if TryStrToInt(edtNew.Text,pt) and (pt>=0) and (pt<=100) then

if (pt in taphopB) then

ShowMessage('Phan tu '+edtNew.Text+' da co trong tap hop B.')

else

begin

taphopB:=taphopB+[pt];

lbxTapHopB.Items.Add(IntToStr(pt));

end

else ShowMessage('Chuong trinh chi xet cac phan tu co gia tu 0 den 100.');

edtNew.SetFocus;

end;

procedure TfrmTapHop.btnXoaClick(Sender: TObject);

begin

taphopA:=[]; taphopB:=[]; taphopC:=[];

edtNew.Clear;

edtNew.SetFocus;

lbxTapHopA.Clear;

lbxTapHopB.Clear;

edtKetQua.Clear;

end;

procedure TfrmTapHop.btnGiaoClick(Sender: TObject);

var i:integer;

begin

edtKetQua.Clear;

taphopC :=taphopA*taphopB;

for i:=0 to 100 do //chi xet cac pt tap hop tu 0..100

if (i in taphopC) then

edtKetQua.text := edtKetQua.text+' '+ IntToStr(i);

end;

procedure TfrmTapHop.btnHopClick(Sender: TObject);

var i:integer;

begin

edtKetQua.Clear;

taphopC :=taphopA + taphopB;

for i:=0 to 100 do

if (i in taphopC) then

edtKetQua.text := edtKetQua.text+' '+ IntToStr(i);

end;

Page 210: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 204

procedure TfrmTapHop.btnHieuClick(Sender: TObject);

var i:integer;

begin

edtKetQua.Clear;

taphopC := taphopA - taphopB;

if taphopC = [] then

edtKetQua.text :='Tap hop rong.'

else

for i:=0 to 100 do

if (i in taphopC) then

edtKetQua.text := edtKetQua.text+' '+ IntToStr(i);

end;

procedure TfrmTapHop.btnSoSanhClick(Sender: TObject);

begin

if (taphopA <> taphopB) then

if (taphopA <= taphopB) then

edtKetQua.text :='Tap hop A < Tap hop B'

else

if (taphopA >= taphopB) then

edtKetQua.text :='Tap hop A > Tap hop B'

else

edtKetQua.text :='Tap hop A <> Tap hop B'

else

edtKetQua.text :='Tap hop A = Tap hop B';

end;

procedure TfrmTapHop.btnDongClick(Sender: TObject);

begin

Close;

end;

end.

- L u dự án vào th mục S:\ViduTapHop

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 211: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 205

+ Nhập các phần tử cho tập A và B:

Hình 4: Nhập các phần tử cho tập A và B

+ Nếu nhập phần tử trùng sẽ thông báo:

Hình 5: Thông báo nhập phần tử đư tồn tại

Page 212: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 206

+ Nếu nhập v ợt kh i mi n giá tr đang xét, thì thông báo:

Hình 6: Nhập v ợt kh i mi n giá tr

+ Hợp c a 2 tập:

Hình 7: Kết quả hợp c a 2 tập.

Page 213: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 8: Ki u Liệt kê, Mi n con, Tập hợp

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 207

+ Tính giao c a 2 tập:

Hình 8: Kết quả giao c a 2 tập.

+ Kết quả so sánh giữa 2 tập A và B.

Hình 9: Kết quả so sánh

Page 214: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 208

CH NG 9: KI U M NG

I. Khái ni m v m ng (Array-type data)

Mảng là một ki u dữ liệu gồm một dưy hữu hạn các phần tử có cùng ki u, g i là ki u cơ bản. Mảng đ ợc đ ợc tổ ch c theo một trật tự xác đ nh. S phần tử c a mảng đ ợc khai báo ngay từ khi đ nh nghĩa ra mảng (mảng tĩnh) hoặc có th khai báo và cấp phát một cách linh hoạt trong lúc ch ơng trình đang chạy (run-time) theo nhu cầu sử dụng (mảng động).

II. M ng tĩnh (Static array)

II.1. M ng một chi u (One-Dimensional array)

Mảng một chi u có th đ ợc hi u nh một danh sách các phần tử có cùng ki u. Mỗi phần tử c a mảng đ ợc xác đ nh và đ ợc truy nhập trực tiếp thông qua tên mảng cùng v i chỉ dẫn truy nhập đ ợc đ giữa hai ngoặc vuông [ ].

Ví dụ chúng ta có một danh sách có tên là DaySo có n phần tử (V i n là một hằng s đư xác đ nh tr c). Vậy List chính là một mảng 1 chi u. Các phần tử c a List mang các tên List[0], List[1], List[2], ..., List[n-1], và có th minh h a nh hình sau:

0 1 2 3 n-1

List:

List[0] List[1] List[2] List[3] ......... List[n-1]

Hình 1: Hình ảnh minh h a mảng một chi u.

II.1.1. Khai báo gián ti p:

type Ki u_mảng = array [tập_chỉ_s ] of ki u_phần_tử; var Danh_sách_biến: Ki u_mảng;

Chú ý: tập chỉ s phải là ki u có th tự (r i rạc, đếm đ ợc), chẳng hạn nh ki u: Ký tự, ki u mi n con, s nguyên…

Ví d 1: Khai báo gián tiếp

type DaySoNguyen = array [0 .. 99] of integer;

DayKyTu = array [1 .. 20] of char;

var a, b: DaySoNguyen;

c: DaySoNguyen; d: DayKyTu;

Page 215: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 209

ụ nghĩa: - DaySoNguyen là ki u mảng gồm 100 phần tử s nguyên có chỉ s từ 0 đến 99.

- Biến a, b và c là cùng ki u DaySoNguyen.

- DayKyTu là ki u mảng gồm 20 phần tử đánh s từ 1 .. 20 có ki u là các ký tự. Biến d có ki u là DayKyTu.

II.1.2. Khai báo tr c ti p

var Danh_sách_biến : array [tập_chỉ_s ] of ki u_phần_tử;

Ví d 2: Khai báo trực tiếp

var a, b : array [1 .. 100] of integer;

c : array [1 .. 100] of integer;

KyTu : array [1 .. 20 ] of char;

Chon : array [0 .. 9 ] of boolean;

- Biến a và b đ ợc g i là cùng ki u. Biến a và b là khác ki u v i biến c.

L u Ủ: nếu nh chúng ta khai báo tạo ra một mảng tĩnh nh ng không gán tr cho các phần tử c a mảng thì các phần tử mảng vẫn đ ợc cấp phát trong bộ nh , tuy nhiên chúng sẽ ch a các giá tr ngẫu nhiên, gi ng nh các biến ch a đ ợc kh i tạo giá tr .

II.1.3. Truy xu t các ph n t c a m ng Mỗi phần tử c a mảng đ ợc truy xuất thông qua Tên bi n m ng cùng v i chỉ s th

i c a mảng trong dấu ngoặc vuông []. Ví dụ tên biến mảng là A, khi viết A[7], ta hi u nó là phần tử có chỉ s th 7 c a mảng A.

Ví dụ, chúng ta có th thực hiện phép gán giá tr 10 cho phần tử th bảy c a A nh sau: A[7]:=10;

Ta có th gán hai biến mảng cùng ki u cho nhau.

Ví d 3: Khai báo hai mảng x, x nh sau: var x,y : array[0..10] of integer; // x, y cùng ki u

Ta có phép gán sau là hoàn toàn hợp lệ: y[0]:=50; x:=y;

Lúc này các giá tr c a x sẽ hoàn toàn gi ng nhau. Chúng ta cần chú ý là: nếu ta thay đổi các giá tr c a biến y thì di u đó không làm ảnh h ng đến x và ng ợc lại.

Tuy nhiên, nếu ta có khai báo:

var x, y : array[0..10] of integer;

z : array[0..10] of integer;

Thì lệnh gán: x:=z; là không hợp lệ vì Delphi xem biến x và z trong tr ng hợp này là khác ki u.

Page 216: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 210

Ví d 4: Viết ch ơng trình nhập vào một dưy s nguyên có n phần tử. Sắp xếp dưy s vừa nhập theo th tự tăng dần.

H ớng d n:

- Tạo một dự án m i File/New/Application

- Tên (name) c a các đ i t ợng trên form nh hình sau:

Hình 2: Tên các đ i t ợng

- Thiết kế giao diện form:

Hình 3: Thiết kế giao diện ch ơng trình

- Đo n code c a ch ng trình nh sau: unit untMang1C;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TfrmMang1C = class(TForm)

stgMang1C: TStringGrid;

edt_n: TEdit;

Label1: TLabel;

btnNhap: TButton;

btnSX: TButton;

btnKThuc: TButton;

Page 217: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 211

bntHienthi: TButton;

procedure btnNhapClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure bntHienthiClick(Sender: TObject);

procedure btnKThucClick(Sender: TObject);

procedure btnSXClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMang1C: TfrmMang1C;

n:integer; //so phan tu mang

a: array [0..100] of integer; // mang 1 chieu

implementation

{$R *.dfm}

procedure TfrmMang1C.btnNhapClick(Sender: TObject);

var i: byte;

begin

if (tryStrToInt(edt_n.Text,n)) and (n>0) then

begin

for i:=0 to n-1 do

a[i]:=StrToInt(InputBox('Hop nhap lieu','Phan tu a['+IntToStr(i)+']= ',''));

stgMang1C.ColCount :=n;

end

else ShowMessage('Ban nhap gia tri n KHONG hop le.');

end;

procedure TfrmMang1C.FormCreate(Sender: TObject);

begin

stgMang1C.FixedRows:=0;

stgMang1C.FixedCols:=0;

stgMang1C.RowCount:=1;

end;

procedure TfrmMang1C.bntHienthiClick(Sender: TObject);

var i: byte;

begin

for i:= 0 to n-1 do stgMang1C.Cells[i,0]:=IntToStr(a[i]);

end;

Page 218: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 212

procedure TfrmMang1C.btnKThucClick(Sender: TObject);

begin

Close;

end;

procedure TfrmMang1C.btnSXClick(Sender: TObject);

var i, j: byte;

temp: integer;

begin

for i:=0 to n-2 do

for j:=i+1 to n-1 do

if a[i]>a[j] then // h║╨═ ╘ị begin

temp:=a[i];

a[i]:=a[j];

a[j]:=temp;

end;

//goi lai TTSK de hien thi mang da SX

frmMang1C.bntHienthiClick(Sender);

end;

end.

- L u dự án vào th mục S:\ViduMang1C

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 4: Ch ơng trình bắt đầu chạy

Page 219: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 213

Hình 5: Nhập s phần tử n, và Click nút Nhap day so

Hình 6: Hi n th mảng vừa nhập

Hình 7: Sắp xếp tăng và hi n th mảng

II.2. M ng nhi u chi u (Multi-Dimensional array)

Trong một s bài toán thực tế, ng i ta cần sử dụng các mảng nhi u hơn một chi u, g i là mảng nhi u chi u. Mảng nhi u chi u còn g i là mảng c a mảng.

Chúng ta hưy xem xét một ví dụ sau:

Phòng Ðào tạo quản lý đi m c a sinh viên. Trong khoá 30 chẳng hạn, ng i ta tạo ra một mảng 2 chi u: ví dụ một chi u là MÃ S c a sinh viên, chi u còn lại là các MỌN

Page 220: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 214

H C (dạng ki u vô h ng liệt kê), ta có th hình dung dạng c a mảng ghi đi m (tên mảng là ghi_diem) nh sau:

Hình 8: Minh h a mảng hai chi u

V i ví dụ trên, mu n nhập đi m một sinh viên nào đó ta phải khai báo hai tham s là Mư s sinh viên và môn h c.

T ơng tự, cũng v i các khóa kế tiếp theo h c những môn nh vậy, ta sẽ tạo ra mảng nhi u chi u nh hình vẽ minh h a sau:

Hình 9: Minh h a mảng ba chi u

Trong tr ng hợp này, mu n biết đi m một sinh viên nào đó ta phải khai báo 3 tham s : Khoá h c, sinh viên và môn h c, chẳng hạn:

ghi_diem[K31,0001,AV] nhập đi m 10,...

II.2.1. Khai báo gián ti p

type Ki u_mảng = array [tập_chỉ_s _1, tập_chỉ_s _2, ..., tập_chỉ_s _n] of ki u_phần_tử; var Danh_sách_biến : Ki u_mảng;

MASV \ Môn Triet TinHoc Ly ... AnhVan

0001 7 8 5 ... 10

0002 6 10 6 ... 7

0003 8 9 3 ... 9 ........ ... ... ... ... ...

MÃ SV

Môn

MASV

K30 K

K32

SVK30\

Page 221: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 215

II.2.2. Khai báo tr c ti p

var Danh_sách_biến : array [tập_chỉ_s _1, ..., tập_chỉ_s _n] of ki u_phần_tử;

Trong giáo trình này chỉ đ cập chi tiết v mảng hai chi u.

II.3. M ng hai chi u

Mảng hai chi u là mảng nhi u chi u nh ng chỉ có hai tập chỉ s . Một hình ảnh quen thuộc c a mảng hai chi u đó chính là thành phần StringGrid mà giáo trình đư đ cập ch ơng 5.

II.3.1. Khai báo gián ti p

type Ki u_mảng = array [tập_chỉ_s _1, tập_chỉ_s _2] of ki u_phần_tử; var Danh_sách_biến : Ki u_mảng;

Hoặc:

type Ki u_mảng = array [tập_chỉ_s _1] of array [tập_chỉ_s _2] of ki u_phần_tử;

var Danh_sách_biến : Ki u_mảng;

Ví d 5: Khai báo gián tiếp mảng 2 chi u

type

MaTran = array [1 .. 5, 1 .. 10] of integer;

var

a : MaTran;

Lệnh trên khai báo một ki u mảng có tên là Matran, có ki u các phần tử là ki u s nguyên. Ðây là một mảng 2 chi u, chi u th nhất có các chỉ s từ 1 đến 5, chi u th hai có các chỉ s từ 1 đến 10, tổng cộng ta có (5 x 10) phần tử. Và ta có một biến a là biến có ki u Matran.

Ví dụ trên cũng có th đ ợc khai báo t ơng đ ơng v i:

type

Matran = array [1 .. 5] of array [1 .. 10] of integer ;

var

a : Matran;

Page 222: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 216

II.3.2. Khai báo tr c ti p

var Danh_sách_biến : array [tập_chỉ_s _1, tập_chỉ_s _2] of ki u_phần_tử;

Hoặc:

var Danh_sách_biến : array [tập_chỉ_s _1] of array[tập_chỉ_s _2] of ki u_phần_tử;

Ví d 6: Khai báo một biến a có 5 dòng và 10 cột ki u là integer nh sau: var

a : array [1 .. 5, 1 .. 10] of integer;

Hoặc ta cũng có th khai báo nh sau:

var

a : array [1 .. 5] of array [1 .. 10] of integer; // mảng c a mảng.

Ví d 7: Viết ch ơng trình nhập ngẫu nhiên 2 ma trận A và B có m dòng, n cột v i các phần tử là s nguyên trong khoảng [0..500]. Tính cộng hai ma trận C = A+B, và sắp xếp ma trận C theo th tự giảm dần theo t ng hƠng.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh trong cửa sổ Object

TreeView sau:

Hình 10: Tên các đ i t ợng

Page 223: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 217

- Thiết kế giao diện form:

Hình 11: Giao diện ch ơng trình

- Đoạn code c a ch ơng trình nh sau: unit untMang2C;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TfrmMang2C = class(TForm)

stgB: TStringGrid;

edt_m: TEdit;

Label1: TLabel;

btnNhap2MaTran: TButton;

btnSX: TButton;

btnKThuc: TButton;

btnTong: TButton;

Label2: TLabel;

stgA: TStringGrid;

edt_n: TEdit;

Label3: TLabel;

Label4: TLabel;

Page 224: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 218

stgC: TStringGrid;

Label5: TLabel;

stgSX: TStringGrid;

Label6: TLabel;

procedure btnNhap2MaTranClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure btnTongClick(Sender: TObject);

procedure btnKThucClick(Sender: TObject);

procedure btnSXClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMang2C: TfrmMang2C;

m, n:integer; //so hang m, so cot n

a, b, c: array [0..10,0..10] of integer; // Mang 2 chieu

implementation

{$R *.dfm}

procedure TfrmMang2C.btnNhap2MaTranClick(Sender: TObject);

var i, j: byte;

begin

randomize; //thu tuc tron so ngau nhien

if tryStrToInt(edt_m.Text,m) and (m>0)

and tryStrToInt(edt_n.Text,n) and (n>0) then

begin

for i:=0 to m-1 do //m hang

for j:=0 to n-1 do //n cot

begin

//-----Nhap vao mang a va hien thi vao StringGird A--

a[i,j]:=random(500); //ham tra ve 1 so ngau nhien

stgA.Cells[j,i] := IntToStr(a[i,j]);

//-----Nhap vao mang b va hien thi vao StringGird B--

b[i,j]:=random(500); //ma tran B

stgB.Cells[j,i] := IntToStr(b[i,j]);

end;

stgA.RowCount :=m; stgA.ColCount :=n;

stgB.RowCount :=m; stgB.ColCount :=n;

stgC.RowCount :=m; stgC.ColCount :=n;

stgSX.RowCount :=m; stgSX.ColCount :=n;

Page 225: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 219

btnTong.Enabled := true;

end

else ShowMessage('Ban nhap gia tri m hoac n KHONG hop le.');

end;

procedure TfrmMang2C.FormCreate(Sender: TObject);

begin

stgA.FixedRows:=0; stgA.FixedCols:=0; stgA.DefaultColWidth:=32;

stgB.FixedRows:=0; stgB.FixedCols:=0; stgB.DefaultColWidth:=32;

stgC.FixedRows:=0; stgC.FixedCols:=0; stgC.DefaultColWidth:=32;

stgSX.FixedRows:=0;stgSX.FixedCols:=0;stgSX.DefaultColWidth:=32;

btnTong.Enabled:=False;

btnSX.Enabled:=False;

end;

procedure TfrmMang2C.btnTongClick(Sender: TObject);

var i, j: byte;

begin

for i:= 0 to m-1 do

for j:= 0 to n-1 do

begin

c[i,j]:=a[i,j] + b[i,j];

stgC.Cells[j,i]:=IntToStr(c[i,j]);//hien thi vao StringGridC

end;

btnSX.Enabled := True;

end;

procedure TfrmMang2C.btnKThucClick(Sender: TObject);

begin

Close;

end;

procedure TfrmMang2C.btnSXClick(Sender: TObject);

var i, j, k: byte;

temp: integer;

begin

for i:=0 to m-1 do // SX theo tung hang i

for j:=0 to n-2 do

for k := j+1 to n-1 do

if c[i,j]<c[i,k] then //giam dan

begin

temp:=c[i,j];

c[i,j]:=c[i,k];

c[i,k]:=temp;

end;

Page 226: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 220

//hien thi mang tran C da SX vao StringGrid SX

for i:=0 to m-1 do

for j:=0 to n-1 do

stgSX.Cells[j,i] := IntToStr(c[i,j]);

end;

end.

- L u dự án vào th mục S:\ViduMang2C

- Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 12: Nhập ngẫu nhiên 2 ma trận 5 hàng 7 cột

Page 227: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 221

Hình 13: Tổng C = A + B

Hình 14: Sắp xếp mảng C giảm dần theo từng hàng.

Page 228: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 222

III. M ng động (Dynamic array)

Nh đư trình bày trên, mảng tĩnh là mảng s phần tử phải đ ợc khai báo tr c, vì vậy khi ta không sử dụng các phần tử c a mảng thì mảng vẫn đ ợc cấp phát và chiếm bộ nh . Tuy nhiên v i mảng động chúng ta có th khai báo và cấp phát mảng một cách linh động tùy theo nhu cầu sử dụng. Mảng động không chiếm bộ nh c đ nh, ta có th dùng th tục SetLength đ thay đổi kích th c mảng lúc thực thi.

III.1. M ng động một chi u

III.1.1. Khai báo gián ti p

Cú pháp khai báo mảng động một chi u:

type Ki u_mảng = array of ki u_phần_tử; var Danh_sách_biến : Ki u_mảng;

III.1.2. Khai báo tr c ti p

var Danh_sách_biến : array of ki u_phần_tử;

Đ truy xuất đến mỗi phần tử c a mảng, chúng ta cũng thực hiện t ơng tự nh truy xuất phần mảng tĩnh.

Ví d 8: Khai báo một mảng động có tên là DaySo ch a các phần tử s thực. var DaySo : array of extended;

III.1.3. C p phát vƠ gi i phóng vùng nhớ trong m ng động

Trong ví dụ trên, s phần tử c a mảng vẫn ch a đ ợc xác đ nh. Đ sử dụng mảng ta phải khai báo s phần tử mảng bằng th tục SetLength nh sau:

SetLength(DaySo,10);

Câu lệnh SetLength này sẽ cấp phát 10 phần tử trong bộ nh , có chỉ s từ 0..9 (Chú ý: mảng động luôn đ ợc cấp phát v i chỉ s bắt đầu bằng 0).

Đ giải phóng vùng nh đư cấp phát cho mảng, chúng ta chỉ cần gán tr nil cho biến mảng nh trong ví dụ sau:

DaySo:=nil; // giải phóng vùng nh cho mảng DaySo vừa đ ợc cấp phát trên.

Chú ý: Ta có th thực hiện phép gán hai biến cùng ki u mảng cho nhau. Ví dụ X, Y là hai biến cùng ki u mảng thì lệnh gán X:=Y là hợp lệ. Tuy nhiên lúc này nếu ta thay đổi các giá tr c a mảng X thì mảng Y cũng thay đổi theo vì thực chất X chỉ tham chiếu đến Y (đi u này khác v i mảng tĩnh).

Page 229: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 223

III.1.4. Một số hƠm vƠ th t c c b n đ c s d ng đ l y thông tin c a m ng động

- Th tục SetLength(var S; NewLength: integer);

SetLength cấp phát cho mảng S s phần tử là NewLength.

- Hàm Copy(S; Index, Count: integer): array;

Hàm copy trả v một mảng con có Count phần tử, v i phần tử đầu tiên có chỉ s là Index.Ví dụ: khai báo một mảng 100 phần tử.

var a: array[0..100] of integer;

a:= copy(a,0,20); // mảng A còn 20 phần tử

- Hàm Low(x); trả v chỉ s thấp nhất c a mảng x.

- Hàm High(x); trả v chỉ s cao nhất c a mảng x. Nếu mảng rỗng thì hàm sẽ trả v -1.

- Hàm Length(x): integer; trả v s phần tử c a mảng x.

Ví d 9: Viết ch ơng trình nhập vào một dưy các s thông qua hàm InputBox cho đến khi nhập bằng 0 thì ngừng. Trong quá trình nhập Cị ki m tra lỗi nhập liệu. Hi n th các s vừa nhập lên màn hình. Cho biết trung bình c a các s d ơng (l n hơn 0) và trung bình c a các s âm (nh hơn 0) vừa nhập.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 15: Tên các đ i t ợng và giao diện ch ơng trình

Page 230: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 224

- Đo n code c a ch ng trình: unit untMangDong;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmVidu = class(TForm)

btnNhap: TButton;

Label3: TLabel;

edtDaySo: TEdit;

Label1: TLabel;

btnTinhTrB: TButton;

Label2: TLabel;

memKQ: TMemo;

procedure btnNhapClick(Sender: TObject);

procedure btnTinhTrBClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmVidu: TfrmVidu;

a: array of single;

spt:integer; //So phan tu ma ban da nhap cho mang.

implementation

{$R *.dfm}

procedure TfrmVidu.btnNhapClick(Sender: TObject);

var i: integer; so:single; ds:string; kt:Boolean;

begin

i:=0;

SetLength(a,1);

ds := '';

repeat

kt := TryStrToFloat(InputBox('Hop nhap','Nhap phan tu thu ' + IntToStr(i)+ ' :',''),so);

if kt = false then

ShowMessage('Gia tri nhap KHONG phai la kieu so. Nhap lai!')

else

begin

SetLength(a,i+1);

Page 231: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 225

a[i] := so;

ds := ds + #32 + FloatToStr(so); {ghep cac so vua nhap thanh mot chuoi.}

inc(i);

end;

until (so = 0);

edtDaySo.Text := ds; //Hien thi day so vua nhap ra ListBox

spt := i;

end;

procedure TfrmVidu.btnTinhTrBClick(Sender: TObject);

var mTongAm, mTongDuong : single; i, m, n: integer;

begin

mTongAm := 0; mTongDuong := 0;

m := 0; n := 0;

for i := 0 to spt-1 do // spt: so phan tu cua mang a

begin

if a[i] <0 then

begin

mTongAm := mTongAm + a[i];

inc(m);

end;

if a[i] >0 then

begin

mTongDuong := mTongDuong + a[i];

inc(n);

end;

end;

memKq.Lines.Clear;

if m>0 then memKq.Lines.Add('* Trung binh cac so am = '+ FloatToStr(mTongAm/m))

else memKq.Lines.Add('* Trung binh cac so am = 0');

if n>0 then memKq.Lines.Add('* Trung binh cac so duong = '+ FloatToStr(mTongDuong/n))

else memKq.Lines.Add('* Trung binh cac so duong = 0');

end;

end.

- L u dự án vào th mục: S:\MangDong1C - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 232: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 226

Hình 16: Bắt đầu chạy

Hình 17: Tr ng hợp nhập dữ liệu sai, phải nhập lại.

Hình 18: Nhập phần tử th 0 là 15 và phần th 1 là -7.5

Hình 19: Nhập phần tử th 6 là 47 và gõ 0 đ k t thúc nhập liệu.

Page 233: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 227

Hình 20: Kết quả c a ch ơng trình

III.2. M ng động nhi u chi u

T ơng tự nh mảng tĩnh, mảng động nhi u chi u cũng chính là mảng c a mảng. Chúng ta có th dùng từ khóa array of đ khai báo mảng v i nhi u cấp.

III.2.1. Khai báo gián ti p

type Ki u_mảng = array of array of ... array of ki u_phần_tử; var

Danh_sách_biến : Ki u_mảng;

Ví d 10: Khai báo gián tiếp hai mảng động 2 chi u và 3 chi u: type

Mang2C = array of array of single; // mảng động 2 chi u Mang3C = array of array of array of integer; // mảng động 3 chi u

var a: Mang2C; b: Mang3C;

III.2.2. Khai tr c ti p

var Danh_sách_biến: array of array of .. array of ki u_phần_tử;

Ví d 11: Khai báo trực tiếp hai mảng động 2 chi u và 3 chi u: var

a: array of array of single;

b: array of array of array of integer;

Page 234: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 9: Ki u Mảng

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 228

Khi mu n sử dụng biến mảng động nhi u chi u thì ta cũng phải cấp phát vùng nh gi ng nh mảng động một chi u.

Ví d 12: Cấp phát vùng nh cho biến DaySo đư khai báo trên

SetLength(DaySo,10,5); // DaySo có kích th c [0..10, 0..5] Tuy nhiên, chúng ta có th cấp phát theo ki u nh sau:

SetLength(DaySo,5); // cấp phát 5 phần tử một chi u

SetLength(DaySo[2],5); // m rộng phần tử th ba thành mảng 2 chi u

Kết quả cấp phát c a ví dụ bên trên:

III.3. Hằng m ng

Đ khai báo hằng mảng, chúng ta chỉ cần đặt các giá tr hằng t ơng ng v i từng phần tử c a mảng trong dấu ngoặc đơn.

Ví d 13: Khai báo một s hằng mảng

Const So: array[0..9] of integer = (0,10,2,35,40,45,20,7,78,9); //hằng mảng s

Const Kyso: array[0..7] of char = ('0','1','2','3','4','5','6','7'); //hằng mảng ký s

Đ đ nh nghĩa hằng mảng nhi u chi u, ta sử dụng dấu ngoặc đơn và dấu phẩy đ phân cách các chi u c a mảng.

Ví d 14: Hằng mảng hai chi u

Type

Mang2C = array[0..1, 0..1] of Integer;

Const

MaTran: Mang2C = ((2, 3),(4, 5));

Ý nghĩa: v i khai báo trên ta đư tạo ra một mảng hai chi u có tên là MaTran có các giá tr nh sau:

MaTran[0,0] = 2 MaTran[0,1] = 3

MaTran[1,0] = 4 MaTran[1,1] = 5

Page 235: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 229

CH NG 10: KI U CHU I Kụ T

Chuỗi là ki u dữ liệu đại diện cho một dưy tuần tự các ký tự. Các ký tự trong chuỗi thì đ ợc đánh chỉ s bắt đầu là 1 và tiếp tục cho đến hết độ dài c a nó. Một chuỗi không ch a ký tự nào cả đ ợc g i là chuỗi rỗng (null/ empty string) và độ dài c a nó sẽ bằng không (zero). Một đặc tính hay c a chuỗi là độ dài thực c a nó sẽ tự động thay đổi khi chạy ch ơng trình và nh vậy sẽ thuận lợi cho ng i viết ch ơng trình không phải tính toán đ cập nhật lại sự thay đổi độ dài thực c a nó.

I. Các lo i chu i kỦ t trong Object Pascal

Trong Delphi, chuỗi đ ợc phân ra làm 3 loại: ShortString, AnsiString và WideString

I.1. Chu i ngắn (ShortString) Là ki u dữ liệu có khả năng ch a t i đa là 255 ký tự đ ợc đánh chỉ s từ 1 đến 255.

Riêng phần tử th 0 đ ch a độ dƠi th c c a chuỗi. V i ki u dữ liệu ngắn này, thì mỗi ký tự chiếm 1 byte bộ nh . Trong ngôn ngữ lập trình Delphi, ki u ShortString đ ợc dùng đ hỗ trợ ki u String trong ngôn ngữ lập trình Pascal, hay nói cách khác là giúp ng i lập trình có th duy trì mư nguồn c a ngôn ngữ Pascal trên phiên bản Delphi.

Đ khai báo biến thuộc ki u dữ liệu chuỗi ngắn này, bạn có th khai báo thông qua 2 cách nh sau:

I.1.1. S d ng tên chu n ShortString

V i cách khai báo dữ liệu theo cách này, bạn mu n khai báo chuỗi có độ dài t i đa là 255 ký tự và bạn không th gi i hạn lại độ dƠi khai báo c a nó bằng cách đặt một hằng chỉ độ dài trong cặp dấu móc vuông.

Ví d 1:

var diachi: ShortString; // đúng cú pháp

hoten: ShortString[30]; // lỗi cú pháp

I.1.2. S d ng t khóa string V i cách khai báo này, bạn phải sử dụng thêm chỉ th không sử dụng các loại chuỗi

l n (huge strings – sẽ đ ợc đ cập sau) là {$H-} hoặc b ch n mục Huge strings trong hộp thoại “Project Options” thông qua ch c năng Project/Options/Compiler nh sau:

Page 236: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 230

Hình 1: Tắt chỉ th Huge strings

Cách sử dụng này có th khắc phục đ ợc khuyết đi m c a ShortString là bạn có th th gi i hạn lại độ dƠi khai báo c a nó.

Ví d 2:

{$H-} // String chuy n thành ShortString

var diachi: string; // đúng cú pháp, độ dài khai báo là 255

hoten: string[30]; // đúng cú pháp, độ dài khai báo là 30

Trong ch ơng trình, bạn có th đặt lại độ dài thực cho nó bằng th tục SetLength mà bạn sẽ đ ợc trình bày phần d i.

I.2. Chu i dƠi 1 byte (AnsiString) Đây là loại dữ liệu chuỗi đ ợc sử dụng phổ biến nhất trong 3 loại, và mặc nhiên

(default) Delphi đư bật sẵn chỉ th {$H+} hay ch c năng “Huge strings” hộp thoại Project Options.

AnsiString có khả năng ch a t i khoảng 2,147,483,648 (~231) ký tự đ ợc đánh chỉ s bắt đầu từ 1. Mỗi ký tự c a AnsiString chiếm 1 byte bộ nh . Khác v i ShortString, phần tử th 0 không đ ợc sử dụng đ xác đ nh độ dài thực c a chuỗi. Độ dài thực này sẽ đ ợc xác đ nh b i hàm Length.

Đ khai báo biến thuộc ki u dữ liệu chuỗi AnsiString này, bạn có th khai báo thông qua 2 tên chuẩn nh sau:

Page 237: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 231

I.2.1. S d ng tên chu n AnsiString

V i cách khai báo dữ liệu theo cách này, bạn mu n khai báo chuỗi có độ dài c a nó t i đa và bạn không th gi i hạn lại độ dài khai báo c a nó bằng cách đặt một hằng chỉ độ dài trong cặp dấu móc vuông.

Ví d 3:

var DiaChi: AnsiString; // đúng cú pháp

HoTen: AnsiString[30]; // lỗi cú pháp

I.2.2. S d ng tên chu n String

V i cách khai báo này, bạn phải sử dụng thêm chỉ th có sử dụng các loại chuỗi l n (huge strings) là {$H+} hoặc ch n mục Huge strings trong hộp thoại “Project Options” thông qua ch c năng Project/Options/Compiler nh sau:

Hình 2: Bật chỉ th Huge strings

Ví d 4:

{$H+} // bật chỉ th sử dụng AnsiString

var GhiChu: String; // đúng cú pháp, đ ợc hi u là AnsiString

Cũng nh ki u ShortString, bạn có th đi u chỉnh lại độ dài thực cho nó bằng th tục SetLength trong thân ch ơng trình.

Một tính năng hữu dụng c a ki u AnsiString trong Delphi là nó đư đ ợc cài đặt sẵn ch c năng đ m-tham chi u (Reference-counting) và sao chép-ghi (Copy-on-write).

Page 238: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 232

I.3. Chu i dƠi 2 byte (WideString) Có tính chất t ơng tự nh AnsiString, nh ng đi m khác biệt là mỗi ký tự trong

WideString chiếm 2 byte bộ nh (ký tự Unicode), ít đ ợc sử dụng hơn, và không có tính chất đếm-tham chiếu (Reference-counted) và sao chép-ghi (Copy-on-write) nh ki u AnsiString.

WideString có khả năng ch a t i khoảng 1,073,741,824(~230) ký tự đ ợc đánh chỉ s bắt đầu từ 1. Cũng t ơng tự nh ki u AnsiString, độ dài thực c a chuỗi ki u WideString cũng có th đi u chỉnh lại đ ợc b i th tục SetLength và xác đ nh độ dài hàm Length.

Đ khai báo biến thuộc ki u dữ liệu chuỗi WideString, bạn có th khai tên chuẩn là WideString nh sau:

var m_Chuoi2byte: WideString;

II. Các thao tác trên chu i

Trong các hàm và th tục đ xử lý chuỗi ký tự, thì hầu hết các hàm đ ợc sử dụng cho cả 3 loại ShortString, AnsiString và WideString. Tuy nhiên, giáo trình sẽ tập trung ch yếu vào các thao tác trên ki u chuỗi dài 1 byte – AnsiString.

L u Ủ: D i đây là các đoạn ch ơng trình nh , mục đích nhằm minh hoạ rõ hơn các hàm, th tục đ ợc trình bày. Các bạn có th đặt các đoạn ch ơng trình này vào trong th tục sự kiện c a nút lệnh (TButton) đ thử nghiệm ch ơng trình.

II.1. Phép toán cộng chu i Ví d 5: Sử dụng toán tử cộng

var s:AnsiString;

begin

s := 'Le' + #32 + 'Loi';

ShowMessage('s = ' + s);

end;

Hình 3: Cộng 2 chuỗi

II.2. Phép toán so sánh

Các so sánh gồm có so sánh bằng, l n hơn, l n hơn hoặc bằng, khác, nh hơn, nh hơn hoặc bằng t ơng ng v i các toán tử so sánh =, >, >=, <>, <, <=

Khi so sánh 2 chuỗi ký tự thì các ký tự đ ợc so sánh theo từng cặp một theo chi u từ trái sang phải dựa vào giá tr trong bảng mư ASCII. Có 2 khả năng xảy ra khi so sánh: Nếu chuỗi th nhất là một phần c a chuỗi th hai k từ đầu chuỗi, thì chuỗi th hai sẽ l n hơn chuỗi th nhất nếu chi u dài c a chuỗi th hai l n hơn, nh ví dụ hình 4, hoặc bằng nếu chuỗi th hai có độ dài bằng chuỗi th nhất, nh ví dụ hình 5.

Page 239: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 233

Ghi chú: Chuỗi rỗng (null string, viết là '') là chuỗi không có ch a gì cả. Giá tr mư ASCII c a nó là zero, nh nhất trong các ký tự trong bảng mư ASCII.

Vì vậy: 'A' >'' và chr(32)> ''

Ví d 6: Ch ơng trình so sánh 2 chuỗi bất kỳ nhập từ bàn phím: var s1, s2: AnsiString;

begin s1:= InputBox('Nhap chuoi','s1= ','Que huong la chum khe ngot');

s2 := InputBox('Nhap chuoi','s2= ','Que huong neu ai khong nho');

if s1=s2 then ShowMessage(s1+ ' = ' + s2)

else if s1>s2 then ShowMessage(s1+ ' > ' + s2)

else ShowMessage(s1+ ' < ' + s2);

end; Khi chạy ch ơng trình:

+ Nếu nhập s1 = 'Vietnamese' , s2 = 'Vietnam' ta có kết quả nh sau:

Hình 4: Chuỗi s1 > s2

+ Nếu nhập s1 = 'Me hien yeu dau' , s2 = 'Me hien yeu dau' ta có kết quả nh sau:

Hình 5: Chuỗi s1 = S2

+ V i giá tr nhập nh giá tr mặc đ nh, ta có kết quả nh sau:

Hình 6: Chuỗi s1 < s2

Page 240: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 234

II.3. Các th t c vƠ hƠm chu n x lỦ chu i kỦ t

Trong Delphi, các bạn cần chú ý các th tục và hàm chuẩn trên từng loại chuỗi.

II.3.1. HƠm so sánh chu i Cú pháp: function CompareStr(const S1, S2: string): Integer;

ụ nghĩa: So sánh có phân biệt ký tự hoa th ng c a chuỗi S1 v i chuỗi S2. Kết quả trả v c a hàm bằng: không nếu S1 bằng S2, một giá tr nh hơn không nếu S1 < S2, và một giá tr l n hơn không nếu S1>S2.

Ví d 7: Ch ơng trình sử dụng hàm CompareStr

var s1,s2: String; m_ret: integer;

begin

s1 := InputBox('Nhap chuoi','s1= ','Long Me');

s2 := InputBox('Nhap chuoi','s2= ','LONG ME');

m_ret := CompareStr(s1,s2);

if m_ret = 0 then ShowMessage('Hai chuoi bang nhau')

else

if m_ret > 0 then ShowMessage(s1+ ' > ' + s2)

else ShowMessage(s1+ ' < ' + s2);

end;

Hình 7: Phân biệt hoa th ng

Cú pháp: function CompareText(const S1, S2: string): Integer;

ụ nghĩa: Nh hàm so sánh CompareStr trên, nh ng không phân biệt ký tự hoa th ng.

Hình 8: Không phân biệt hoa th ng

Page 241: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 235

II.3.2. Th t c xóa chu i Cú pháp: procedure Delete(var S: string; Index, Count:Integer);

ụ nghĩa: Xóa kh i chuỗi S một s ký tự là Count bắt đầu từ v trí Index tính từ trái sang.

Ví d 8: Minh h a th tục xóa chuỗi var s: string;

begin s := 'Troi xanh xanh';

ShowMessage('Chuoi ban dau: ' + s);

Delete(s,6,4);

ShowMessage('Chuoi sau khi xoa: ' + s);

end;

Khi chạy ch ơng trình, ta sẽ thấy trên màn hình:

Hình 9: Kết quả ví dụ xóa chuỗi

II.3.3. Th t c chèn chu i Cú pháp: procedure Insert(Source: string; var S: string; Index: Integer);

ụ nghĩa: Chèn chuỗi Source vào chuỗi S tại chỉ s Index.

Ví d 9: Minh h a th tục chèn chuỗi var s: string;

begin

s := 'Mat troi con';

ShowMessage('Chuoi ban dau: ' + s);

Insert(' be',s,9);

ShowMessage('Chuoi sau chen: ' + s);

end;

Hình 10: Kết quả ví dụ chèn chuỗi

Page 242: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 236

II.3.4. Th t c đ i số thƠnh chu i Cú pháp: procedure Str(X [: Width [: Decimals ]]; var S);

ụ nghĩa: Ðổi giá tr s S thành chuỗi rồi gán cho St, Giá tr Width:Decimals nếu có sẽ là s v trí và s chữ s thập phân c a S.

Ví d 10: Minh h a th tục đổi s thành chuỗi

var s: string; num:extended;

begin

num:=12345.679;

Str(num:5:2,s);

ShowMessage('Chuoi ky so s = ' + s);

end;

Kết quả trên màn hình:

Hình 11: Kết quả ví dụ đổi sang chuỗi

II.3.5. Th t c đ i chu i thƠnh số Cú pháp: procedure Val(S; var V; var Code: Integer);

ụ nghĩa: Ðổi chuỗi ký s S thành giá tr ki u s và gán giá tr này cho V. Code là s nguyên dùng đ phát hiện lỗi: nếu đổi đúng thì Code có giá tr = 0, nếu sai do S không bi u diễn đúng s nguyên hoặc s thực thì Code sẽ nhận giá tr bằng v trí c a ký tự sai trong chuỗi ký s S.

Ví d 11: Minh h a th tục đổi chuỗi thành s

var S: string; V: Real; Code: integer;

begin

S := InputBox('Nhap chuoi','Chuoi ky so hop le s: ','345.6789');

Val(S,V,Code);

ShowMessage('Voi chuoi S= ''' + S +''' thi gia tri bao loi Code = ' +

IntToStr(Code) + ', va gia tri so V = '+FloatToStr(V));

S := InputBox('Nhap chuoi','Chuoi ky so KHONG hop le s: ','345A.6789');

Page 243: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 237

Val(S,V,Code);

ShowMessage('Voi chuoi S= '''+ S +''' thi gia tri bao loi Code = '+ IntToStr(Code));

end;

Khi chạy v i các giá tr nhập là mặc đ nh, bạn sẽ có những kết quả sau:

Hình 12: Đổi đ ợc từ chuỗi sang s

Hình 13: Đổi không đ ợc từ chuỗi sang s

II.3.6. HƠm xác định độ dƠi c a chu i kỦ t Cú pháp: function Length(S): Integer;

ụ nghĩa: Cho kết quả là một s nguyên chỉ độ dài c a chuỗi ký tự St.

Ví dụ: Minh h a hàm Length

var S: String;

begin

S := 'Vet chan tron tren cat';

ShowMessage('Do dai cua chuoi ''' + s + ''' la: ' + IntToStr(Length(S)));

end;

Hình 14: Kết quả hàm Length

II.3.7. HƠm sao chép chu i Cú pháp: function Copy(S; Index, Count: Integer): string;

Page 244: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 238

ụ nghĩa: Kết quả trả v là một chuỗi con c a chuỗi S, bắt đầu tại chỉ s Index và chép Count ký tự.

Ví d 12: Sao chép chuỗi ‘Hát v i chú ve con’ từ v trí th 9 và lấy 6 ký tự

var S, Substr: String;

begin

S := 'Hat voi chu ve con';

Substr:=Copy(S,9,6);

ShowMessage('Chuoi con Substr vua duoc copy la: '+Substr);

end;

Hình 15: Kết quả hàm Copy

II.3.8. HƠm ghép nối chu i (Concatenate) Cú pháp: function Concat(s1 [, s2,..., sn]: string): string;

ụ nghĩa: Cho kết quả là một chuỗi m i đ ợc ghép lần l ợt b i các chuỗi s1, s2,...,sn. Hàm này gi ng nh phép cộng các chuỗi.

Ví d 13: Ghép n i chuỗi var s:AnsiString;

begin s := Concat('Ngon ngu lap trinh',Chr(32),'Delphi',#32,'7.0');

ShowMessage('Chuoi s la: ' + s);

end;

Hình 16: Kết quả hàm Concat

II.3.9. HƠm xác định chỉ số c a chu i Cú pháp: function Pos(Substr: string; S: string): Integer;

ụ nghĩa: Cho kết quả là v trí đầu tiên c a chuỗi Substr trong chuỗi S. Nếu không tìm thấy thì hàm sẽ trả v giá tr 0.

Page 245: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 239

Ví d 14: Tìm kiếm chuỗi ‘ve con’ và chuỗi ‘mèo con’ trong chuỗi ‘Hát v i chú ve con’:

var S, Substr: String;

m_Index: integer;

begin

Substr := 've con';

S := 'Hat voi chu ve con';

m_Index := Pos(Substr,S);

if m_Index=0 then

ShowMessage('Chuoi '''+ SubStr +''' khong tim thay trong chuoi '''+ S +'''')

else

ShowMessage('Chuoi '''+ SubStr +''' bat dau tai chi so '+ IntToStr(m_Index)+

' cua chuoi '''+ S +'''');

Substr := 'meo con';

m_Index := Pos(Substr,S);

if m_Index=0 then

ShowMessage('Chuoi '''+ SubStr +''' khong tim thay trong chuoi '''+ S +'''')

else

ShowMessage('Chuoi '''+ SubStr +''' bat dau tai chi so '+ IntToStr(m_Index) +

' cua chuoi '''+ S +'''');

end;

Khi chạy ch ơng trình ta có 2 kết quả hi n th lần l ợt nh sau:

Hình 17: Tìm thấy v trí, m_Index =13

Hình 18: Không tìm thấy, m_Index = 0

Page 246: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 240

* Sau đơy lƠ các ví d minh họa v ch ng chu i.

Ví d 15: Thiết kế form và viết code đ giải bài toán: Nhập vào một chuỗi ký tự bất kỳ từ bàn phím. Chuy n đổi chuỗi vừa nhập sang dạng tOGGLE cASE. Nhập vào giá tr n, hưy cắt n t cuối c a s, nếu n nhập không th a mưn so v i s, thông báo lỗi: n không th a.

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Hình 19: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình: unit untCatPhai; //Tên unit file

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmCatTu = class(TForm)

edtChuoi: TEdit;

Label1: TLabel;

btnCat: TButton;

edtN: TEdit;

Label2: TLabel;

edtKQ: TEdit;

Label3: TLabel;

btnDong: TButton;

btnChuyen: TButton;

Page 247: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 241

edtChuyen: TEdit;

procedure btnCatClick(Sender: TObject);

procedure btnDongClick(Sender: TObject);

procedure btnChuyenClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmCatTu: TfrmCatTu;

implementation

{$R *.dfm}

procedure TfrmCatTu.btnCatClick(Sender: TObject);

var i, j, n, dem, sotu :integer;

s: string;

begin

s := edtChuyen.Text;

sotu := 0;

for i:=1 to length(s) do

if s[i]=#32 then inc(sotu);

sotu := sotu + 1;

if TryStrToInt(edtN.Text,n) and (n>=1) and (n<=sotu) then

begin

dem:=0;

j:=length(s); //Bat dau tu ben phai...

while (dem < n) and (j>=1) do

begin

if s[j]=#32 then inc(dem);

dec(j); //...va tro nguoc ben trai

end;

edtKq.Text := Copy(s,j+2,length(s)-j);

end

else

edtKq.Text := 'Gia tri n nhap vao khong thoa bai toan.';

end;

procedure TfrmCatTu.btnDongClick(Sender: TObject);

begin

Close;

end;

Page 248: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 242

procedure TfrmCatTu.btnChuyenClick(Sender: TObject);

var s: string;

i: integer;

begin

s := edtChuoi.Text;

s := Trim(s);

while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);

s := UpperCase(s);

╕[1] := Ch╔(║╔d(╕[1])+ 32); //đổi ký ╖ự ╖hứ ═hấ╖ ╕⌠═g ╖hườ═g for i:=2 to length(s)-1 do

if s[i]=#32 then s[i+1] := Chr(ord(s[i+1])+ 32);

edtChuyen.Text := s;

end;

end.

- L u dự án vào th mục: S:\ViduCatPhai - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Hình 20: Kết quả ch ơng trình

Ví d 16: Thiết kế form và viết code đ giải bài toán: Nhập vào một chuỗi s. Cho biết chuỗi có bao nhiêu từ. Nhập vào một từ m i, xét xem từ m i này xuất hiện bao nhiêu lần trong chuỗi s?

H ớng d n: - Tạo dự án m i: File/New/Application - Đặt thuộc tính name cho các đ i t ợng c a ch ơng trình nh cửa sổ Object

TreeView, và thiết kế form nh hình sau:

Page 249: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 243

Hình 21: Tên các đ i t ợng và giao diện ch ơng trình

- Đo n code c a ch ng trình: unit untDemTu;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TfrmVidu = class(TForm)

edtChuoi: TEdit;

Label1: TLabel;

btnSLXH: TButton;

edtTuMoi: TEdit;

Label2: TLabel;

edtSLXH: TEdit;

Label3: TLabel;

btnSoTu: TButton;

edtSoTu: TEdit;

Label4: TLabel;

procedure btnSLXHClick(Sender: TObject);

procedure btnSoTuClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmVidu: TfrmVidu;

s: string; //bien chung.

implementation

Page 250: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u Chuỗi ký tự

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 244

{$R *.dfm}

procedure TfrmVidu.btnSLXHClick(Sender: TObject);

var slxh :integer;

tumoi, s2, tu :string;

begin

s2 := s; //Lay chuoi da cat bo khang trang thua.

s2 := s2 + #32; //them phan tu cam canh.

tumoi := trim(edtTuMoi.Text);

slxh := 0;

while s2 <>'' do //╕ <> ╔ỗ═g begin

tu := copy(s2,1, pos(#32,s2)-1);

if tumoi = tu then inc(slxh);

delete(s2,1, pos(#32,s2));

end;

edtSlxh.Text := IntToStr(slxh);

end;

procedure TfrmVidu.btnSoTuClick(Sender: TObject);

var i, sotu: integer;

begin

if edtChuoi.Text = '' then ShowMessage('Ban da nhap chuoi rong. Hay nhap lai!')

else

begin

s := trim(edtChuoi.Text;);

while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);

sotu := 0;

for i:=1 to length(s) do

if s[i]=#32 then inc(sotu);

edtSoTu.Text := IntToStr(sotu + 1);

end;

btnSLXH.Enabled := True;

end;

procedure TfrmVidu.FormCreate(Sender: TObject);

begin

btnSLXH.Enabled := False;

end;

end.

- L u dự án vào th mục: S:\ViduDemTu - Biên d ch và chạy ch ơng trình, ta có kết quả nh sau:

Page 251: Giao trinh Lap trinh can ban B – Delphi 7

Ch ơng 10: Ki u chuỗi ký tự

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 245

- Tr ng hợp từ m i có xuất hiện 2 lần trong chuỗi:

Hình 22: Từ “mẹ” có xuất hiện trong chuỗi nhập

- Tr ng hợp từ m i không xuất hiện lần nào trong chuỗi:

Hình 23: Từ “nhà” không xuất hiện trong chuỗi nhập

Page 252: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 246

PH L C

Phần này gi i thiệu một s thành phần thông dụng và ch ơng trình hi n th ảnh đơn giản – Simple view picture:

1. Thẻ System

ThƠnh ph n TTimer: Đồng hồ b m giờ. Bi u t ng:

Thuộc tính ụ nghĩa

Name Đ đặt tên đ i t ợng

Enable Nếu có giá tr true (mặc nhiên) thì tự động bật sự kiện bấm gi - OnTimer. Còn False thì không.

Interval Khoảng th i gian (milliseconds) đ kích hoạt sự kiện OnTimer

Sự kiện OnTimer: Sự kiện đ ợc kích hoạt khi hết khoảng th i gian xác đ nh trong Interval

2. Thẻ Additional

ThƠnh ph n TImage: Hi n th ảnh. Bi u t ợng:

Thuộc tính ụ nghĩa

Name Đ đặt tên đ i t ợng

Picture Xác đ nh hình đ ợc nạp (load) vào đ hi n th

Và một s sự kiện quen thuộc nh : OnClick, OnContextPopup, OnChange...

3. Thẻ Win 3.1

a. TFileListBox: Hộp danh sách liệt kê các tập tin. Bi u t ợng:

Thuộc tính ụ nghĩa

Name Đ đặt tên đ i t ợng

Mask Mặt nạ l c tập tin đ ợc hi n th trong nó nh : *.jpg;*.gif;*.bmp

Cursor Các ki u con tr mouse khi bạn tr đến đ i t ợng. Mặc nhiên là crDefault.

Page 253: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 247

Và một s sự kiện quen thuộc nh : OnClick, OnContextPopup, OnChange...

b. TFilterComboBox: Hộp liệt kê thả l c ki u tập tin. Bi u t ợng:

Thuộc tính ụ nghĩa

FileList Đ l c các ki u tập tin đ ợc hi n th trong Hộp danh sách liệt kê các tập tin. Bạn Click ch n tên đ i t ợng FileListBox (flbPics) đ gắn kết vào.

Cursor Các ki u con tr mouse khi bạn tr đến đ i t ợng. Mặc nhiên là crDefault.

Filter Các ki u tập tin đ l c. Bạn sử dụng các ký tự đại diện đ nhóm lại một s loại tập tin nh : *.doc, *.dpr, *.jpg,… Bạn Click vào bi u t ợng đ soạn thảo các ki u l c thông qua cửa sổ "Filter Editor".

Và một s sự kiện quen thuộc nh : OnClick, OnContextPopup, OnChange...

c. TDirectoryListBox: Hộp danh sách liệt kê các th mục. Bi u t ợng:

Thuộc tính ụ nghĩa

FileList Đ hi n th các tập tin trong Hộp danh sách liệt kê các tập tin. Bạn Click ch n tên đ i t ợng FileListBox (flbPics) đ gắn kết vào.

TextCase Hi n th tên ổ đĩa là chữ in hoa (tcUpperCase) hay th ng (tcLowerCase)

Cursor Các ki u con tr mouse khi bạn tr đến đ i t ợng. Mặc nhiên là crDefault.

DirLabel Đ gắn tên đ i t ợng nhưn dùng cho việc hi n thi đ ng dẫn (path) khi bạn ch n m (DClick) th mục làm việc .

Và một s sự kiện quen thuộc nh : OnClick, OnContextPopup, OnChange...

d. TDriveComboBox: Hộp liệt kê thả các ổ đĩa. Bi u t ợng:

Thuộc tính ụ nghĩa

DirList Đ hi n th các th mục vào trong hộp danh sách liệt kê các th mục. Bạn Click ch n tên đ i t ợng DirectoryListBox (dlbPics) đ gắn kết vào.

TextCase Hi n th tên ổ đĩa là chữ in hoa (tcUpperCase) hay th ng (tcLowerCase)

Cursor Các ki u con tr mouse khi bạn tr đến đ i t ợng. Mặc nhiên là crDefault.

Và một s sự kiện quen thuộc nh : OnClick, OnContextPopup, OnChange...

Phần này chỉ nhằm gi i thiệu các thành phần cơ bản trong Windows. Trong Delphi còn có các thành phần khác u việt hơn đó là các thành phần trên thẻ Dialogs, thẻ Simples,... Bạn có th dễ dàng viết lại ch ơng trình này thông qua các thành phần trong 2 thẻ này.

Page 254: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 248

Trong t ơng lai, Bộ môn Tin h c ng Dụng - Khoa Khoa H c Tự Nhiên có th sẽ viết thêm phần Delphi nâng cao đ giúp các bạn khai thác s c mạnh c a Delphi nh lập trình v Cơ s dữ liệu, lập trình Mạng, lập trình Web, Trò chơi,...

Ch ơng trình hi n th hình ảnh đơn giản - Simple view picture, đ hi n th các tập tin hình ảnh dạng .jpg, .wmf, .bmp. Ngoài ra ch ơng trình cũng tạo dòng chữ chạy (Marquee) trên thanh tiêu đ c a form theo h ng từ phải sang trái theo h ng nhìn (trái sang phải theo h ng màn hình), và có hi n th đồng hồ chạy.

Ch ơng trình hi n th hình ảnh đơn giản - Simple view picture:

frmViewPics : TForm

grbPics : TGroupBox

dcbPics : TDriveComboBox

dlbPics : TDirectoryListBox

flbPics : TFileListBox

fcbPics : TFilterComboBox

lblClock : TLabel

pnlPics : TPanel

imgView : TImage

tmrClock : TTimer

Tên c a các đ i t ợng

Page 255: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 249

Đo n l nh c a ch ng trình nh sau:

unit untViewPics;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg, ExtDlgs, FileCtrl;

type

TfrmViewPics = class(TForm)

tmrClock: TTimer;

pnlPics: TPanel;

imgView: TImage;

grbPics: TGroupBox;

dcbPics: TDriveComboBox;

fcbPics: TFilterComboBox;

dlbPics: TDirectoryListBox;

flbPics: TFileListBox;

lblClock: TLabel;

procedure tmrClockTimer(Sender: TObject);

procedure flbPicsClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

Page 256: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Trang Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT 250

{ Public declarations }

end;

var

frmViewPics: TfrmViewPics;

implementation

{$R *.dfm}

procedure TfrmViewPics.tmrClockTimer(Sender: TObject);

begin

l⌡lCl║ck.C⌠╒╖i║═ := 'Đồ═g hồ: ' + TimeT║S╖╔(Time); Caption:= Copy(Caption,2,length(Caption)-1)+Copy(Caption,1,1);

end;

procedure TfrmViewPics.flbPicsClick(Sender: TObject);

begin

try

imgView.Picture.LoadFromFile(flbPics.FileName);

except

on E: Exception do ShowMessage('Sorry! Tap tin anh nay bi SAI kieu hoac KHONG duoc ho tro!...')

end;

end;

procedure TfrmViewPics.FormCreate(Sender: TObject);

begin

dcbPics.DirList := dlbPics;

dlbPics.FileList := flbPics;

flbPics.Mask := '*.jpg;*.gif;*.bmp';

fcbPics.FileList := flbPics;

fcbPics.Filter := 'All (*.jpg, *.wmf, *.bmp)| *.jpg;*wmf;*.bmp|All files (*.*)|*.*';

lblClock.Font.Color := clTeal;

lblClock.Font.Name := 'VNarial'; {Delphi7 khong ho tro

font Unicode. Con Delphi8 thi ok...}

lblClock.Font.Size := 10;

lblClock.Font.Style := [fsBold];

imgView.Center := True;

imgView.Proportional := True;

imgView.Stretch := False;

frmViewPics.Caption:='Chuong trinh hien thi hinh anh don gian - Simple view picture... ';

frmViewPics.WindowState := wsMaximized;

pnlPics.Color := clGradientActiveCaption;

tmrClock.Enabled := True;

tmrClock.Interval := 150;

end;

end.

Page 257: Giao trinh Lap trinh can ban B – Delphi 7

Phụ lục và Ch ơng trình Simple view picture ----

Bộ môn Tin H c ng Dụng – Khoa CNTT & TT – Tr ng ĐHCT Trang 251

- L u vào trong th mục S:\Simple view picture

- Biên d ch và chạy ta đ ợc hình ảnh nh sau:

Ch ng trình Simple view picture.

Page 258: Giao trinh Lap trinh can ban B – Delphi 7

Tài liệu tham khảo & Bản quy n tác giả ----

Trang Bộ môn Tin H c ng Dụng - Khoa CNTT & TT – Tr ng ĐHCT 252

TẨI LI U THAM KH O

1. Borland IDD - JM, MM, HM, CC, JG (2005), Object Pascal Language Guide.

2. http://delphi.about.com

3. John Barrow, Linda Miller, Katherine Malan, Helene Gelderblom (2005), Introducing Delphi Programming: Theory through Practice (Paperback), Oxford University Press, USA.

4. John Ayres (2002), The Tomes of Delphi – Win32 Core API Windows 2000 Edition, Wordware Publishing, Inc.

5. Julian Bucknall (2001), The Tomes of Delphi – Algorithms and Data Structures, Wordware Publishing, Inc.

6. Lê Ph ơng Lan, Hoàng Đ c Hải (2000), Giáo trình lý thuyết và bài tập Borland Delphi, NXB Giáo Dục, Hà Nội.

7. Marco Cantu (2003), Mastering Delphi 7, SyBex.

B N QUY N TÁC GI

Tài liệu này đ ợc viết nhằm phục vụ cho việc h c tập c a sinh viên giai đoạn đầu làm quen và h c cách lập trình sự kiện nh thế nào thông qua ngôn ngữ lập trình Delphi, môi tr ng xây dựng ng dụng t c th i RAD. Tác giả sẽ upload tài liệu này lên internet trong th i gian gần thông qua file: “Giao trinh lap trinh can ban B – Delphi 7.pdf”.

Tài liệu đ ợc s d ng mi n phí cho cộng đồng, xin không đ ợc lấy đ bán hoặc thu phí khi download v i bất kỳ lý do gì. M i thông tin cần trao đổi, xin liên hệ tác giả thông qua đ a chỉ email: [email protected].

Cần thơ, 19 November 2010, © Vũ Duy Linh.