Thư viện (unit) trong Delphi là một tập hợp các biến, hằng, câu lệnh, lớp, ... được xây dựng sẵn hoặc có thể do người sử dụng tự viết, mục đích là để chia nhỏ chương trình lớn thành các phần nhỏ hơn, có thể sử dụng lại trong nhiều chương trình khác.
Trong mọi chương trình, dù đơn giản hay phức tạp, đều có dòng khai báo sử dụng thư viện
uses
Crt, System.SysUtils, Winapi.Windows;
Như trên có ba thư viện được thêm vào chương trình nhờ từ khóa uses
là Crt, System.SysUtils và Winapi.Windows.
Mã nguồn unit được lưu trong file .pas. Sau khi biên dịch unit sẽ tạo ra một file .dcu. Nếu một unit không được tìm thấy, bạn cần bỏ file .dcu trên vào thư mục hiện tại, hoặc là file .pas nếu bạn là chủ sở hữu unit đó.
Delphi cung cấp rất nhiều thư viện có sẵn được xây dựng trong các unit, có thể dễ dàng thêm vào chương trình. Khi cần sử dụng một lệnh nào đó, bạn cần biết nó được chứa trong unit nào và thêm unit đó vào để chương trình có thể tìm và sử dụng.
Tên unit được chia làm 2 loại: tên unit dài và tên unit ngắn. Ví dụ như unit System.SysUtils, ta có thể viết gọn thành SysUtils, nhưng mình vẫn khuyên sử dụng tên dài với dấu chấm hơn vì nó rõ ràng và dễ phân biệt.
Một số unit cơ bản và quan trọng:
Các unit cơ bản trên có thể sử dụng cho bất kì loại chương trình nào, Delphi gộp nó lại vào RTL (Runtime Library). Ngoài ra còn có bộ framework VCL (Visual Component Library) để tạo chương trình đồ họa với Windows, hoặc FMX (FireMonkey) để đồ họa trên các nền tảng khác như Android, iOS, ...
Các unit thuộc framework VCL hay FMX có tiền tố VCL và FMX ở đầu. Ví dụ như
uses
VCL.Graphics, VCL.Forms;
Lưu ý, một chương trình không thể có chung VCL và FMX, chỉ một trong hai.
uses
FMX.Graphics, FMX.Forms;
Một unit cơ bản gồm ba phần:
unit NewUnit;
Lưu ý chỉ khai báo một unit thôi nhé.Tiếp theo, chúng ta sẽ tạo một unit cơ bản, gồm một thủ tục vẽ hình chữ nhật và một hàm kiểm tra số chẵn hay lẻ.
unit NewUnit;
interface
uses
System.SysUtils;
procedure VeHCN(Dai, Rong: Integer);
function SoChan(So: Integer): boolean;
implementation
procedure VeHCN(Dai, Rong: Integer);
var
i, j: Integer;
begin
for i := 1 to Rong do
begin
for j := 1 to Dai do
Write('*');
WriteLn;
end;
end;
function SoChan(So: Integer): boolean;
begin
if So mod 2 = 0 then
Result := true
else
Result := false;
end;
end.
Ở đây có vài điều cần lưu ý:
Unit không chỉ có 3 phần (tên unit, interface và implementation) như trên, cấu trúc đầy đủ của một unit có dạng
unit Tên_unit;
interface
...
implementation
...
initialization
...
finalization
...
end.
Như trên, unit đầy đủ có thêm hai phần initialization và finalization. Nhưng hai phần này ít được sử dụng trong thực tế.
1. Initialization
Phần này dùng để thực hiện các câu lệnh khi unit được nạp, chương trình bắt đầu chạy.
Thường dùng để khởi tạo các biến và class dùng chung trong toàn bộ unit.
2. Finalization
Khi unit được dừng, chương trình dừng. Các lệnh trong phần này có tác dụng giải phóng các class đã sử dụng xong.