-
Kẻ khung với chiều cao linh hoạt trên Report
lehongduc > 29-09-19, 05:14 PM
Chào các Bạn,
Khi thiết kế Report trong Access chúng ta thường gặp trường hợp dữ liệu ở các cột có độ dài ngắn khác nhau, nên nếu ta cho đóng khung từng dòng mẫu tin ở phần Detail của Report sẽ xảy ra tình trạng khung cao khung thấp. Sau đây là 1 giải pháp để khắc phục trường hợp này:
1. Đây là ý tưởng:
- Ta viết code để mỗi khi in từng mẫu tin chi tiết trên phần Detail của Report ra, Access sẽ so sánh tất cả các ô dữ liệu để xác định ô nào có chiều cao lớn nhất, ta sẽ lấy chiều cao lớn nhất đó là làm thông số để vẽ ra khung có chiều cao bằng với chiều cao lớn nhất đó.
- Với VBA trong Access, để vẽ khung trên Report ta dùng method (phương thức) có tên là Line với cú pháp như sau:
Mã PHP:expression.Line (Step (x1, y1) - Step (x2, y2), Color, BF)
Ý nghĩa của từng tham số trong cú pháp trên như thế nào xin mời các Bạn tham khảo đoạn code minh họa bên dưới nhé.
2. Đoạn code để làm công việc nêu trên ta đặt trong procedure đáp ứng sự kiện Detail_Print
3. Có 1 chú ý: ta phải khai báo Property (thuộc tính) "Border Style" của tất cả các ô trong vùng Detail của Report là: Transparent
Nghĩa là làm mờ đường viền xung quanh của các ô (để ta sẽ vẽ được khung cao đều nhau bằng code VBA)
Mã:im ctl As Control, ctlName As String
Dim lngMaxHeight As Long 'Chieu cao nhat cua cac o du lieu
Dim intCtrl As Long, K As Long
Dim ArrayCtl(50) As String
intCtrl = 0
' Duyet qua tung o du lieu de lay chieu cao nhat (lngMaxHeight)
For Each ctl In Me.Controls
ctlName = ctl.Name
If Me.Controls(ctlName).Section = 0 And Me.Controls(ctlName).ControlType = acTextBox Then
If Me.Controls(ctlName).Height > lngMaxHeight Then
lngMaxHeight = Me.Controls(ctlName).Height
End If
intCtrl = intCtrl + 1
ArrayCtl(intCtrl) = ctlName
End If
Next ctl
'Ve khung bao voi chieu cao lngHeight da xac dinh o tren
For K = 1 To intCtrl
ctlName = ArrayCtl(K)
Set ctl = Me.Controls(ctlName)
Me.Line (ctl.Left, ctl.Top)-Step(ctl.Width, lngMaxHeight), , B
Next
Set ctl = Nothing