Tổng quan về VCL
Nắm được các khái niệm sơ lược trong lập trình sử dụng các VCL Controls
Nắm được các khái niệm sơ lược trong lập trình sử dụng các VCL Controls
VCL là viết tắt của Visual Component Library, bộ thư viện thành phần trực quan. VCL dựa trên Windows API nên có giao diện giống với các ứng dụng thông thường của Windows như Controls Panel hay các công cụ khác.
VCL là bộ thư viện vẫn còn được sử dụng và nâng cấp liên tục hiện nay, với người mới làm quen với Delphi thì nên bắt đầu từ VCL.
Đầu tiên, khi bạn tạo một ứng dụng VCL (File > New > Windows VCL Application), một form mới được tạo ra và không có gì bên trong cả. Khi bạn muốn thêm những thành phần trực quan, ví dụ như nút lệnh, hay textbox, ... bạn chọn nó trong cửa sổ Palette, thả nó vào form và kéo, thay đổi kích cỡ tùy ý.
Những button, textbox, combobox, ... mà bạn đặt trên form gọi là các component.
Tuy nhiên, bạn sẽ thấy có một số component khi chạy chương trình có thể hiển thị được, như TButton hay TEdit, đó gọi là visual control (gọi tắt là control)
Còn những component như TTimer, TPopupMenu, ... không hiển thị tại thời gian chạy mà chỉ hiển thị khi thiết kế dưới dạng các ô vuông thì gọi nó là non-visual control (hoặc dùng chung từ component).
Khi một control A chứa controls B, ta gọi A là parent của B. Khi ấy, thuộc tính B.Parent được đặt là A.
Bạn có thể sử dụng cửa sổ Structure để xem quan hệ giữa các controls dưới dạng cây, với các nhánh con, nhánh cha, ...
Trong VCL, khi một controls là con của một control khác, nó không được phép vượt ra ngoài giới hạn của parent control.
Lưu ý: Parent không chịu trách nhiệm phá hủy control con khi nó bị hủy. Sử dụng thuộc tính Owner để xác định chủ sở hữu.
Owner mới có trách nhiệm phá hủy control mà nó quản lý khi nó bị phá.
Hãy cùng xem qua đoạn mã dưới đây về việc tạo động các control
var Button1 := TButton.Create(Panel1);
with Button1 do
begin
Button1.Parent := Panel2;
end;
Đó là cách tạo một control tại thời gian chạy (runtime) mà không cần thiết kế, gọi là tạo động.
Chú ý đến phương thức Create có một tham số để xác định Owner. Hầu hết các component đều xác định Owner bằng phương thức này. Dưới đây là triển khai của phương thức Create.
constructor Create(aOwner: TComponent);
Nếu như bạn không muốn xác định Owner cho control, sử dụng nil làm tham số của Create. Điều đó có nghĩa bạn phải tự mình giải phóng bộ nhớ cho control của bạn thủ công.
Mọi component trong Delphi đều là class. Và tên của class bắt đầu bằng chữ cái T. Ví dụ TButton, TLabel, TListBox, ...
Mà class thì đều có các property (thuộc tính). Mỗi thuộc tính xác định một tính chất của class. Do vậy, các component đều có những thuộc tính. Có thể sử dụng cửa sổ Object Inspector để xem và chỉnh sửa một số thuộc tính được cấp quyền published. Các thuộc tính khác đều được ẩn đi để đảm bảo an toàn.
Các control khác nhau có những thuộc tính đặc trưng. Ví dụ TLabel dùng để hiển thị dòng chữ nên sẽ có thuộc tính Caption. TButton cũng phải có dòng chữ trên nút nên cũng có thuộc tính Caption ...
Event (sự kiện) là những gì xảy ra khi bạn thao tác với control. Ví dụ sự kiệ n OnClick khi bạn click vào control, OnChange khi nội dung TEdit thay đổi, OnDblClick là khi bạn nhấn đúp vào control, ...
Các control đều có những event mặc định, đó là những event được tạo ra khi bạn nhấn đúp vào control khi thiết kế. Những event khác bạn có thể truy cập và chỉnh sửa thông qua Object Inspector, tab Event.
Dưới đây là một đoạn mã event OnClick của Button1
procedure TForm1.Button1Click(Sender: TObject);
begin
// Do some thing
end;
Bạn có thể đặt một số mã của mình vào khoảng trống giữa begin end để thực hiện công việc nào đó khi xảy ra event.
Với hầu hết các event trong VCL đều có tham số Sender đi đầu. Sender là một biến kiểu TObject. Sender giúp xác định người gửi, và tại sao event lại được kích hoạt.
Các event được kích hoạt bằng hai cách:
Khi người dùng thao tác hoặc định kì lặp lại (TTimer)
Khi có control khác tự động gọi event
Cách thứ nhất, sender chính là control đó. Lấy ví dụ về ButtonClick ở trên thì khi click vào button, sender sẽ là Button1.
Cách thứ hai, khi bạn muốn tự động click vào Button1 sau khi nhấn Button2.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Button1 clicked');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('Button2 clicked');
Button1Click(nil);
end;
Gọi Button1Click với tham số là một control. Nếu bạn không muốn cho Button1 biết đâu là tham số thì sử dụng nil.
Ý nghĩa: Cho phép các control giống nhau sử dụng chung event. Ví dụ, bạn muốn làm một ứng dụng máy tính cầm tay với 10 nút tượng trưng cho 10 chữ số. Bạn không thể sử dụng 10 sự kiện giống nhau được. Do đó, bạn nên làm như sau:
Tạo một Button1, tạo sự kiện Click cho nó.
Sau đó chọn vào Button1, Ctrl + C để copy nó và Ctrl + V paste 9 lần lên form
Khi đó, 10 Button đều chia sẻ với nhau chung 1 event
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage((Sender as TButton).Caption);
end;
Chạy thử, bạn sẽ nhận được kết quả khác nhau khi nhấn vào các nút khác nhau. Đó là do Sender tự động xác định khi bạn nhấn. Nhấn vào nút 1 thì sender là button1, nút 2 thì sender là Button2.
Vì sender là kiểu TObject nên bạn không thể sử dụng thuộc tính Caption trực tiếp được. Thay vào đó, sử dụng từ khóa as để xác định nó là kiểu TButton như ví dụ trên.