Tải bản đầy đủ (.docx) (76 trang)

tai lieu lap trinh delphipascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (9.55 MB, 76 trang )

<span class='text_page_counter'>(1)</span>Lời nói đầu Có khi nào bạn từng hỏi học Pascal sẽ làm được gì không? Một chương trình Pascal có thể chạy được trên nhiều loại hệ điều hành (WIN, IOS, ANDROID,…) không? Mình có thể tạo ra ứng dụng trên điện thoại cảm ứng bằng pascal không? Và … Tại sao lại không chứ!!! Pascal không chỉ để học cho biết đâu mà còn giúp các bạn có kiến thức cơ bản để tạo ra ứng dụng trên các thiết bị chạy hệ điều hành Windows, Android, IOS, OX S (Mac), thông qua ngôn ngữ lập trình Delphi (còn gọi là ngôn ngữ lập trình Pascal hướng đối tượng).. Tại sao mình không dùng kiến thức Pascal đã học để tạo ra ứng dụng cho điện thoại cảm ứng của mình!!!!!!!!!! Cố lên nghe bạn….. Chúng ta cùng nhau tìm hiểu về Delphi XE8 trong những phần dưới đây..

<span class='text_page_counter'>(2)</span> TÀI LIỆU CƠ BẢN VỀ. DELPHI XE8. Các nội dung khác mình đang viết tiếp, mong các bạn ủng hộ và góp ý chân thành về địa chỉ mail: Mời các bạn xem qua các nội dung trong mục lục ở trang kế sau. Chúc các bạn thành công `\ . . /’…cố lên nhe… (.) BIÊN SOẠN LƯƠNG QUỐC VINH.

<span class='text_page_counter'>(3)</span> Mục lục 0. tài liệu tham khảo. 1. Giới thiệu khái quát về Delphi XE8. 1.1 Màn hình làm việc 1.2 Thao tác bắt đầu tạo chương trình cho máy vi tính (PC, laptop có HĐH windows) hoặc điện thoại cảm ứng (iOS, android) 2. cấu trúc chương trình. 3.a các kiểu dữ liệu đơn giản. 3.b các kiểu dữ liệu phức tạp hơn. 4. các phép toán dùng cho các kiểu dữ liệu đơn giản. 5. các hàm-thủ tục dùng cho các kiểu dữ liệu đơn giản. 6. xuất-nhập dữ liệu thông quan bàn phím, chuột, màn hình. 7. các loại đối tượng thường dùng. 7.1 giới thiệu các thuộc tính và phương thức của từng loại. 7.2 ví dụ áp dụng 7.2.1 áp dụng đơn lẻ hoặc kết hợp ít loại đối tượng. 7.2.2 áp dụng kết hợp nhiều loại đối tượng. 8. Một số loại hiệu ứng. 8.1 giới thiệu vài loại hiệu ứng thường dùng. 8.2 áp dụng hiệu ứng. 9. Tạo đối tượng trong khi chương trình đang chạy (tạo đối tượng bằng câu lệnh) 10. Làm việc với máy in.

<span class='text_page_counter'>(4)</span> 0. TÀI LIỆU THAM KHẢO 1. Giáo trình lí thuyết và bài tập Borland Delphi-NXB GD 2000 2. Help offline của Delphi XE8 (chủ yếu là tài liệu này) 3. Sưu tầm một ít từ internet 4. Giáo trình lí thuyết và bài tập của ĐHCT.

<span class='text_page_counter'>(5)</span> 1. GIỚI THIỆU KHÁI QUÁT DELPHI XE8 1.1 Màn hình làm việc 1.1.1 Màn hình làm việc khi không trực tuyến:. H1 1.1.2 Màn hình làm việc khi trực tuyến: Chỉ khác với màn hình làm việc không trực tuyến tại phần giữa sẽ có nội dung các tệp đã làm việc gần đây, …. H2. 1.2 Thao tác bắt đầu tạo chương trình cho máy vi tính (PC, laptop có HĐH windows) hoặc điện thoại cảm ứng (iOS, android, OS X) B1. Nháy chuột trái vào file -> new -> Multi-Device Application-Delphi.

<span class='text_page_counter'>(6)</span> H3 B2. Nháy chuột vào Blank Application -> ok. H4 Sau đó sẽ có kết quả tương tự sau:. H5. Màn hình làm việc với ứng dụng. * với các bước làm trên ta sẽ bắt đầu tạo ứng dụng cho win. * tạo ứng dụng cho ios làm tương tự như với android. * nếu muốn tạo ứng dụng cho android thì làm thêm các thao tác sau: B3. Trên điện thoại thì ta làm các thao tác: - gắn dây cáp usb giữa máy tính và điện thoại. - kết nối usb chọn loại MTP. - vào cài đặt -> thông tin thiết bị (máy điện thoại) -> chọn nhiều lần liên tiếp vào ‘số hiệu bản tạo’, nếu máy tiếng anh thì xem hàng dưới: (settings -> about device -> build number, nháy liên tục nhiều lần vào build number, có thể là chữ khác tùy vào nhà sản xuất) - trở ra cài đặt -> cài đặt cho người phát triển -> bật ‘on’ cho cài đặt cho người phát triển -> đánh dấu chọn cho chế độ usb debug, nếu máy tiếng anh thì xem hàng dưới:.

<span class='text_page_counter'>(7)</span> (trở ra settings -> developer options -> developer options chọn ‘on’ -> đánh dấu vào usb debugging). B4. Trên máy tính windows phải cài đặt driver hoặc chương trình hỗ trợ phù hợp tùy theo điện thoại của hảng nào. Vd: MoboMarket For Android, MoboRobo, samsung kies, ... (bản thân các chương trình này cũng có hướng dẫn kết nối đtdđ với máy tính) Tải moboMarket Các tính năng chính của Moborobo: (theo - Kết nối máy tính với điện thoại, máy tính bảng - Quản lý dữ liệu trên Android, iPhone, iPad - Chuyển danh bạ giữa các thiết bị - Tải các tiện ích, nhạc, ảnh, video về điện thoại - Gửi tin nhắn từ máy tính - Sao lưu và phục hồi dữ liệu B5. Mở delphi và chọn android theo hình dưới:. B6. Nếu kết nối thành công thì xuất hiện tên của điện thoại trong danh sách (hai máy avd có dấu x đỏ nghĩa là không kết nối được, sm-j100h kết nối tốt). Mời các bạn xem hình kết nối thành công ở dưới. Chúc các bạn kết nối thành công, cố gắn lên sẽ được mà…………. Lưu ý: -Tốc độ chạy chương trình phụ thuộc vào từng loại máy tính và loại ĐTDĐ -Nếu kết nối chưa thành công thì ta làm lại b3 vài lần và nháy chuột vào. ..

<span class='text_page_counter'>(8)</span> Kết nối bằng moboMarket for android, điện thoại phải cài thêm mobomarket cho android, hình minh họa sau khi đã kết nối với điện thoại:.

<span class='text_page_counter'>(9)</span> Kết nối bằng samsung kies3. 1.3 Màn hình làm việc với ứng dụng có các nội dung: - Thanh tiêu đề (title) - Thanh bảng chọn (menu) - Các thanh công cụ (toolbar). Một số thanh công cụ quan trọng: nháy chuột vào view -> toolbars –> đánh dấu vào các tên: component, standard, debug, platform device selection.. Thanh component: chứa các đối tượng có sẵn của delphi.. Lưu ý: ô search cho phép gõ tên đối tượng mà ta cần sử dụng, sẽ xuất hiện liền. ví dụ: cần tìm button (không cần gõ đủ chữ button).

<span class='text_page_counter'>(10)</span> Thanh standard: chứa các nút lệnh tạo tệp mới, mở tệp đã cũ, lưu tệp, lưu tất cả các tệp…. Thanh debug Chứa các nút lệnh: chạy chương trình (hai nút đầu), tạm dừng, dừng chương trình.. Thanh platform device selection: Chứa hai nút lệnh: thứ nhất là chọn loại hệ điều hành cho ứng dụng, thứ hai là chọn thiết bị đã kết nối thành công với delphi.. - Cấu trúc của biểu mẫu (form) Chế độ thiết kế. Chế độ viết lệnh. -Cho biết các đối tượng có trong form. -cho biết: thông báo lỗi, các lớp, các biến, các hằng, các thư viện đã khai -muốn đi nhanh đến đối tượng nào báo. thì ta nháy đôi vào tên của đối tượng -muốn đi nhanh đến nội dung nào thì đó. ta nháy đôi vào tên của nội dung đó. - Danh sách thuộc tính (properties), sự kiện (events) của từng đối tượng thuộc tính (properties) sự kiện (events).

<span class='text_page_counter'>(11)</span> - Vùng thiết kế biểu mẫu, viết câu lệnh (chuyển đổi bằng phím F12 hoặc nháy vào nút lệnh code, design ở phía dưới). Chế độ thiết kế. <->. Chế độ viết câu lệnh. Phím F12 Hoặc Nháy Code Design ở hàng cuối Lưu ý: có chữ modified nghĩa là bạn chưa lưu hoặc chưa lưu thêm nội dung mới - Vùng cho biết các tệp (file) có trong dự án (project). - Vùng để chọn các đối tượng (object) cho vào biểu mẫu.. Lưu ý: ô Ví dụ: tìm label. giúp ta tìm nhanh đối tượng cần dùng..

<span class='text_page_counter'>(12)</span> 2. CẤU TRÚC CHƯƠNG TRÌNH 2.1 Cấu trúc chung của một ứng dụng: Minh họa: 1 dự án có: 1 tệp.dpr 1 tệp .dproj Một hoặc nhiều tệp .pas (1 pas <-> 1 thư viện) Nhiều tệp còn lại, và một hoặc vài thư mục (nếu có) Chi tiết: Chương trình (ứng dụng, phần mềm, dự án) được viết bằng Delphi thì được chia thành nhiều tệp (do đó khi lưu ta cần tạo một thư mục để chứa hết các tệp) :. Vd: -Tệp.dpr là tệp dự án chỉ có 1 tệp, dùng để chứa chương trình chính.. Vd: -Tệp.dproj chỉ có một tệp này, là tệp chứa các liên kết giữa các tệp có trong dự án để tạo ra tệp thực thi.. Vd: -Tệp.pas có thể có nhiều tệp này, chứa chi tiết các lệnh của từng unit, có hai chế độ làm việc với tệp này đó là: chế độ viết lệnh và chế độ thiết kế (đã có hình minh họa ở phần ‘vùng thiết kế, viết lệnh’). -Các loại tệp còn lại ta bỏ qua nhe (.!.).

<span class='text_page_counter'>(13)</span> 2.2 Cấu trúc unit. Phần Unit: cho biết tên của unit, tên này trùng với tên tập tin chứa unit. Nếu một dự án có nhiều unit thì tên mỗi unit phải khác nhau, không thể trùng tên cho dù các unit lưu ở các thư mục khác nhau. Gồm hai phần lớn phía dưới là: interface và implementation. 2.2.1 Viết ghi chú/chú thích trong delphi có hai loại: -Có vai trò quan trọng khi làm các chương trình có nhiều hàng lệnh. - Ghi chú chỉ có một hàng có dạng: // nội dung ghi chú - Ghi chú có nhiều hàng có dạng: {nội dung hàng thứ nhất nội dung hàng thứ 2 … nội dung hàng thứ n} - Lưu ý: phần màu đỏ là bắt buộc có, không thay đổi, phần màu đen thay đổi tùy theo nhu cầu. 2.2.2 Phần interface Gồm các phần nhỏ hơn:. Uses Khai báo các thư viện chứa các câu lệnh mà ta cần sử dụng trong phần implementation. Lưu ý: muốn biết đối tượng thuộc thư viện nào thì ta đặt chuột ngay đối tương đó trong Tool palette (ở chế độ thiết kế) và nhìn vào hàng unit trong cửa sổ tắt xuất hiện. Nội dung phần này viết theo dạng sau: Uses tên-thư-viện-1, tên-thư-viện-2,…, tên-thư-viện-n; - Lưu ý: phần màu đỏ là bắt buộc có, không thay đổi, phần màu đen thay đổi tùy theo nhu cầu. Trong khung trên:.

<span class='text_page_counter'>(14)</span> Tên-thư-viện-1, tên-thư-viện-2,… là tên của các thư viện có sẵn trong delphi hoặc của người viết chương trình đã tạo, tên mỗi thư viện có thể xuống hàng để dễ nhìn.. Type Khai báo các kiểu do người dùng định nghĩa hoặc do delphi tự sinh ra (vd:Tform1), có phạm vi sử dụng (mặc định/ngầm hiểu) là cả dự án, nghĩa là các unit khác vẫn dùng được nó đó nghe. Nội dung phần này viết theo dạng: Type. Tên-kiểu-dữ-liệu = kiểu-dữ-liệu ; - Lưu ý: phần màu đỏ là bắt buộc có, không thay đổi, phần màu đen thay đổi tùy theo nhu cầu. - Trong khung trên: Tên-kiểu-dữ-liệu là do người viết chương trình tự đặt theo đúng qui định đặt tên của delphi (xem qui tắc đặt tên ở phần 2.3 bên dưới). Kiểu-dữ-liệu là một trong những kiểu dữ liệu của delphi, hoặc của người dùng đã định nghĩa. Ví dụ: Yêu cầu: ta cần định nghĩa một kiểu dữ liệu có tên là Tnguyen để chứa các số nguyên trong phạm vi 0 đến 255. Phân tích: Ta cần xác định: tên-kiểu-dữ-liệu là Tnguyên, kiểu dữ liệu là kiểu có thể chứa các giá trị trong phạm vi 0 đến 255 tương đương với kiểu byte, nên ta có thể chọn kiểu-dữ-liệu là byte. Lúc này, ta viết như sau: Type Tnguyên = byte;. Var Khai báo các biến cần sử dụng, có phạm vi sử dụng (mặc định/ngầm hiểu) là cả dự án (toàn cục), nghĩa là các unit khác vẫn có thể dùng các tên biến này mà không cần khai báo lại, thuận lợi cho việc truyền dữ liệu giữa các unit đó mà. Ví dụ: giả sử chương trình trắc nghiệm có 2 unit là: InNoiDung và PhongTo. Chúng cần truyền nội dung qua lại với nhau, nên ta khai báo biến toàn cục có tên là NoiDung trong unit InNoiDung thì qua unit PhongTo chỉ cần khai báo tên unit innoidung trong phần uses, không cần khai báo biến này trong phần var. (khó tưởng tượng quá mà (~.~) !!!! … Nội dung phần này có dạng sau: Var. Tên-biến : tên-kiểu-dữ-liệu ; - Lưu ý: phần màu đỏ là bắt buộc có, không thay đổi, phần màu đen thay đổi tùy theo nhu cầu. Trong khung có:.

<span class='text_page_counter'>(15)</span> Tên biến: do người dùng tự đặt theo quy tắc đặt tên ở phần 2.3 (bên dưới). Tên kiểu dữ liệu: là tên kiểu dữ liệu có sẵn trong delphi, hoặc do người dùng định nghĩa trong phần type. Ví dụ: Yêu cầu: khai báo các biến trong bài toán “hãy tính số tuổi của một người nào đó”. Phân tích: để tính số tuổi thì ta cần biết hai thông tin là “năm sinh” và “năm hiện tại”, hai thông tin này đều là số nguyên và không có số âm. Do đó, ta khai báo hai biến số nguyên có tên là: NamSinh, NamHt; tên kiểu dữ liệu là word. Ta viết lệnh như sau: Var NamSinh, NamHt : word;. Chổ trống còn lại trên phần implementation Ta có thể khai báo hằng theo dạng: Const TênHằng = GiáTrị ; Vd: ta muốn khai báo hằng tên pi có giá trị là 3.14 thì ta viết như sau: Const pi = 3.14 ; Ta có thể khai báo tiêu đề của các chương trình con (thủ tục/hàm), còn gọi là phương thức (method) của người lập trình tự thêm hoặc của delphi thêm. Khi đó phạm vi sử dụng mặc định của các phương thức này là toàn cục. Ví dụ: các bạn xem hình, (các bạn thử sức làm theo hình dưới đi, cố lên các bạn) để ý phần có chú thích màu xanh lá nhe. Chế độ thiết kế (design):. Chế độ viết lệnh (code):.

<span class='text_page_counter'>(16)</span> 2.2.3 Phần implementation -Định nghĩa (viết nội dung chi tiết các lệnh) các chương trình con (thủ tục/hàm), còn gọi là phương thức (method) của người lập trình tự thêm hoặc của delphi thêm. -Thủ tục TForm1.create luôn được thực hiện đầu tiên, xong, sau đó tùy theo sự kiện (event) nào xảy ra mà chương trình con tương ứng sẽ được gọi. Ví dụ: các bạn chịu khó xem lại ví dụ kế trên. ~~( ...)~~. 2.3 Qui tắc đặt tên sau áp dụng cho: Biến, tên chương trình chính, chương trình con (hàm, thủ tục), hằng, tên kiểu do người lập trình đặt. Qui tắc: Kí tự đầu tiên Có thể là:. Các kí tự tiếp theo Có thể là:. Chữ cái hoa hoặc thường. Số. Dấu gạch nối _. Chữ cái hoa hoặc thường. Dấu gạch nối _ Tổng chiều dài của tên không quá 255 kí tự Ví dụ: đặt tên cho nút lệnh có chức năng thoát với tên là btnThoat. Giải thích btn là viết tắt của botton là nút lệnh thoat là từ gợi ý về chức năng của nó. Lưu ý: trong các dự án lớn, chương trình có nhiều người cùng viết thì cần có những quy tắc thống nhất khác nữa mà họ phải tuân theo.. Chắc các bạn đã mệt rồi phải không!!!!!!!!!!!!!!!!!!!!! Cố lên.

<span class='text_page_counter'>(17)</span> 2.4 Qui tắc truy cập đến thuộc tính, phương thức của đối tượng, của lớp Ta sử dụng dấu “.” để phân biệt các tên đó. Ví dụ 1: ta cần gán giá trị ‘chào bạn’ đến thuộc tính text của đối tượng nút lệnh tbtThoat, ta viết như sau: tbtThoat.text := ‘chào bạn’; => có dạng là: TênĐốiTượng.TênThuộcTính Ví dụ 2: ta cần truy cập đến phương thức close của đối tượng form có tên là form1, ta viết như sau: form1.close; => có dạng là: TênĐốiTượng.TênPhươngThức Lưu ý: trường hợp thuộc tính hoặc phương thức đó của đối tượng con nằm trong đối tượng cha, ta viết theo dạng: TênĐốiTượngCha.TênĐốiTượngCon.TênPhươngThức (hoặc thuộc tính) Ví dụ: chương trình của form2 muốn gán xâu ‘tạm biệt’ vào thuộc tính text của đối tượng label lblTB trong form1 thì ta viết Form1.lblTB.text:=’tạm biệt’;. 2.5 Vài đối tượng cơ bản nhất (rất quan trọng-không thể bỏ): Bạn hãy bắt đầu tạo ứng dụng chạy trên windows (xem thao tác ở phần 1.2) để tìm hiểu các nội dung sau: 2.5.1 Form (biểu mẫu): Hình dáng:. Dùng để Chứa (lắp ráp, lắp ghép) các đối tượng khác (mọi đối tượng khác) lên nó, kể cả form khác. Có sẵn khi ta bắt đầu tạo một ứng dụng mới.. 2.5.1.1 Form properties-vài thuộc tính cơ bản:. Caption: nội dung chữ của thuộc tính này sẽ xuất hiện ở tiêu đề form khi chạy chương trình (ấn phím F9).. Vd:. -> ấn phím F9 -> kết quả:. Fill: tô nền cho form, có thể là một trong các loại: hình ảnh (bitmap), màu (color), màu chuyển tiếp (gradient), quyết định loại nào là do giá trị trong kind..

<span class='text_page_counter'>(18)</span> Vd1:. -> F9 -> kq:. Vd2:. ->f9->kq:. Tìm hiểu thêm: Nếu ta chọn Thao tác làm hiệu ứng: thêm hiệu ứng chuyển tiếp các hình thì có kết quả:. ->. ->kết quả.. FormStyle: Normal: bình thường. Stay on top: cửa sổ form này luôn nằm ở trên. FullScreen True: cửa sổ to hết màn hình, False: cửa sổ có kích thước định sẵn như lúc viết lệnh.. Name: là tên của form, được dùng trong lập trình. Vd: Yêu cầu: ta muốn, khi chương trình đã làm xong một số việc, khi đó cửa sổ form có tên là fVinh sẽ to hết màn hình. Phân tích: thì ta gán giá trị true cho thuộc tính fullscreen của form, Viết lệnh là: fVinh.fullscreen := true ;. Height: chiều cao (chiều dài) của form, đơn vị là pixel.. Width: Chiều rộng (bề ngang) của form, đơn vị là pixel..

<span class='text_page_counter'>(19)</span> 2.5.1.2 Form method- phương thức cơ bản:. Close: Cú pháp: tên_form.close; Chức năng: đóng cửa sổ form. Các bạn xem thêm các phương thức khác như: hide, keyDown, keyUp, và. trong help offline. 2.5.2 Label (nhãn): -Dùng để thể hiện chữ trên form. -Cách gắn label vào form: B1.Tìm đối tượng ở thanh tool paletes B2.Nháy đôi vào Tlabel là xong. 2.5.2.1 Label-properties:. Name: Tên của đối tượng label, được delphi đặt sẵn là Label_số Ta nên đổi tên mới theo dạng: lblTênMới Trong đó: Với ‘tên mới’ là tên do người lập trình đặt, mang ý nghĩ là mục đích mà ta muốn label làm; còn ‘lnl’ là viết tắt của từ label.. Text: Chứa chữ, sẽ được thể hiện trong khung label. Khi chạy chương trình người dùng (là người sử dụng chương trình, không phải là người viết chương trình) không sửa được nội dung của chữ này.. Visible: Nhận một trong hai giá trị: true, false. Nếu là True thì khung label sẽ xuất hiện trên form để con người nhìn thấy. False thì khung label sẽ ẩn (con người không nhìn thấy).. Vd: Ta muốn có chữ chú thích với nội dung là ‘chào bạn’. Yêu cầu là có chữ với mục đích là chú thích gì đó, nên cần dùng đối tượng label, nên đặt tên label là lblChuThich. Nội dung chú thích là ‘chào bạn’, nên ta sẽ đặt thuộc tính text là ‘chào bạn’ 2.5.2.2 Label-Methods Ta chưa cần dùng đến các phương thức của label..

<span class='text_page_counter'>(20)</span> 2.5.3 Edit_quan trọng lắm Dùng để người dùng đưa giá trị nào đó vào chương trình. Cách gắn edit lên form:. B1. Tìm edit trong tool paletes B2. Nháy đôi vào tEdit. 2.5.3.1 Edit-Properties Name: Tên của đối tượng do người viết chương trình tự đặt. Nên đăt theo dạng: edtTenMoi. Text: Là giá trị (thuộc kiểu xâu_chữ) do người dùng nhập vào lúc chạy chương trình. Sau đó ta dùng giá trị này để viết tiếp chương trình. Visible: Nhận một trong hai giá trị: true, false. Nếu là True thì khung label sẽ xuất hiện trên form để con người nhìn thấy. False thì khung label sẽ ẩn (con người không nhìn thấy).. Ví dụ quan trọng: Viết chương trình để người dùng nhập vào họ tên của mình. Yêu cầu: nhập chữ từ bàn phím. Nên ta dùng đối tượng edit. Do đó đối tượng edit sẽ được đặt tên là: edtHoTen, và thuộc tính edtHoten.text sẽ chứa họ tên mà người dùng sẽ gõ vào. Bài làm: (mời bạn làm theo hướng dẫn dưới đây. Cố lên (~!~)’’’). Thiết kế chương trình:. Viết lệnh cho chương trình:. Kết quả khi chạy chương trình:.

<span class='text_page_counter'>(21)</span> Bạn sẽ hỏi Onchange và showmessage(…); là gì? !!!! mời bạn đọc tiếp. Onchange là sự kiện thay đổi nội dung trong ô edit, thuộc một trong nhiều sự kiện của đối tượng edit. Giải thích chi tiết: Khi ta thay đổi nội dung trong ô edit thì chương trình lớn (còn gọi là chương trình chính) sẽ thực hiện; chương trình nhỏ (còn gọi là chương trình con) có tên là procedure TForm1.edtHoTenChange(Sender: TObject); và các lệnh bên trong chương trình nhỏ sẽ được thực hiện theo. ShowMessage(chuỗi);_quan trọng lắm là thủ tục (còn gọi là chương trình nhỏ/lệnh) của delphi, có chức năng làm xuất hiện cửa sổ nhỏ với nội dung là chuỗi mà ta gõ trong cặp dấu ngoặc tròn. Lệnh này thường dùng để thông báo một câu ngắn nào đó, hoặc thể hiện kết quả trung gian (chẳng hạn như: kết quả tính toán của biểu thức, nội dung chứa trong biến,…) mà ta cần xem, kết quả này nếu không phải là chữ (vd: số, true, false,…) thì phải chuyển về chữ mới được. Ví dụ 1. Yêu cầu xuất hiện câu thông báo có nội dung là: ‘làm quen với delphi’. Thiết kế giao diện (màn hình làm việc) của chương trình:. Thiết kế thuật toán (cách giải): Do yêu cầu chỉ có thông báo ra màn hình một câu thông báo nên ta không cần thêm bất cứ đối tượng nào vào form cả, chỉ cần dùng thủ tục showmessage(); là được. Viết lệnh:.

<span class='text_page_counter'>(22)</span> Ta nháy đôi vào form Gõ lệnh vào. Các lệnh tham khảo: procedure TForm1.FormCreate(Sender: TObject); begin showmessage('làm quen với delphi'); end; Chạy chương trình: Ta nhấn phím F9 và xem kết quả:. Ví dụ 2: Yêu cầu: làm xuất hiện giá trị (nội dung) của biến x (x có kiểu integer) ra màn hình. Thiết kế thuật toán (cách giải):.

<span class='text_page_counter'>(23)</span> Đề có nói biến x nên ta cần khai báo biến x kiểu integer. Lưu ý: biến x này có thể khai báo ở hai vị trí là: Trước implementation (lúc này x là biến toàn cục, sử dụng được trong tất cả thủ tục/hàm của cả chương trình). Sau procedure TForm1.FormCreate(Sender: TObject); và trước begin (lúc này x là biến cục bộ, chỉ sử dụng trong thủ tục TForm1.FormCreate thôi, muốn sử dụng ở thủ tục/ hàm khác thì phải khai báo lại. Do đề chỉ yêu cầu xuất giá trị biến x nêu ta chỉ cần dùng thủ tục showmessage(); là được. Không cần thêm bất kì đối tượng nào. Thiết kế giao diện:. Viết lệnh: Ta nháy đôi vào form. Ta giả sử x là biến cục bộ, nên khai báo biến x ở sau procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.FormCreate(Sender: TObject); var x:integer; begin showmessage('nội dung của biến x là: '+intToStr(x)); end; toàn bộ chương trình:.

<span class='text_page_counter'>(24)</span> Chạy chương trình: Ta nhấn phím F9. Xem kết quả: giá trị biến x sẽ thay đổi, do delphi lấy ngẫu nhiên giá trị nào đó cho biến x. Vì vậy khi viết các chương trình có tính toán các bạn cần gán giá trị ban đầu cho biến để tránh sai kết quả ngoài ý muốn.. MessageDlg thông báo có lựa chọn của người dùng. Đôi khi ta cần làm xuất hiện thông báo có lựa chọn yes/no để người dùng lựa chọn yes/no. Tùy vào lựa chọn đó mà chương trình sẽ làm công việc khác nhau thì đây là lúc ta dùng đến MessageDlg. Cú pháp: function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; const AHelpContext: LongInt): Integer;.

<span class='text_page_counter'>(25)</span> Hoạt động: Hàm MessageDlg làm xuất hiện hộp thoại thông báo có nội dung chứa trong Amessage, thuộc loại thông báo chứa trong TMsgDlgType, có danh sách các nút lệnh lựa chọn chứa trong AButton, số thứ tự của hộp thoại chứa trong AHelpContext, và trả về kết quả là nút lệnh lựa chọn mà người dùng đã chọn. Trong đó: Tham số ADialogType thuộc kiểu TMsgDlgType. Kiểu TMsgDlgType có các giá trị sau: TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom); muốn sử dụng giá trị nào thì ta viết theo dạng: TMsgDlgType.TênGiáTrị, nhớ khai báo tên thư viện System.UITypes Tham số AButtons thuộc kiểu TMsgDlgButtons. Kiểu TMsgDlgButtons có các giá trị sau: TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose); Tham số AHelpContext là số thứ tự của hộp thoại, do người dùng tự đặt. Giá trị trả về của hàm MessageDlg là một trong các giá trị sau: Nút lệnh được chọn Giá trị trả về tương ứng mbOK. mrOk. mbCancel. mrCancel. mbAbort. mrAbort. mbRetry. mrRetry. mbIgnore. mrIgnore. mbYes. mrYes. mbNo. mrNo. mbClose. mrClose. mbHelp. mrHelp. mbTryAgain. mrTryAgain. mbContinue. mrContinue. mbNone. mrNone. mbAll. mrAll. mbNoToAll. mrNoToAll. mbYesToAll. mrYesToAll. Ví dụ: Yêu cầu: -tạo ứng dụng mới, có một nút lệnh. -khi người dùng nháy vào nút lệnh thì: Xuất hiện một hộp thoại thông báo ‘chào bạn, lựa chọn của bạn là gì?’, có lựa chọn là yes, no. -nếu người dùng nháy nút yes thì thông báo ‘bạn đã chọn yes’ -nếu người dùng nháy nút no thì thông báo ‘bạn đã chọn no’..

<span class='text_page_counter'>(26)</span> Chương trình: Thiết kế:. Viết lệnh:. procedure TForm1.Button1Click(Sender: TObject); begin if MessageDlg('chào bạn, lựa chọn của bạn là gì? ', System.UITypes.TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes , System.UITypes.tmsgdlgbtn.mbNo],0,tmsgdlgbtn.mbNo) = mrYes.

<span class='text_page_counter'>(27)</span> then. showmessage('bạn đã chọn yes') else showmessage('bạn đã chọn no'); end;. các lưu ý trong chương trình trên: - System.UITypes.TMsgDlgType.mtWarning, TMsgDlgBtn.mbYes , System.UITypes.tmsgdlgbtn.mbNo cùng thuộc thư viện System.UITypes.TMsgDlgType nên ta có thể viết gọn lại như sau: TMsgDlgType.mtWarning, TMsgDlgType.mbNo nếu chỉ viết mbYes, mnNo, mtWarning giống như trong help offline của delphi thì delphi báo lỗi. - Ta có thể thay đổi giá trị khác cho TMsgDlgType.mtWarning thành TMsgDlgType.mtInformation để xem sự khác nhau. - 0,tmsgdlgbtn.mbNo) tham số cuối tmsgdlgbtn.mbno có ý nghĩa là lựa chọn ngầm định (được gán sẵn) là lựa chọn nút lệnh No. Chạy chương trình:. Nếu chọn yes thì có thông báo này:. Nếu chọn no thì có thông báo này: 2.5.3.2 Edit-Methods Chưa cần dùng đến!. Câu lệnh gán Cú pháp: TênBiến := biểu thức ; Hoạt động: Máy sẽ tính biểu thức, sau đó lấy kết quả điền vào TênBiến. (nhớ đơn giản là lấy giá trị bên phải gán cho biến bên trái) Ví dụ: Ta muốn lưu (đưa) kết quả của biểu thức (2*x-45)/3 vào biến kq. Ta viết: Kq := (2*x-45)/3;.

<span class='text_page_counter'>(28)</span> Câu lệnh rẽ nhánh Cú pháp Dạng thiếu: If <điều kiện> then [câu lệnh] ; Dạng đủ: If <điều kiện> then [câu lệnh 1] Else [câu lệnh 2] ;. Giải thích: Các từ ngữ if, then, else là các từ khóa của delphi (người lập trình không thể thay đổi). Cặp dấu <> có ý nghĩa là phần bên trong bắt buộc phải có. Cặp dấu [] có ý nghĩa là phần bên trong không bắt buộc có. Điều kiện là một biểu thức có kết quả là true/false (đúng/sai). Câu lệnh, câu lệnh 1, câu lệnh 2 là một lệnh/hàm/thủ tục nào đó của delphi.. Hoạt động: Diễn tả bằng lời văn: Dạng thiếu: khi <điều kiện> cho kết quả là true (đúng) thì delphi sẽ thực hiện câu lệnh. Khi <điều kiện> cho kết quả là false (sai) thì delphi sẽ bỏ qua câu lệnh. Dạng đủ: khi <điều kiện> cho kết quả là true (đúng) thì delphi chỉ thực hiện câu lệnh1. Khi <điều kiện> cho kết quả là false (sai) thì delphi chỉ thực hiện câu lệnh 2. Diễn tả bằng sơ đồ khối: DẠNG THIẾU. DẠNG ĐỦ. Cách xuất dữ liệu từ chương trình ra màn hình Có thể dùng các cách sau:.

<span class='text_page_counter'>(29)</span> Cách 1: Lúc thiết kế chương trình ta thêm một lable riêng để dành xuất các thông báo của chương trình. Lable này ta nên đặt tên là lblTB, thuộc tính lblTB.text nhận các thông báo.. Vd: ta cần thông báo với nội dung: ‘làm quen với delphi xe8’ Thiết kế:. Thuộc tính name của lable ta đặt là lblTB. Thuộc tính text của lable ta xóa trống (không có kí tự nào cả). Viết lệnh: Ta nháy đôi vào form. Viết các lệnh cho thủ thục TForm1.FormCreate như sau: procedure TForm1.FormCreate(Sender: TObject); begin lblTB.Text := 'làm quen với delphi xe8'; end;.

<span class='text_page_counter'>(30)</span> chạy chương trình: ta ấn phím F9.. Kết quả:. Cách 2: Ta dùng showMessage và MessageDlg. Mời bạn xem lại ví dụ ở phần showmessage và messagedlg.. Cách nhập dữ liệu từ bàn phím vào chương trình Ta dùng đối tượng Edit để chứa giá trị do người dùng gõ từ bàn phím vào chương trinh. Đối tượng Edit nên đặt tên theo dạng EdtMụcĐíchDùng Thuộc tính EdtMụcĐíchDùng.text chứa giá trị do người dùng gõ vào. Lưu ý: giá trị trong EdtMụcĐíchDùng.text là kiểu text (chữ). Sau đó ta dùng các hàm chuyển đổi kiểu để đổi kiểu cho EdtMụcĐíchDùng.text nếu cần thiết. Ví dụ: Yêu cầu: Viết chương trình nhập vào năm sinh và năm hiện tại, sau đó tính số tuổi và thông báo ra màn hình cho người dùng biết. Phân tích: Cần nhập hai số: năm sinh và năm hiện tại. => số nguyên dương. Thông báo ra màn hình số tuổi. Thiết kế: Thuật toán (cách giải): Dùng 2 đối tượng lable để thông báo năm sinh và năm hiện tại. Dùng 2 đối tượng edit để nhập số năm sinh và năm hiện tại. Vì đây là số nên ta dùng hàm strToInt để đổi chữ thành số. Tính tuổi = năm hiện tại – năm sinh..

<span class='text_page_counter'>(31)</span> Dùng hàm intToStr đổi số tuổi thành chữ. Nút lệnh tính số tuổi có chức năng: Thông báo ra màn hình số tuổi bằng thủ tục showmessage. Giao diện (màn hình làm việc) của chương trình. Viết lệnh: Nháy đôi vào nút lệnh btnTinhTuoi và gõ các lệnh vào. Các bạn có thể tham khảo các lệnh sau: procedure TForm1.btnTinhTuoiClick(Sender: TObject); var namsinh,namhientai,tuoi:integer; begin NamSinh:=strToInt(edtnamsinh.Text); NamHienTai:=strToInt(edtnamhientai.Text); tuoi:=namhientai-namsinh; showmessage('số tuổi của bạn là:'+intToStr(tuoi)); end; dưới đây là chi tiết của chương trình:.

<span class='text_page_counter'>(32)</span> Chạy chương trình ta nhấn phím F9. Kết quả chương trình:. 3. Các kiểu dữ liệu đơn giản. 3.1 Kiểu số 3.1.1 số nguyên Tên kiểu Byte Word Integer longInt longWord Tham khảo thêm nhe. Phạm vi giá trị 0..255 0..65535 -2147483648..2147483647 =integer 0..4294967295.

<span class='text_page_counter'>(33)</span> Type. Range. Format. Alias. ShortInt. -128..127. Signed 8-bit. Int8. SmallInt. -32768..32767. Signed 16-bit. Int16. FixedInt. -2147483648..2147483647. Signed 32-bit. Int32. Int64. -2^63..2^63-1. Signed 64-bit. FixedUInt 0..4294967295. Unsigned 32-bit UInt32. Cardinal. 0..4294967295. Unsigned 32-bit UInt32. UInt64. 0..2^64-1. Unsigned 64-bit. Các phép toán cho kiểu nguyên: + cộng hai số nguyên - trừ hai số nguyên * nhân hai số nguyên (lưu ý giá trị của kết q ủa có thể nằm ngoài phạm vi của kiểu). Div chia lấy phần nguyên. Vd: 5 div 2 kết quả là 2. Mod chi lấy phần dư. Vd: 5 mod 2 kết quả là 1. Các phép toán so sánh > < >= <= =. Các hàm/thủ tục thường dùng cho kiểu nguyên Thủ tục inc(biến); tăng giá trị của biến thêm 1 đơn vị, tương đương với biến:=biến+1; Thủ tục dec(biến); giảm giá trị của biến đi 1 đơn vị, tương đương với biến:=biến-1; Hàm succ(biến); tăng giá trị của biến thêm 1 đơn vị. Hàm pred(biến); giảm giá trị của biến đi 1 đơn vị. 3.1.2 số thực Tên kiểu. Số lượng Số byte sử chữ số dụng 5.0e-324 .. 1.7e+308 15-16 Real 8 5.0e-324 .. 1.7e+308 Double 15-16 8 1.5e-45 .. 3.4e+38 Single 7-8 4 Tham khảo thêm các kiểu sau nha các bạn: (cố lên và cố lên nữa…) Type Real48. Phạm vi giá trị. Approximate Positive Range. Significant digits Size in bytes 11-12. 6. 10-20 15-16. 10 8. 10-20. 8. Currency -922337203685477.5808.. 922337203685477.5807 10-20. 8. 2.9e-39 .. 1.7e+38 . 32-bit platforms 3.4e-4932 .. 1.1e+4932. . 64-bit platforms 5.0e-324 .. 1.7e+308. Extended Comp. -263+1 .. 263-1.

<span class='text_page_counter'>(34)</span> Các phép toán dùng cho số thực + cộng hai số thực - trừ hai số thực * nhân hai số thực / chia hai số thực Các phép toán so sánh > < >= <= =. Các hàm/thủ tục thường dùng cho số thực: Hàm Sin(biến) trả kết quả là ‘sin’ của góc ‘biến’ (đơn vị là radian). Ví dụ: sin(pi/2) kết quả là 1. Hàm cos(biến) trả kết quả là ‘cos’ của góc ‘biến’ (đơn vị là radian). Ví dụ: cos(pi/2) kết quả là 0. Hàm sqr(biến) kết quả là bình phương của ‘biến’. vd: sqr(3) kết quả là 9. Hàm sqrt(biến) kết quả là căn bậc hai của ‘biến’. vd: sqrt(4) kết quả là 2. Hàm abs(biến) kết quả là trị tuyệt đối của ‘biến’. vd: abs(-1) kết quả là 1.. Tham khảo thêm các hàm toán học sau: Constants used in math routines The following table lists all the constants used in mathematical routines found in Delphi: Routine. Description. System.Math.Infinity. Represents positive infinity.. System.Math.MaxComp. Defines the maximum absolute value for a Comp variable.. System.Math.MaxDouble. Defines the maximum absolute value for a Double variable.. System.Math.MaxExtended. Defines the maximum absolute value for an Extended variable.. System.Math.MaxSingle. Defines the maximum absolute value for a Single variable.. System.Math.MinComp. Defines the smallest absolute value for a Comp variable.. System.Math.MinDouble. Defines the smallest absolute value for a Double variable.. System.Math.MinExtended. Defines the smallest absolute value for an Extended variable.. System.Math.MinSingle. Defines the smallest absolute value for a Single variable.. System.Math.NaN. Represents a value that cannot be represented as a valid number.. Math.NegativeValue (see Math Constants) Defines a negative number that results from using Sign. System.Math.NegInfinity. Represents negative infinity.. Math.PositiveValue (see Math Constants). Defines a positive number that results from using Sign.. Math.ZeroValue (see Math Constants). Defines a zero-value number that results from using Sign.. Arithmetic routines The following table lists the arithmetic routines found in Delphi: Routine. Description. System.Abs. Returns an absolute value.. System.Math.Ceil. Rounds variables up toward positive infinity.. System.Math.DivMod. Returns the result of an integer division, including the remainder.. System.Exp. Returns the exponential of X.. System.Math.Floor. Rounds variables toward negative infinity.. System.Math.Frexp. Separates the Mantissa and Exponent of X.. System.Int. Returns the integer part of a real number..

<span class='text_page_counter'>(35)</span> System.Math.IntPower. Calculates the integral power of a base value.. System.Math.IsInfinite. Indicates when a variable or expression represents an infinite value.. System.Math.IsNan. Indicates when a variable or expression does not evaluate to a numeric value.. System.Math.IsZero. Indicates when a floating-point variable or expression evaluates to zero, or very close to zero.. System.Math.Ldexp. Calculates X times (2 to the power of P).. System.Math.LnXP1. Returns the natural log of (X+1).. System.Math.Log10. Calculates log base 10.. System.Math.Log2. Calculates log base 2.. System.Math.LogN. Calculates the log of X for a specified base.. System.Math.Max. Returns the greater of two numeric values (Delphi only).. System.Math.MaxIntValue. Returns the largest signed value in an integer array.. System.Math.MaxValue. Returns the largest signed value in an array.. System.Math.Mean. Returns the average of all values in an array.. System.Math.Min. Returns the lesser of 2 numeric values (Delphi only).. System.Math.MinIntValue. Returns the smallest signed value in an integer array.. System.Math.MinValue. Returns the smallest signed value in an array.. System.Odd. Returns true if the argument is an odd number.. System.Math.Power. Raises Base to any power.. System.Round. Returns the value of X rounded to the nearest whole number.. System.Math.RoundTo. Rounds a floating-point value to a specified digit or power of 10 using "Banker's rounding".. System.Math.Sign. Indicates whether a numeric value is positive, negative, or zero.. System.Math.SimpleRoundTo. Rounds a floating-point value to a specified digit or power of 10 using asymmetric arithmetic rounding.. System.Sqr. Returns the square of a number.. System.Sqrt. Returns the square root of X.. System.Math.Sum. Returns the sum of the elements in an array.. System.Math.SumInt. Returns the sum of the elements in an integer array.. System.Math.SumOfSquares. Returns the sum of the squared values from a data array.. System.Math.SumsAndSquares Returns the sum of the values and the sum of the squared values in an array. System.Trunc. Truncates a real number to an integer.. Trigonometric routines The following table lists the trigonometric routines found in Delphi: Routine. Description. System.Math.ArcCos. Calculates the inverse cosine of a given number.. System.Math.ArcCosh. Calculates the inverse hyperbolic cosine of a given number.. System.Math.ArcCot. Calculates the inverse cotangent of a given number.. System.Math.ArcCotH. Calculates the inverse hyperbolic cotangent of a given number.. System.Math.ArcCsc. Calculates the inverse cosecant of a given number.. System.Math.ArcCscH. Calculates the inverse hyperbolic cosecant of a given number.. System.Math.ArcSec. Calculates the inverse secant of a given number.. System.Math.ArcSecH. Calculates the inverse hyperbolic secant of a given number.. System.Math.ArcSin. Calculates the inverse sine of a given number.. System.Math.ArcSinh. Calculates the inverse hyperbolic sine of a given number.. System.ArcTan. Calculates the arc tangent of a given number.. System.Math.ArcTan2. Calculates the arc tangent angle and quadrant of a given number.. System.Math.ArcTanh. Calculates the inverse hyperbolic tangent of a given number..

<span class='text_page_counter'>(36)</span> System.Math.Cosecant. Returns the cosecant of an angle.. System.Math.Cosh. Calculates the hyperbolic cosine of an angle.. System.Math.Cot. Calculates the cotangent of an angle.. System.Math.Cotan. Calculates the cotangent of an angle.. System.Math.CotH. Calculates the hyperbolic cotangent of an angle.. System.Math.Csc. Returns the cosecant of an angle.. System.Math.CscH. Returns the hyperbolic cosecant of an angle.. System.Math.CycleToDeg Converts an angle measurement from cycles to degrees. System.Math.CycleToGrad Converts an angle measurement from cycles to grads. System.Math.CycleToRad. Converts an angle measurement from cycles to radians.. System.Math.DegToCycle. Returns the value of a degree measurement expressed in cycles.. System.Math.DegToGrad. Returns the value of a degree measurement expressed in grads.. System.Math.DegToRad. Returns the value of a degree measurement expressed in radians.. System.Math.GradToCycle Converts grad measurements to cycles. System.Math.GradToDeg. Converts grad measurements to degrees.. System.Math.GradToRad. Converts grad measurements to radians.. System.Math.Hypot. Calculates the length of the hypotenuse.. System.Pi. Returns 3.1415926535897932385.. System.Math.RadToCycle. Converts radians to cycles.. System.Math.RadToDeg. Converts radians to degrees.. System.Math.RadToGrad. Converts radians to grads.. System.Math.Sec. Calculates the secant of an angle.. System.Math.Secant. Calculates the secant of an angle.. System.Math.SecH. Calculates the hyperbolic secant of an angle.. System.Sin. Returns the sine of the angle in radians.. System.Math.SinCos. Returns the sine and cosine of an angle.. System.Math.Sinh. Returns the hyperbolic sine of an angle.. System.Math.Tan. Returns the tangent of X.. System.Math.Tanh. Returns the hyperbolic tangent of X.. System.Trunc. Truncates a real number to an integer.. 3.2 kiểu logic Kiểm logic là kiểu nhận một trong hai hằng giá trị true, false. Tên kiểu Phạm vi giá trị Boolean True, false. 3.3 kiểu kí tự Kiểu kí tự trong Delphi gồm có: Char, AnsiChar, WideChar, UCS2Char, và UCS4Char: Char là kiểu giống với kiểu wideChar, dùng hai byte để chứa kí tự, chứa được các kí tự unicode. ansiChar dùng một byte để chứa kí tự, chỉ chứa được 256 kí tự đầu của unicode..

<span class='text_page_counter'>(37)</span> Các kiểu dùng cho pc, điện thoại trong bảng dưới: Các kiểu dùng cho ứng dụng máy pc System.WideString System.AnsiString, System.ShortString, System.RawByteString, System.UTF8String System.AnsiChar System.PAnsiChar, System.PWideChar. Các kiểu dùng cho ứng dụng điện thoại System.String. Không dùng. Nên thay bởi 'array of byte' System.Char, System.Byte, System.UInt8 System.SysUtils.TStringBuilder, System.String, System.MarshaledString. Nên thay bởi 'array of byte'. System.Openstring. 3.4 kiểu miền con, kiểu liệt kê Kiểu miền con/kiểu liệt kê là một tập các giá trị đơn giản được người lập trình liệt kê. Sự khác nhau là kiểu liệt kê. Kiểu miền con. Các giá trị này có thể không liên tục, Các giá trị có thể liên tục, được viết theo thường liệt kê hết các giá trị. dạng Xi .. Xj Vd: trắng, xanh, vàng, đỏ Vd: 0..9, 12,15 hoặc ‘a’..’h’, ‘z’ Ưu điểm của kiểu dữ liệu này là giới hạn giá trị có thể nhận của biến, hạn chế tối đa những giá trị không mong muốn do người dùng nhập vào. Cú pháp khai báo kiểu miền con (định nghĩa): type typeName = (val1, ...,valn); ví dụ: khai báo kiểu tThu chứa các thứ 2, 3, 4,..,8 và biến thu có kiểu tthu, xem lệnh được viết trong hình dưới. kiểu liệt kê: type //nếu đặt trong phần type thì không cần viết lại (một) hàng này. Tthu=(thu2, thu3, thu4, thu5, thu6, thu7, thu8); Và có thể khai bào thêm kiểu miền con khi đã khai báo kiểu tthu ở trên Type LamViec=thu2..thu6; Nghi=thu7..thu8;. Kết quả khi nhấn F9 là hai hình nhỏ ở hai bên, giữa là dòng lệnh cần thêm..

<span class='text_page_counter'>(38)</span> Thứ tự của các giá trị trong kiểu tThu là 0,1,2,3,4,5,6,7. Bạn có thể dùng hàm ord(giá trị) để biết như trong ví dụ trên. Chú ý: tên của các giá trị phải khác với tên của các từ khóa trong Delphi. Nếu đặt giống nhau rồi thì ta cần thêm tên của unit theo dạng: tênUnit.TênGiáTrị Ta có thể thay đổi thứ tự (gán giá trị) ban đầu cho các tên trong kiểu liệt kê theo ví dụ: Type Tthu=(thu2=2, thu3=3, thu4=4, thu5=5, thu6=6, thu7=7, cn=thu7+1); Khi sử dụng ord(thu2) kết quả là 2, ord(cn) kết quả là 8.. 3.5 các hàm chuyển đổi kiểu: StrToInt(xâu) chuyển nội dung của biến xâu thành số nguyên. FloatToStr(BiếnSốThực) chuyển giá trị của BiếnSốThực thành xâu. DateToStr(const DateTime: TDateTime): string; chuyển nội dung ngày thành xâu. function TimeToStr(const DateTime: TDateTime): string; chuyển nội dung thời gian thành xâu. Vài ví dụ: Vd1: Bạn hãy tạo một form mới chứa các đối tượng: 1 label, 1 button. Hoạt động: khi người dùng nháy chuột vào nút lệnh thì ngày hiện tại của máy sẽ xuất hiện trong label, ngày được định dạng theo mẫu: m/d/yyyy Viết lệnh cho nút lệnh: procedure TForm1.Button1Click(Sender: TObject); begin DateSeparator := '-'; ShortDateFormat := 'm/d/yyyy'; Label1.Caption := DateToStr(Date); end; với date là một hàm trả về ngày hiện tại của máy, cú pháp như sau: function Date: TDateTime; ví dụ 2:.

<span class='text_page_counter'>(39)</span> Giới thiệu về hàm EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime; Hàm này điền các giá trị hour, min, sec, msec vào đối tượng thuộc kiểu TdateTime. Với phạm vi của các tham số như sau: Hour từ 0 đến 23. Min và Sec từ 0 đến 59. MSec từ 0 đến 999.. chuyển kiểu xâu thành các kiểu khác: Routine. With Def. Value. Data.FmtBcd.StrToBcd System.SysUtils.StrToBool. System.SysUtils.StrToBoolDef. System.ConvUtils.StrToConvUnit. Exception-less variant. Description. Data.FmtBcd.TryStrToBcd. Converts a string to the corresponding binary-coded decimal (BCD) value.. System.SysUtils.TryStrToBool. Converts a string to a Boolean value.. System.ConvUtils.TryStrToConvUnit. Parses a string into a value and conversion type.. System.SysUtils.StrToCurr. System.SysUtils.StrToCurrDef. System.SysUtils.TryStrToCurr. Converts a string to a Currency value.. System.SysUtils.StrToDate. System.SysUtils.StrToDateDef. System.SysUtils.TryStrToDate. Converts a string to a System.TDate value.. System.SysUtils.StrToDateTime. System.SysUtils.StrToDateTimeDef. System.SysUtils.TryStrToDateTime. Converts a string System.TDateTime value.. System.SysUtils.StrToFloat. System.SysUtils.StrToFloatDef. System.SysUtils.TryStrToFloat. Converts a given string to a floatingpoint value.. System.SysUtils.StrToInt. System.SysUtils.StrToIntDef. System.SysUtils.TryStrToInt. Converts a string that represents an integer (decimal or hex notation) to a number.. System.SysUtils.StrToInt64. System.SysUtils.StrToInt64Def. System.SysUtils.TryStrToInt64. Converts a string that represents an integer (decimal or hex notation) to a number.. System.SysUtils.StrToTime. System.SysUtils.StrToTimeDef. System.SysUtils.TryStrToTime. Converts a string System.TDateTime value.. to. a. to. a. Data.SqlTimSt.StrToSQLTimeStamp. Converts a string to Data.SqlTimSt.TSQLTimeStamp value.. a. System.Val. Converts a string to a numeric representation..

<span class='text_page_counter'>(40)</span> 4. Các kiểu dữ liệu phức tạp hơn 4.1 kiểu xâu Kiểu xâu (chuỗi) trong UnicodeString=string và wideString.. Delphi. gồm. có:. shortString,. AnsiString,. Nếu bạn có ý định viết chương trình có sử dụng biến kiểu xâu chạy trên di động thì nên xem qua phần sau: Kiểu xâu dùng cho PC WideString, AnsiString, ShortString, AnsiChar, PAnsiChar, PwideChar, OpenString. Kiểu xâu dùng cho ĐTDĐ String, char. Kí tự đầu tiên có số thứ tự (chỉ số) là 1 Kí tự đầu tiên có số thứ tự (chỉ số) là 0 Chuyển đổi loại xâu dùng cho pc sang loại cho đtdđ ta dùng TstringHelper phía cuối tài liệu. Khả năng lưu của các kiểu xâu: Tên kiểu xâu ShortString AnsiString UnicodeString WideString. Số lượng kí tự tối đa 255 2^31 2^30 2^30. kích thước trong bộ nhớ 2 -> 256 byte 4 -> 2 Gb 4 -> 2 Gb 4 -> 2 Gb. Ví dụ về khai báo biến xâu: 1 Short strings: var MyString: string[100]; hoặc type CString = string[100]; var MyString: CString; 2 tên kiểu là string var s:string; nếu trong win32 thì - tương ứng với uncodestring. - ta có thể dùng {$H-} để chuyển string thành shortstring (dùng khi làm việc với delphi 16 bit hoặc turbo pascal). So sánh hai xâu: Lấy ra từng cặp kí tự tương ứng với mỗi vị trí để so sánh, Nếu hai xâu có độ dài bằng nhau thì.

<span class='text_page_counter'>(41)</span> Nếu hai xâu có độ dài khác nhau thì. Để lấy ra một kí tự trong xâu ta viết theo dạng: Tên_biến_xâu[ vị trí ]. Đặc biệt lưu ý đến phạm vi của “vị trí” đối với mỗi biến xâu. Ví dụ: Ta có var MyString: string[100]; … Mystring:=’delphi xe8’; … Muốn lấy ra kí tự thứ 4 trong biến xâu mystring, ta xác định: tên biến xâu là mystring, vị trí là 4, khi đó viết lệnh là mystring[4] Ghép xâu (cộng các xâu lại) ta dùng phép toán + Vd: MyString := 'Hello world!'; MyString := 'Hello' + 'world'; MyString := MyString + '!'; MyString := ' '; { xâu có 1 khoang trắng } MyString := ''; { xâu rỗng-xâu không có nội dung }.

<span class='text_page_counter'>(42)</span> 4.2 kiểu có cấu trúc: mảng-bản ghi-tệp 4.2.1 Kiểu mảng: Kiểu mảng gồm các nội dung: Mảng tỉnh. Mảng động. Mảng động nhiều chiều. Sự giống nhau của mảng so với kiểu xâu. 4.2.1.1 Mảng tỉnh.. -Cách khai báo mảng tỉnh một chiều: Cách gián tiếp: Type TênKiểuMảng = array [ChỉSốĐầu .. ChỉSốCuối] of KiểuPhầnTử ; Var TênBiếnMảng : TênKiểuMảng ; Cách trực tiếp: Var TênBiếnMảng : array [ChỉSốĐầu .. ChỉSốCuối] of KiểuPhầnTử; Trong đó: TênKiểuMảng, TênBiếnMảng là do người lập trình tự đặt theo quy định đặt tên của delphi. ChỉSốĐầu, chỉSốCuối là biến, hoặc hằng số, hằng kí tự để chỉ thứ tự (vị trí) của các phần tử trong mảng và ChỉSốĐầu <= chỉSốCuối. Hàm Low(tênBiếnMảng) cho biết chỉ số đầu của tên biến mảng. Hàm High(TênBiếnMảng) cho biết chỉ số cuối của tên biến mảng. Kiểu phần tử là một trong các kiểu của delphi hoặc kiểu do người lập trình tự đặt với từ khóa type. Ví dụ 1: Yêu cầu: Ta cần khai báo biến (một/nhiều biến) để chứa 10 số nguyên (có giá trị từ -100 đến 100). Phân tích: +Số lượng biến là 10 (nhiều biến rồi đó mà). +Kiểu của các biến: đều có chung một kiểu là số nguyên. +Phạm vi giá trị là từ -100 đến 100 => do nhiều biến có chung một kiểu nên ta dùng kiểu mảng, đặt tên biến là MangNguyen Khai báo: Var MangNguyen : array [1..10] of integer;.

<span class='text_page_counter'>(43)</span> -Truy xuất (lấy ra) một phần tử của mảng tỉnh. Ta cần xác định các thông tin: Tên biến của mảng lúc này là gì? Vị trí của phần từ là bao nhiêu hoặc được chứa trong biến nào? Ta viết theo dạng TênBiếnMảng[chỉ số] Ví dụ: Yêu cầu là: Lấy giá trị của phần tử thứ 4 trong mảng mangnguyen Phân tích: Tên biến mảng là MangNguyen Vị trí cần lấy là 4 Ta viết: MangNguyen[4] Ví dụ 2: (tham khảo thôi) Yêu cầu: Hãy khai báo biến để đếm số lượng các kí tự chữ cái (phân biệt chữ hoa với thường) có trong xâu ‘rat vui khi duoc lam quen voi cac ban!!!’ (lưu ý xâu không có dấu) Phân tích: Đề chỉ yêu cầu đếm các kí tự chữ cái không đếm các kí hiệu đặc biệt. =>Bảng chữ cái có 24 kí tự => ta cần 24 biến. Có phân biệt chữ hoa với chữ thường nên số lượng biến tăng gấp đôi là 48 biến. => nếu khai báo riêng lẻ từng biến thì rất rất là tốn công sức, thời gian, sử dụng không hiệu quả,… nên ta dùng hai biến mảng là MangChuThuong và MangChuHoa. Khai báo: Var MangChuThuong : array [‘a’..’z’] of char; MangChuHoa : array [‘A’..’Z’] of char; (~!~) Chắc các bạn sẽ hỏi sao kì vậy!!!!! không kì đâu nó khác nhau khi viết câu lệnh đếm số lượng các kí tự đó bạn. Chứ phần khai báo này là ổn rồi. Bạn nào có cách hay hơn thì tuyệt lắm. Còn chương trình đầy đủ thì sao??? Mời bạn xem qua (~!~): bạn vui lòng tự làm nghe….

<span class='text_page_counter'>(44)</span> BÀI TẬP CHO BẠN: 4.2.1.2 Mảng động. 4.2.1.3 Mảng động nhiều chiều. 4.2.1.4 Sự giống nhau của mảng so với kiểu xâu.. Arrays An array represents an indexed collection of elements of the same type (called the base type). Because each element has a unique index, arrays, unlike sets, can meaningfully contain the same value more than once. Arrays can be allocated statically or dynamically.. Static Arrays Static array types are denoted by constructions of the form: array[indexType1, ..., indexTypen] of baseType;.

<span class='text_page_counter'>(45)</span> where each indexType is an ordinal type whose range does not exceed 2GB. Since the indexTypes index the array, the number of elements an array can hold is limited by the product of the sizes of the indexTypes. In practice, indexTypes are usually integer subranges. In the simplest case of a one-dimensional array, there is only a single indexType. For example: var MyArray: array [1..100] of Char;. declares a variable called MyArray that holds an array of 100 character values. Given this declaration, MyArray[3] denotes the third character in MyArray. If you create a static array but don't assign values to all its elements, the unused elements are still allocated and contain random data; they are like uninitialized variables. A multidimensional array is an array of arrays. For example: type TMatrix = array[1..10] of array[1..50] of Real;. is equivalent to: type TMatrix = array[1..10, 1..50] of Real;. Whichever way TMatrix is declared, it represents an array of 500 real values. A variable MyMatrix of type TMatrix can be indexed like this: MyMatrix[2,45]; or like this: MyMatrix[2][45]. Similarly: packed array[Boolean, 1..10, TShoeSize] of Integer;. is equivalent to: packed array[Boolean] of packed array[1..10] of packed array[TShoeSize] of Integer;. The standard functions Low and High operate on array type identifiers and variables. They return the low and high bounds of the array's first index type. The standard function Length returns the number of elements in the array's first dimension. A one-dimensional, packed, static array of Char values is called a packed string. Packed-string types are compatible with string types and with other packed-string types that have the same number of elements. See Type Compatibility and Identity. An array type of the form array[0..x] of Char is called a zero-based character array. Zero-based character arrays are used to store null-terminated strings and are compatible with PChar values. See "Working with null-terminated strings" in String Types (Delphi).. Dynamic Arrays Dynamic arrays do not have a fixed size or length. Instead, memory for a dynamic array is reallocated when you assign a value to the array or pass it to the SetLength procedure. Dynamic-array types are denoted by constructions of the form: array of baseType For example: var MyFlexibleArray: array of Real;.

<span class='text_page_counter'>(46)</span> declares a one-dimensional dynamic array of reals. The declaration does not allocate memory for MyFlexibleArray. To create the array in memory, call SetLength. For example, given the previous declaration: SetLength(MyFlexibleArray, 20);. allocates an array of 20 reals, indexed 0 to 19. An alternative method of allocating memory for dynamic arrays is to invoke the array constructor: type TMyFlexibleArray = array of Integer; begin MyFlexibleArray := TMyFlexibleArray.Create(1, 2, 3 {...}); end;. which allocates memory for three elements and assigns each element the given value. Similar to the array constructor, a dynamic array may also be initialized from an array constant expression as below. procedure MyProc; var A: array of Integer; begin A := [1, 2, 3]; end;. Notice that unlike with an array constructor, an array constant can be applied to unnamed dynamic array type directly. This syntax is specific to dynamic arrays; applying this technique to other array types is likely to result in the constant being interpreted as a set, leading to an incompatible types error at compile-time. Dynamic arrays are always integer-indexed, always starting from 0. Dynamic-array variables are implicitly pointers and are managed by the same reference-counting technique used for long strings. To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it. Dynamic arrays are automatically released when their reference-count drops to zero. Dynamic arrays of length 0 have the value nil. Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure. If X and Y are variables of the same dynamic-array type, X := Y points X to the same array as Y. (There is no need to allocate memory for X before performing this operation.) Unlike strings and static arrays, copy-on-write is not employed for dynamic arrays, so they are not automatically copied before they are written to. For example, after this code executes: var A, B: array of Integer; begin SetLength(A, 1); A[0] := 1; B := A; B[0] := 2; end;. the value of A[0] is 2. (If A and B were static arrays, A[0] would still be 1.) Assigning to a dynamic-array index (for example, MyFlexibleArray[2] := 7) does not reallocate the array. Out-of-range indexes are not reported at compile time..

<span class='text_page_counter'>(47)</span> In contrast, to make an independent copy of a dynamic array, you must use the global Copy function: var A, B: array of Integer; begin SetLength(A, 1); A[0] := 1; B := Copy(A); B[0] := 2; { B[0] <> A[0] } end;. When dynamic-array variables are compared, their references are compared, not their array values. Thus, after execution of the code: var A, B: array of Integer; begin SetLength(A, 1); SetLength(B, 1); A[0] := 2; B[0] := 2; end;. A = B returns False but A[0] = B[0] returns True. To truncate a dynamic array, pass it to SetLength, or pass it to Copy and assign the result back to the array variable. (The SetLength procedure is usually faster.) For example, if A is a dynamic array, either of the following truncates all but the first 20 elements of A: SetLength(A, 20) A := Copy(A, 0, 20). Once a dynamic array has been allocated, you can pass it to the standard functions Length, High, and Low. Length returns the number of elements in the array, High returns the array's highest index (that is, Length - 1), and Low returns 0. In the case of a zero-length array, High returns -1 (with the anomalous consequence that High < Low). Note: In some function and procedure declarations, array parameters are represented as array of baseType, without any index types specified. For example,function CheckStrings(A: array of string): Boolean; This indicates that the function operates on all arrays of the specified base type, regardless of their size, how they are indexed, or whether they are allocated statically or dynamically.. Multidimensional Dynamic Arrays To declare multidimensional dynamic arrays, use iterated array of ... constructions. For example: type TMessageGrid = array of array of string; var Msgs: TMessageGrid;. declares a two-dimensional array of strings. To instantiate this array, call SetLength with two integer arguments. For example, if I and J are integer-valued variables: SetLength(Msgs,I,J);. allocates an I-by-J array, and Msgs[0,0] denotes an element of that array..

<span class='text_page_counter'>(48)</span> You can create multidimensional dynamic arrays that are not rectangular. The first step is to call SetLength, passing it parameters for the first n dimensions of the array. For example: var Ints: array of array of Integer; SetLength(Ints,10);. allocates ten rows for Ints but no columns. Later, you can allocate the columns one at a time (giving them different lengths); for example: SetLength(Ints[2], 5);. makes the third column of Ints five integers long. At this point (even if the other columns haven't been allocated) you can assign values to the third column - for example, Ints[2,4] := 6. The following example uses dynamic arrays (and the IntToStr function declared in the SysUtils unit) to create a triangular matrix of strings. var A : array of array of string; I, J : Integer; begin SetLength(A, 10); for I := Low(A) to High(A) do begin SetLength(A[I], I); for J := Low(A[I]) to High(A[I]) do A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' '; end; end;. Array Types and Assignments Arrays are assignment-compatible only if they are of the same type. Because the Delphi language uses name-equivalence for types, the following code will not compile. var Int1: array[1..10] of Integer; Int2: array[1..10] of Integer; ... Int1 := Int2;. To make the assignment work, declare the variables as: var Int1, Int2: array[1..10] of Integer;. or: type IntArray = array[1..10] of Integer; var Int1: IntArray; Int2: IntArray;. String-Like Operations Supported on Dynamic Arrays Dynamic arrays can be manipulated similarly to strings. For example: var A: array of integer; B: TBytes = [1,2,3,4]; //Initialization can be done from declaration begin ....

<span class='text_page_counter'>(49)</span> A:=[1,2,3]; // assignation using constant array A:=A+[4,5]; // addition - A will become [1,2,3,4,5] ... end;. String-like Support Routines Some of the Delphi Intrinsic Routines support operations on dynamic arrays in addition to operations on strings. System.Insert. The Insert function inserts a dynamic array at the beginning at the position index. It returns the modified array: var A: array of integer; begin ... A:=[1,2,3,4]; Insert(5,A,2); // A will become [1,2,5,3,4] ... end; System.Delete. The Delete function eliminates elements from a dynamic array and returns the modified array: var A: array of integer; begin ... A:=[1,2,3,4]; Delete(A,1,2); //A will become [1,4] ... end; System.Concat. The Concat function can be used to put together two different dynamic arrays: A := Concat([1,2,3],[4,5,6]); //A will become [1,2,3,4,5,6]. Records (traditional) A record (analogous to a structure in some languages) represents a heterogeneous set of elements. Each element is called a field; the declaration of a record type specifies a name and type for each field. The syntax of a record type declaration is: type recordTypeName = record fieldList1: type1; ... fieldListn: typen; end. where recordTypeName is a valid identifier, each type denotes a type, and each fieldList is a valid identifier or a comma-delimited list of identifiers. The final semicolon is optional..

<span class='text_page_counter'>(50)</span> For example, the following declaration creates a record type called TDateRec. type TDateRec = record Year: Integer; Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Day: 1..31; end;. Each TDateRec contains three fields: an integer value called Year, a value of an enumerated type called Month, and another integer between 1 and 31 called Day. The identifiers Year, Month, and Day are the field designators for TDateRec, and they behave like variables. The TDateRec type declaration, however, does not allocate any memory for the Year, Month, and Day fields; memory is allocated when you instantiate the record, like this: var Record1, Record2: TDateRec;. This variable declaration creates two instances of TDateRec, called Record1 and Record2. You can access the fields of a record by qualifying the field designators with the record's name: Record1.Year := 1904; Record1.Month := Jun; Record1.Day := 16;. Or use a with statement: with Record1 do begin Year := 1904; Month := Jun; Day := 16; end;. You can now copy the values of Record1's fields to Record2: Record2 := Record1;. Because the scope of a field designator is limited to the record in which it occurs, you don't have to worry about naming conflicts between field designators and other variables. Instead of defining record types, you can use the record ... construction directly in variable declarations: var S: record Name: string; Age: Integer; end;. However, a declaration like this largely defeats the purpose of records, which is to avoid repetitive coding of similar groups of variables. Moreover, separately declared records of this kind will not be assignment-compatible, even if their structures are identical.. Variant Parts in Records A record type can have a variant part, which looks like a case statement. The variant part must follow the other fields in the record declaration. To declare a record type with a variant part, use the following syntax:.

<span class='text_page_counter'>(51)</span> type recordTypeName = record fieldList1: type1; ... fieldListn: typen; case tag: ordinalType of constantList1: (variant1); ... constantListn: (variantn); end;. The first part of the declaration - up to the reserved word case - is the same as that of a standard record type. The remainder of the declaration - from case to the optional final semicolon - is called the variant part. In the variant part,    . tag is optional and can be any valid identifier. If you omit tag, omit the colon (:) after it as well. ordinalType denotes an ordinal type. Each constantList is a constant denoting a value of type ordinalType, or a comma-delimited list of such constants. No value can be represented more than once in the combined constantLists. Each variant is a semicolon-delimited list of declarations resembling the fieldList: type constructions in the main part of the record type. That is, a variant has the form:. fieldList1: type1; ... fieldListn: typen;. where each fieldList is a valid identifier or comma-delimited list of identifiers, each type denotes a type, and the final semicolon is optional. The types must not be long strings, dynamic arrays, variants (that is, Variant types), or interfaces, nor can they be structured types that contain long strings, dynamic arrays, variants, or interfaces; but they can be pointers to these types. Records with variant parts are complicated syntactically but deceptively simple semantically. The variant part of a record contains several variants which share the same space in memory. You can read or write to any field of any variant at any time; but if you write to a field in one variant and then to a field in another variant, you may be overwriting your own data. The tag, if there is one, functions as an extra field (of type ordinalType) in the non-variant part of the record. Variant parts have two purposes. First, suppose you want to create a record type that has fields for different kinds of data, but you know that you will never need to use all of the fields in a single record instance. For example: type TEmployee = record FirstName, LastName: string[40]; BirthDate: TDate; case Salaried: Boolean of True: (AnnualSalary: Currency); False: (HourlyWage: Currency); end;. The idea here is that every employee has either a salary or an hourly wage, but not both. So when you create an instance of TEmployee, there is no reason to allocate enough memory for both fields. In this case, the only difference between the variants is in the field names, but the fields could just as easily have been of different types. Consider some more complicated examples: type TPerson = record FirstName, LastName: string[40]; BirthDate: TDate; case Citizen: Boolean of.

<span class='text_page_counter'>(52)</span> True: (Birthplace: string[40]); False: (Country: string[20]; EntryPort: string[20]; EntryDate, ExitDate: TDate); end; type TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other); TFigure = record case TShapeList of Rectangle: (Height, Width: Real); Triangle: (Side1, Side2, Angle: Real); Circle: (Radius: Real); Ellipse, Other: (); end;. For each record instance, the compiler allocates enough memory to hold all the fields in the largest variant. The optional tag and the constantLists (like Rectangle, Triangle, and so forth in the last example) play no role in the way the compiler manages the fields; they are there only for the convenience of the programmer. The second reason for variant parts is that they let you treat the same data as belonging to different types, even in cases where the compiler would not allow a typecast. For example, if you have a 64-bit Real as the first field in one variant and a 32-bit Integer as the first field in another, you can assign a value to the Real field and then read back the first 32 bits of it as the value of the Integer field (passing it, say, to a function that requires integer parameters).. Records (advanced) In addition to the traditional record types, the Delphi language allows more complex and "class-like" record types. In addition to fields, records may have properties and methods (including constructors), class properties, class methods, class fields, and nested types. For more information on these subjects, see the documentation on Classes and Objects. Here is a sample record type definition with some "class-like" functionality. type TMyRecord = record type TInnerColorType = Integer; var Red: Integer; class var Blue: Integer; procedure printRed(); constructor Create(val: Integer); property RedProperty: TInnerColorType read Red write Red; class property BlueProp: TInnerColorType read Blue write Blue; end; constructor TMyRecord.Create(val: Integer); begin Red := val; end; procedure TMyRecord.printRed; begin Writeln('Red: ', Red); end;. Though records can now share much of the functionality of classes, there are some important differences between classes and records..

<span class='text_page_counter'>(53)</span>   .  .   . Records do not support inheritance. Records can contain variant parts; classes cannot. Records are value types, so they are copied on assignment, passed by value, and allocated on the stack unless they are declared globally or explicitly allocated using the New and Dispose function. Classes are reference types, so they are not copied on assignment, they are passed by reference, and they are allocated on the heap. Records allow operator overloading on the Win32 platform; classes, however, do not allow operator overloading. Records are constructed automatically, using a default no-argument constructor, but classes must be explicitly constructed. Because records have a default no-argument constructor, any user-defined record constructor must have one or more parameters. Record types cannot have destructors. Virtual methods (those specified with the virtual, dynamic, and message keywords) cannot be used in record types. Unlike classes, record types on the Win32 platform cannot implement interfaces.. File Types (Win32) File types, as available on the Win32 platform, are sequences of elements of the same type. Standard I/O routines use the predefined TextFile or Text type, which represents a file containing characters organized into lines. For more information about file input and output, see Standard Routines and Input-Output under the "File Input and Output" section. To declare a file type, use the syntax: type fileTypeName = file of type. where fileTypeName is any valid identifier and type is a fixed-size type. Pointer types - whether implicit or explicit - are not allowed, so a file cannot contain dynamic arrays, long strings, classes, objects, pointers, variants, other files, or structured types that contain any of these. For example: type PhoneEntry = record FirstName, LastName: string[20]; PhoneNumber: string[15]; Listed: Boolean; end; PhoneList = file of PhoneEntry;. declares a file type for recording names and telephone numbers. You can also use the file of ... construction directly in a variable declaration. For example, var List1: file of PhoneEntry;. The word file by itself indicates an untyped file: var DataFile: file;. For more information, see "Untyped Files" in Standard Routines and Input-Output. Files are not allowed in arrays or records..

<span class='text_page_counter'>(54)</span> 5. các hàm-thủ tục thường dùng cho các kiểu dữ liệu đơn giản. Tên hàm. Tham số. Kết quả trả về. Chú ý. Ord. Biểu thức có thứ tự (vd: biểu thức Không dùng cho tham số kiểu Giá trị của biểu thức thứ tự số, kí tự, logic) Int64. Pred. Biểu thức có thứ tự (vd: biểu thức Giá trị kế trước của kết số, kí tự, logic) quả biểu thức. Succ. Biểu thức có thứ tự (vd: biểu thức Giá trị kế sau của kết quả số, kí tự, logic) biểu thức. High. Tên biến có kiểu thứ tự hoặc tên kiểu thứ tự. Giá trị cao nhất trong kiểu Có thể dùng cho kiểu shortđó string và arrays. Low. Tên biến có kiểu thứ tự hoặc tên kiểu thứ tự. Giá trị thấp nhất trong kiểu Có thể dùng cho kiểu shortđó string và arrays. Đối với kiểu byte. Vd: High(Byte) trả kết quả là 255, đó là giá trị lớn nhất của kiểu byte. Vd: succ(2) trả kết quả là 3, vì 3 là giá trị kế tiếp của 2. Hàm inc(biến) tăng giá trị của biến lên 1, tương đương biến:=biến+1; Hàm dec(biến) giảm giá trị của biến đi 1, tương đương biến:=biến-1; Đối với kiểu logic Giá trị của kiểu boolean là hai hằng true và false, đã được định nghĩa sẵn, có quan hệ như sau: Boolean False < True Ord(False) = 0 Ord(True) = 1 Succ(False) = True Pred(True) = False. A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True. Đối với kiểu kí tự: A string constant of length 1, such as 'A', can denote a character value. The predefined function Chr returns the character value for any integer in the range of WideChar; for example, Chr(65) returns the letter A. AnsiChar and WideChar values, like integers, wrap around when decremented or incremented past the beginning or end of their range (unless range-checking is enabled). For example, after execution of the code:.

<span class='text_page_counter'>(55)</span> var Letter: AnsiChar; I: Integer; begin Letter := High(Letter); for I := 1 to 66 do Inc(Letter); end; Letter. has the value A (ASCII 65).. Mẹo chuyển văn bản word thành tệp txt, vẫn còn dấu tiếng Việt: Cách chuyển nội dung chữ từ file word thành file txt mà đối tượng tMemo có thể đọc nội dung mà vẫn đúng dấu tiếng VIệt: B1. Mở file word gốc. B2. ấn tổ hợp phím ctrl _ A, ctrl _ c B3. Mở chương trình notePad, ấn tổ hợp phím ctrl _ v B4. Lưu với định dạng unicode.. Đối tượng TMeMo Thuộc tính Lines chứa các dòng dữ liệu trong đối tượng tmemo. Dòng đầu tiên có số thứ tự là 0. Dòng kế tiếp là 1 và cứ thế tăng thêm 1. Ví dụ: Tạo chương trình có thể đọc nội dung của tệp (định dạng *.txt) từ ổ đĩa c:, và hiện nội dung tệp lên đối tượng tmemo, sửa nội dung và lưu lại tệp đó. Phân tích Thiết kế: Giao diện:. Thuật toán (cách giải).

<span class='text_page_counter'>(56)</span> TStringHelper làm việc với xâu trong PC và Mobile Giới thiệu: -TStringHelper là kiểu dữ liệu, nằm trong thư viện System.SysUtils. -TStringHelper cung cấp các hàm, các thuộc tính để làm việc với tất cả loại xâu (1-based trên pc và 0-based strings trên mobile). So sánh chỉ số đầu của xâu Delphi Compilers. Chỉ số trong xâu. Delphi mobile compilers DCCIOSARM DCCIOS32. 0-based (kí tự đầu tiên của xâu có chỉ số là 0)..

<span class='text_page_counter'>(57)</span> Delphi desktop compilers DCC32 DCC64. 1-based (kí tự đầu tiên của xâu có chỉ số là 1).. DCCOSX Bạn nên có thói quen dùng phương thức, thuộc tính của TStringHelper để viết lệnh, vì điều này phù hợp với nhiều trình biên dịch cho cả di động và máy tính cá nhân. Ví dụ: So sánh cách dùng hàm system.pos và hàm tStringHelper.IndexOf Yêu cầu: tìm vị trí của chữ ‘á’ trong xâu 'chào các bạn'. Phân tích: Đề bài yêu cầu tìm xâu ‘á’ trong xâu ‘chào các bạn’ vì cả hai xâu này đều cố định (không cần người dùng nhập xâu mới) nên ta không cần thiết kế ô nhập xâu (ô edit). Chỉ cần dùng showmessage để thông báo vị trí tìm gặp thôi. Thiết kế màn hình giao tiếp (giao diện):. Thiết kế lệnh (viết lệnh): Ta nháy đôi vào form, viết lệnh vào thủ tục formCreate. Các lệnh tham khảo sau: procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:='chào các bạn'; showmessage('tìm chữ ''á'' trong xâu '''+s+''' bằng hàm pos: '+inttostr(pos('á',s))); showmessage('tìm chữ ''á'' trong xâu '''+s+''' bằng hàm indexOf: '+inttostr(s.IndexOf('á')));. end; kết quả: ta nhấn phím F9 để xem kết quả..

<span class='text_page_counter'>(58)</span> các phương thức trong TStringHelper (phần tóm tắt) System.SysUtils.TStringHelper Compare CompareOrdinal CompareText CompareTo Contains Copy CopyTo CountChar Create DeQuotedString EndsText. public Compares two 0-based strings for equality. CompareOrdinal compares two strings by evaluating the numeric values of public the corresponding characters in each string. public Compares two strings by their ordinal value, without case sensitivity. public Compares this 0-based string against a given string. public Returns whether this 0-based string contains the given string. public Copies and returns the 0-based given string. Copies memory allocated for several characters in the 0-based string to the public memory allocated for characters in another 0-based string. public CountChar counts the occurrences of the C character in the string. public public This method removes the quote characters from a string. public Returns whether the given 0-based string ends with the given 0-based.

<span class='text_page_counter'>(59)</span> EndsWith Equals Format GetHashCode. public public public public. IndexOf. public. IndexOfAny. public. substring. Returns whether this 0-based string ends with the given substring. Returns whether the two given 0-based strings are identical. Identical to Format function. Returns the hash code for this string. Returns an integer that specifies the position of the first occurrence of a character or a substring within this 0-based string, starting the search at StartIndex. This method returns -1 if the value is not found or StartIndex specifies an invalid value. Returns an integer indicating the position of the first given character found in the 0-based string.. IndexOfAnyUnquoted public Insert public Inserts a string in this 0-based string at the given position. Indicates whether a specified character in this 0-based string matches one of IsDelimiter public a set of delimiters. Returns whether this 0-based string is empty (does not contain any IsEmpty public characters). Is a static class function that returns whether the given string is empty or not IsNullOrEmpty public (does not contain any characters). Indicates if a specified string is empty or consists only of white-space IsNullOrWhiteSpace public characters. Joins two or more 0-based strings together separated by the given Join public Separator. Returns the string index in this 0-based string of the rightmost whole LastDelimiter public character that matches any character in Delims (except null = #0). LastIndexOf public Returns the last index of the Value string in the current 0-based string. Returns the last index of any character of the AnyOf character array, in the LastIndexOfAny public current 0-based string. LowerCase public Converts an ASCII string to lowercase. PadLeft public Left-aligns a 0-based string into a fixed length text space. PadRight public Right aligns this 0-based string into a fixed length text space. Parse converts Integer, Boolean and Extended types to their string Parse public representations. QuotedString doubles all the occurrences of a character and also adds it to QuotedString public the edges of the string. Removes the substring at the position StartIndex and optionally until the Remove public position StartIndex + Count, if specified, from this 0-based string. Replace public Replaces an old character or string with a new given character or string. Split public Splits this 0-based string into substrings, using the given Separator. StartsWith public Returns whether this 0-based string starts with the given string. Returns the substring starting at the position StartIndex and optionally Substring public ending at the position StartIndex + Length, if specified, from this 0based string. ToBoolean public Converts a string to a Boolean value. Transforms this 0-based string into a TArray<Char> (a character array) and ToCharArray public returns it. ToDouble public Converts a given string to a floating-point value. ToExtended public Converts a given string to a floating-point value. ToInt64 public Converts a string that represents an integer (decimal or hex notation) into a ToInteger public number. ToLower public Transforms this 0-based string into an all lowercase characters 0-based.

<span class='text_page_counter'>(60)</span> string and returns it. Transforms this 0-based string into an all-lowercase characters 0-based ToLowerInvariant public string and returns it. The conversion is done using the UTF-16 character representation, according to Unicode specification. ToSingle public Converts a given string to a floating-point value. Transforms this 0-based string into an all-uppercase characters 0-based ToUpper public string and returns it. Transforms this zero-based string into an all-uppercase characters zerobased string and returns it. The conversion is done using the UTF-16 ToUpperInvariant public character represe ntation, according to the Unicode specification. Trims leading and trailing spaces and Trim public control characters from this 0-based string. TrimEnd Trims the given trailing characters public (deprecated) from this 0-based string. Trims the given leading characters TrimLeft public from this 0-based string. Trims the given trailing characters TrimRight public from a 0-based string. TrimStart Trims the given leading characters public (deprecated) from this 0-based string. UpperCase public Converts an ASCII string to uppercase.. Các thuộc tính trong TstringHelper System.SysUtils.TStringHelper Properties Accesses individual characters in this zero-based string. The Chars property is read-only. Length Public Use Length in order to obtain the length of the zero-based string. Chars public. Phần chi tiết các hàm của TStringHelper Hàm compare:. Cú pháp: 1. String.Compare(const StrA: string; const StrB: string): Integer; overload; static; inline; (hàm này có phân biệt hoa và thường nghe bạn) 2. String.Compare(const StrA: string; const StrB: string; IgnoreCase: Boolean): Integer; overload; static; inline;. Hoạt động hàm compare: -so sánh hai xâu strA và strB -kết quả có thể là: <0 khi strA nhỏ hơn (ở trước) strB =0 khi strA giống strB >0 khi strA lớn hơn (ở sau) strB -Tham số IgnoreCase nhận một trong hai giá trị true/false, có ý nghĩa là phân biệt chữ hoa hay không. Tham số này có thể bỏ.. Ví dụ: Yêu cầu so sánh các xâu trong hai trường hợp có/không phân biệt chữ hoa..

<span class='text_page_counter'>(61)</span> Có phân biệt chữ hoa và thường: procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hai xâu có độ dài bằng nhau (đều là chữ thường): s1:='các bạn'; s2:='các bạn'; showmessage(inttostr(string.compare(s1,s2))); end;. ------------procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hai xâu có độ dài bằng nhau (có chữ hoa là Á): s1:='các bạn'; s2:='cÁc bạn'; showmessage(inttostr(string.compare(s1,s2))); end;. ------//hai xâu có độ dài bằng nhau (có chữ hoa là Á trong s2; s1 đổi các thành ccá): s1:='ccá bạn';.

<span class='text_page_counter'>(62)</span> s2:='cÁc bạn';. ---------//hai xâu có độ dài khác nhau (có chữ hoa là Á trong s2; s1 đổi các thành ccá): s1:='ccá bạn'; s2:='cÁc bạn, khỏe ...';. ---------------------------Có thêm tham số thứ ba: Nếu là true thì không phân biệt chữ hoa/thường. //hai xâu có độ dài bằng nhau: s1:='các bạn'; s2:='cÁc bạn'; showmessage(inttostr(string.compare(s1,s2,true)));. ---------------------------//hai xâu có độ dài khác nhau (có chữ hoa là Á trong s2): s1:='các bạn'; s2:='cÁc bạn, khỏe ...'; showmessage(inttostr(string.compare(s1,s2,true)));.

<span class='text_page_counter'>(63)</span> ------------------. Hàm CompareTo. Cú pháp: TênBiếnXâu.CompareTo(const strB: string): Integer;. Hoạt động: Có phân biệt chữ hoa/thường. So sánh xâu này với xâu strB. Kết quả trả về: =0 hai xâu giống nhau. <0 khi xâu này trước xâu strB. >0 khi xâu này sau xâu strB.. Ví dụ: procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hàm compareto phân biệt chữ hoa/thường. s1:='chào bạn'; s2:='chào bạn'; showmessage( inttostr(s1.CompareTo(s2)) ); end;.

<span class='text_page_counter'>(64)</span> ---------------------procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hàm compareto phân biệt chữ hoa/thường. s1:='chào bạn'; s2:='cHào bạn'; //chữ chào thành cHào showmessage( inttostr(s1.CompareTo(s2)) ); end;. ---------------------procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hàm compareto phân biệt chữ hoa/thường. s1:='chÀo bạn'; //đổi chữ chào thành chÀo.

<span class='text_page_counter'>(65)</span> s2:='chào bạn'; showmessage( inttostr(s1.CompareTo(s2)) ); end;. ---------------------procedure TForm1.FormCreate(Sender: TObject); var s1,s2:string; begin //hàm compareto phân biệt chữ hoa/thường. s1:='chào bạn'; s2:='choà bạn'; //đổi chữ chào thành choà showmessage( inttostr(s1.CompareTo(s2)) ); end;.

<span class='text_page_counter'>(66)</span> Hàm Copy. Cú pháp String.Copy(const Str: string): string;. Hoạt động Sao chép và trả lại nguyên xâu đó.. Ví dụ: procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:='kiểu dữ liệu TStringHelper'; showmessage( 'đây là xâu được sao chép lại: '+string.Copy(s)); end;. Hàm CountChar. Cú pháp TênBiếnXâu.CountChar(const C: Char): Integer;. Hoạt động Đếm số lượng kí tự chứa trong nội dung biến C có trong xâu này.. Ví dụ procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:='chào các bạn, đây là ví dụ về hàm CountChar.'; showmessage( 'số lượng kí tự ''à'' là: '+inttostr(s.CountChar('à'))); end;.

<span class='text_page_counter'>(67)</span> Hàm IndexOf. Cú pháp 1. TênBiếnXâu.IndexOf(const st: string): Integer; 2. TênBiếnXâu.IndexOf(const st: string; StartIndex: Integer): Integer; 3. TênBiếnXâu.IndexOf(const st: string; StartIndex: Integer; Count: Integer): Integer;. Hoạt động Tìm vị trí đầu tiên của xâu st trong xâu này, với vị trí bắt đầu (nếu có) là startIndex, trong phạm vi bao nhiêu kí tự (nếu có) là count. Trả về -1 khi tìm không thấy hoặc khi giá trị bắt đầu StartIndex không hợp lệ.. Ví dụ: -Bạn tạo một ứng dụng mới, nháy đôi vào form, gõ các lệnh sau vào thủ tục formCreate, rồi nhấn phím F9 để xem lần lượt các kết quả. -Nội dung các lệnh: procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:='chào các bạn.'; //kí tự đầu tiên có vị trí là 0 //ví dụ cho cú pháp số 1. //lưu ý có phân biệt dấu tiếng Việt: showmessage('vị trí của ''a'' là: '+inttostr(s.IndexOf('a' ) )); showmessage('vị trí của ''á'' là: '+inttostr(s.IndexOf('á' ) )); //ví dụ cho cú pháp số 2. showmessage('vị trí của ''c'' là: '+inttostr(s.IndexOf('c' ) )); showmessage('vị trí của ''c'', bắt đầu tìm từ vị trí 3 (từ chữ o) là: '+inttostr(s.IndexOf('c', 3 ) )); //ví dụ cho cú pháp số 3 showmessage('vị trí của ''c'', bắt đầu tìm từ vị trí 3 (từ chữ o), phạm vi tìm là 2 kí tự, là: '+inttostr(s.IndexOf('c', 3,2 ) )); showmessage('vị trí của ''c'', bắt đầu tìm từ vị trí 3 (từ chữ o), phạm vi tìm là 4 kí tự, là: '+inttostr(s.IndexOf('c', 3,4 ) )); end;.

<span class='text_page_counter'>(68)</span> các kết quả:.

<span class='text_page_counter'>(69)</span> Hàm Insert. Cú pháp TênBiếnXâu.Insert(StartIndex: Integer; const Value: string): string;. Hoạt động Chèn thêm xâu value vào xâu TênBiênXâu từ vị trí startindex.. Ví dụ Yêu cầu: chèn thêm xâu ‘các’ vào xâu ‘chào bạn’ để có kết quả là ‘chào các bạn’ Phân tích: ở đây ta dùng hàm của thư viện tStringHelper nên kí tự đầu tiên có số thứ tự là 0, nên vị trí bắt đầu chèn là 5. Thao tác: Tạo ứng dụng mới trong delphi. Nháy đôi vào form và chèn thêm các lệnh để có thủ tục như sau: procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:='chào bạn'; //kí tự đầu tiên có số thứ tự là 0 showmessage('chèn xâu: ''các'' vào xâu '''+s+''' từ vị trí 5 là: '+s.Insert(5,'các ')); end; chương trình và kết quả như hình dưới:. Hàm IsEmpty. Cú pháp: TênBiênString.IsEmpty: Boolean;. Hoạt động: trả về kết quả là true/false (-1/0).

<span class='text_page_counter'>(70)</span> True (-1): khi xâu đó là rỗng (nghĩa là không có bất kì kí tự nào) False (0): khi xâu đó có ít nhất một kí tự nào đó.. Ví dụ: Yêu cầu: hãy cho biết biến xâu s có chứa kí tự nào không? Phân tích: nếu xâu s không chứa kí tự nào cả thì đó là xâu rỗng nên ta dùng hàm isEmty. Chương trình: procedure TForm1.FormCreate(Sender: TObject); var s:string; begin s:=''; //s là xâu rỗng showmessage('kết quả của hàm isEmty là: '+booltostr(s.IsEmpty)); s:=' chào bạn'; //s là xâu không rỗng (chứa ít nhất một kí tự nào đó. showmessage('kết quả của hàm isEmty là: '+booltostr(s.IsEmpty)); end; kết quả của chạy chương trình:. Hàm Join. Cú pháp 1. TênBiênXâu.Join(const Separator: string; const Values: array of const): string; 2. TênBiênXâu.Join(const Separator: string; const Values: array of string): string; 3. TênBiênXâu.Join(const Separator: string; const Values: array of string; BắtĐầu:integer; SốLượng:integer): string; Giải thích:.

<span class='text_page_counter'>(71)</span> Separator là xâu dùng để phân cách các xâu cần nối lại. Values là danh sách các xâu cần ghép lại, được thể hiện theo cách: Cách 1. Là hằng mãng một chiều có dạng [xâu0, xâu1, xâu2,…,xâuN]. Cách 2. Là biến mãng một chiều, với kiểu phần tử là kiểu string, chỉ số đầu có thể khác số 0. BắtĐầu là vị trí bắt đầu trong danh sách các xâu cần ghép. SốLượng là số lượng xâu sẽ được lấy ra trong danh sách các xâu.. Hoạt động Dùng xâu separator để phân cách các xâu được ghép lại. Nếu có tham số bắtđầu và sốlượng thì lấy ra ‘số lượng’ phần tử trong danh sách với vị trí từ ‘bắt đầu’ tính sang phải. Nếu không có tham số bắtđầu và sốlượng thì lấy hết tất cả phần tử trong danh sách.. Ví dụ Yêu cầu: Minh hoạt cách hoạt động và cách sử dụng ba cú pháp của hàm Join. Phân tích: Cả ba cú pháp của hàm Join đều có chung chức năng là ghép nhiều xâu riêng biệt (xâu con) thành xâu mới, có sử dụng ‘xâu phân cách’ giữa các xâu riêng. Khác nhau ở chổ: cú pháp 1, các xâu riêng biệt được liệt kê trực tiếp. cú pháp 2, các xâu riêng biệt chứa trong biến mảng. cú pháp 3, có thêm tham số bắt đầu cho biết vị trí đầu tiên của xâu con được chọn, và số lượng xâu con từ vị trí đó được lấy ra. Chương trình: procedure TForm1.FormCreate(Sender: TObject); var s:string; a:array[0..5]of string; //chỉ số đầu là 0, ta có thể đổi số khác, vd: 1 begin s:=' chào: '; s:=s.Join('/',['các','bạn',s]); //s.Join ta có thể thay bằng string.join vẫn đúng. //['các','bạn',s] ý nghĩa là mãng có ba phần tử, phần tử đầu có số thứ tự là 0 //nối 3 xâu 'các','bạn',s với kí tự phân cách là '/' thành 1 xâu và gán vào s. showmessage('1. kết quả của hàm Join là: '+ s); s:=s.join('/',['các','bạn',s],0,2); //'/' là kí tự dùng để phân cách các phần tử khi nối lại. //['các','bạn',s] là mãng có ba phần tử, với STT là 0 1 2..

<span class='text_page_counter'>(72)</span> //,0,2 có ý nghĩa: từ phần tử 0, lấy ra 2 phần tử để nối lại thành xâu. showmessage('2. kết quả của hàm Join là: '+ s); s:=s.Join('; ',a); //lưu ý lúc này mảng xâu a có 6 phần tử, đều chứa xâu rỗng. //dùng kí tự '; ' để nối tất cả phần tử của mảng xâu a thành xâu mới. showmessage('3. kết quả của hàm Join là: '+ s); a[0]:='thứ nhất';//gán giá trị cho phần tử đầu tiên mảng a. a[1]:='thứ hai'; //gán giá trị cho phần tử thứ nhì của mảng a. s:=s.Join('; ',a);//nối tất cả phần tử của mảng xâu a. showmessage('4. kết quả của hàm Join là: '+ s); s:=s.Join('; ',a,0,3);//trong mảng xâu a, chỉ nối 3 phần tử có STT là 0 1 2 showmessage('5. kết quả của hàm Join là: '+ s);end; Kết quả:.

<span class='text_page_counter'>(73)</span> Parse Remove Replace Substring Trim.   . Help Feedback Copyright (C) 2015 Embarcadero Technologies, Inc. All Rights Reserved. Current Wiki Page. Show: Delphi Display Preferences. C++. System.SysUtils.TStringHelper Fields From RAD Studio API Documentation  Up to Parent: TStringHelper. Inherited Protected Empty public Empty: string = ;.   . Help Feedback Copyright (C) 2015 Embarcadero Technologies, Inc. All Rights Reserved. Current Wiki Page. Delphi RTL Function (1-based). TStringHelper Function (0-based)*.

<span class='text_page_counter'>(74)</span> System.Pos System.Delete System.Copy System.SysUtils.Trim. TStringHelper.IndexOf TStringHelper.Remove TStringHelper.Substring TStringHelper.Trim. Chars is a useful property of TStringHelper: Chars[Index]. Example of using the Chars property to access individual characters: function Trim(const S: string): string; var I, L: Integer; begin L := S.Length - 1; I := 0; if (L > -1) and (S.Chars[I] > ' ') and (S.Chars[L] > ' ') then Exit(S); while (I <= L) and (S.Chars[I] <= ' ') do Inc(I); if I > L then Exit(''); while S.Chars[L] <= ' ' do Dec(L); Result := S.SubString(I, L - I + 1); end;. Using System.Low and System.High to Access the First and Last Index of a String You can use the Delphi intrinsic routines High and Low applied to strings.  . Low(s) returns 0 in our 0-based string scenario, but returns 1 for an 1-based string. High(s) returns Length(s) - 1 in our 0-based string scenario, but returns Length(s). for a 1-. based string. To detect the first index of a string, use: Low(string). For example, you can replace this commonly used for statement: for I := 1 to Length(S) do. with this for statement: for I := Low(S) to High(S) do. For another example, when s = '' (empty):  . Low(s) Low(s). = 0 and High(s) = -1 for 0-based strings. = -1 and High(s) = 0 for 1-based strings.. Replacing the System.Pos Function with TStringHelper.IndexOf The System.Pos function works with 1-based strings and not with 0-based strings. Instead of Pos, you can use TStringHelper.IndexOf. The IndexOf function returns the zero-based index position of the Value parameter (either a Char or a string) if that string is found, or -1 if it is not found. Example:.

<span class='text_page_counter'>(75)</span> s := 'The quick brown fox jumps over the lazy dog'; // s is a string type variable. WriteLn(Pos('ow', s)); // 13 WriteLn(s.IndexOf('ow')); // 12. Note: The TStringHelper.IndexOf function is similar to the .NET implementation, except that if the Value string is empty, .NET returns 0, but the Delphi RTL returns -1.. Replacing the System.Copy Function with TStringHelper.Substring The System.Copy function works with 1-based strings but not with 0-based strings. Instead of Copy, you can use TStringHelper.Substring: function TStringHelper.Substring(StartIndex: Integer; Length: Integer): string;. The Substring function returns a string equivalent to the substring of length that begins at StartIndex in this instance. If StartIndex is larger or equal to the length of this instance, Substring returns an empty string. If Length is zero or a negative number, Substring returns an empty string. Example s := '123456789'; // s is string type variable. writeln( Copy(s, 2, 3) ); // 234 writeln( s.Substring(1, 3) ); // 234. Note: The TStringHelper.Substring function is similar to the .NET implementation, except that .NET raises an ArgumentOutOfRangeException exception if StartIndex plus Length indicates a position not within this instance, or if StartIndex or Length is less than zero. The Delphi RTL, on the other hand, does not raise any exception. For the above condition, Substring returns an empty string.. Example of Converting Strings from 1-based to 0-based Here is an example showing how to change a 1-based string to work in all platforms: function Trim(const S: string): string; var I, L: Integer; begin L := Length(S); I := 1; if (L > 0) and (S[I] > ' ') and (S[L] > ' ') then Exit(S); while (I <= L) and (S[I] <= ' ') do Inc(I); if I > L then Exit(''); while S[L] <= ' ' do Dec(L); Result := Copy(S, I, L - I + 1); end;. Using TStringHelper.Chars to Access Characters in a String Chars is a useful property of TStringHelper: Chars[Index]. This read-only property can access all characters of a string. Remember, strings are always 0-based for the Delphi mobile compilers..

<span class='text_page_counter'>(76)</span> Các nội dung khác mình đang viết tiếp, thông cảm nha…., mong các bạn ủng hộ, góp ý về địa chỉ mail: và giúp đỡ về kiến thức cũng như kinh nghiệm..

<span class='text_page_counter'>(77)</span>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×