Cách sử dụng hộp kiểm trong DBGrid

0
18


Có nhiều cách và lý do để tùy chỉnh đầu ra của DBGrid trong Delphi . Một cách là thêm các hộp kiểm để làm cho kết quả hấp dẫn hơn về mặt hình ảnh.

Theo mặc định, nếu bạn có trường boolean trong tập dữ liệu của mình, DBGrid sẽ hiển thị chúng là “Đúng” hoặc “Sai” tùy thuộc vào giá trị của trường dữ liệu. Tuy nhiên, sẽ tốt hơn nhiều nếu bạn chọn sử dụng điều khiển hộp kiểm “đúng” để cho phép chỉnh sửa các trường.

Tạo một ứng dụng mẫu

Bắt đầu một biểu mẫu mới trong Delphi và đặt TDBGrid, TADOTable và TADOConnection, TDataSource.

Giữ nguyên tất cả các tên thành phần khi chúng được đặt lần đầu trên biểu mẫu (DBGrid1, ADOQuery1, AdoTable1, v.v.). Sử dụng Trình kiểm tra đối tượng để đặt thuộc tính Chuỗi kết nối của thành phần ADOConnection1 (TADOConnection) để trỏ đến cơ sở dữ liệu MS Access mẫu QuickiesContest.mdb.

Kết nối DBGrid1 với DataSource1, DataSource1 với ADOTable1 và cuối cùng là ADOTable1 với ADOConnection1. Thuộc tính ADOTable1 TableName phải trỏ đến bảng bài viết (để DBGrid hiển thị các bản ghi bảng bài viết).

Nếu bạn đã đặt tất cả các thuộc tính một cách chính xác, thì khi bạn chạy ứng dụng (vì thuộc tính Active của thành phần ADOTable1 là True), theo mặc định, DBGrid hiển thị giá trị của trường boolean là “True” hoặc “False” tùy thuộc vào trên giá trị của trường dữ liệu.

Hộp kiểm trong DBGrid

Để hiển thị một hộp kiểm bên trong một ô của DBGrid, chúng ta phải có sẵn một hộp kiểm khi chạy.

Chọn trang “Kiểm soát dữ liệu” trong bảng thành phần và chọn hộp kiểm TDB . Đặt một cái ở bất kỳ đâu trên biểu mẫu, không quan trọng ở đâu, vì hầu hết thời gian nó sẽ ẩn hoặc nổi trên lưới.

Mẹo: TDBCheckBox là một điều khiển nhận biết dữ liệu cho phép người dùng chọn hoặc bỏ chọn một giá trị duy nhất, phù hợp với các trường boolean.

Tiếp theo, đặt thuộc tính Hiển thị của nó thành Sai. Thay đổi thuộc tính Màu của DBCheckBox1 thành cùng màu với DBGrid (để màu hòa trộn với DBGrid) và xóa chú thích.

Điều quan trọng nhất là đảm bảo rằng DBCheckBox1 được kết nối với DataSource1 và với đúng trường.

Lưu ý rằng tất cả các giá trị thuộc tính DBCheckBox1 ở trên có thể được đặt trong sự kiện OnCreate của biểu mẫu như sau:

thủ tục TForm1.FormCreate(Người gửi: TObject); 
bắt đầu
DBCheckBox1.DataSource := DataSource1;
DBCheckBox1.DataField := 'Người chiến thắng';
DBCheckBox1.Visible := Sai;
DBCheckBox1.Color := DBGrid1.Color;
DBCheckBox1.Caption := '';

// giải thích sau trong bài viết
DBCheckBox1.ValueChecked := 'Có, người chiến thắng!';
DBCheckBox1.ValueUnChecked := 'Không phải lúc này.';
kết thúc ;

Điều gì đến tiếp theo là phần thú vị nhất. Khi chỉnh sửa trường boolean trong DBGrid, chúng ta cần đảm bảo rằng DBCheckBox1 được đặt ở trên (“float”) ô trong DBGrid hiển thị trường boolean.

Đối với các ô còn lại (không tập trung) chứa các trường boolean (trong cột “Win”), chúng ta cần cung cấp một số biểu diễn đồ họa của giá trị boolean (Đúng/Sai). Điều này có nghĩa là bạn cần ít nhất hai hình ảnh để vẽ: một cho trạng thái được chọn (giá trị thực) và một cho trạng thái không được chọn (giá trị sai).

Cách dễ nhất để đạt được điều này là sử dụng chức năng Windows API DrawFrameControl để vẽ trực tiếp trên canvas DBGrid.

Đây là mã trong trình xử lý sự kiện OnDrawColumnCell của DBGrid xảy ra khi lưới cần tô một ô.

thủ tục TForm1.DBGrid1DrawColumnCell( 
Người gửi: TObject; const Rect: TRect; DataCol:
Integer; Cột: TColumn; Trạng thái: TGridDrawState);

const IsChecked: [Boolean] mảng số nguyên = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK hoặc DFCS_CHECKED); var DrawState: Số nguyên; DrawRect: TRect; beginif (gdFocused in State) thenbeginif (Column.Field.FieldName = DBCheckBox1.DataField) thenbegin DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 2; DBCheckBox1.Top := Rect.Top + DBGrid1.top + 2; DBCheckBox1.Width := Rect.Right - Rect.Left;








DBCheckBox1.Height := Rect.Bottom - Rect.Top;
DBCheckBox1.Visible := True;
endendelsebeginif (Column.Field.FieldName = DBCheckBox1.DataField) then started
DrawRect:=Rect;
thổi phồngRect(DrawRect,-1,-1);
DrawState := ISChecked[Column.Field.AsBoolean];
DBGrid1.Canvas.FillRect(Rect);
DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect,
DFC_BUTTON, DrawState);
kết thúc ;
kết thúc ;
kết thúc ;

Để hoàn thành bước này, chúng ta cần đảm bảo rằng DBCheckBox1 ẩn khi chúng ta thoát khỏi ô:

thủ tục TForm1.DBGrid1ColExit(Người gửi: TObject); 
beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField rồi
DBCheckBox1.Visible := Kết
thúc sai ;

Chúng tôi chỉ cần thêm hai sự kiện để xử lý.

Lưu ý rằng khi ở chế độ chỉnh sửa, tất cả các lần nhấn phím đều chuyển đến ô DBGrid, chúng ta cần đảm bảo rằng chúng được gửi đến Hộp kiểm. Trong trường hợp CheckBox, chúng tôi chủ yếu quan tâm đến phím [Tab] và [Space]. [Tab] sẽ di chuyển tiêu điểm đầu vào sang ô tiếp theo và [Dấu cách] sẽ thay đổi trạng thái của Hộp kiểm.

thủ tục TForm1.DBGrid1KeyPress(Người gửi: TObject; var Key: Char); 
beginif (key = Chr(9)) rồi Thoát ;
nếu (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) thì khởi động
DBCheckBox1.SetFocus;
SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);
kết thúc ;
kết thúc ;

Tiêu đề hộp kiểm có thể thay đổi khi người dùng kiểm tra hoặc bỏ chọn hộp kiểm. Lưu ý rằng DBCheckBox có hai thuộc tính (ValueChecked và ValueUnChecked) được sử dụng để chỉ định giá trị của trường được đại diện bởi hộp kiểm khi nó được chọn hoặc bỏ chọn.

Thuộc tính ValueChecked này chứa “Có, người chiến thắng!” và ValueUnChecked bằng “Không phải lúc này”.

thủ tục TForm1.DBCheckBox1Click(Sender: TObject); 
bắt đầu nếu DBCheckBox1.Checked thì
DBCheckBox1.Caption := DBCheckBox1.ValueChecked
other
DBCheckBox1.Caption := DBCheckBox1.ValueUnChecked;
cuối cùng;

Chạy dự án và bạn sẽ thấy các hộp kiểm trên khắp cột của trường Người chiến thắng.