• Thứ Hai, 12/01/2004 10:01 (GMT+7)

    Thủ thuật trong VB6

    Đánh Số Dòng Lệnh Trong Chương Trình
    Điều này thoạt nghe có vẻ rất kỳ cục và lẩm cẩm, chẳng lẽ chúng ta quay lại thời kỳ của QBasic ư? Trong các bản  Basic cổ xưa, số dòng là điều bắt buộc và được dùng làm địa chỉ cho các lệnh GoTo – chẳng hạn như GoTo 2000.  Tất nhiên là ngày nay mọi việc đã khác, các địa chỉ được đặt tên cho dễ nhớ (điều quan trọng hơn là kỷ luật lập trình yêu cầu tránh các lệnh GoTo và thay thế chúng bằng các lệnh gọi thủ tục). Số dòng dường như chỉ tồn tại để đảm bảo tính tương thích ngược với các phiên bản cổ xưa của Basic. Nhưng không hoàn toàn như vậy. Erl – một biến toàn cục không công bố trong Visual Basic 4, 5 và 6 sẽ cho bạn số của dòng xảy ra lỗi. Trong trường hợp bạn không đánh số các dòng lệnh, Erl sẽ luôn là 0.
    Bạn đã thấy hấp dẫn chưa? Chỉ cần đánh số các dòng lệnh rồi dùng Erl trong phần bắt lỗi,  và việc debug chương trình nhẹ đi biết bao nhiêu. Nhưng ngồi đánh số từng dòng lệnh cho những chương trình lớn thì đến bao giờ mới xong! Các bạn hãy vào địa chỉ dưới đây để tải về một công cụ đánh số dòng miễn phí (và cứ lập trình thoải mái như bình thường):

    http://www.themandelbrotset.com/html/downloads.html

    Dùng Enum Để Truy Cập Các Phần Tử Của Mảng Control Dễ Dàng Hơn
    Rất nhiều ứng dụng VB6 dùng các mảng control để tiết kiệm tài nguyên. Tuy vậy, việc phải nhớ chỉ số mảng nào liên quan tới control nào lại gây trở ngại không nhỏ cho người lập trình. Dưới đây là cách làm giúp cho công việc của chúng ta nhẹ nhàng hơn.
    Chẳng hạn như bạn có một form với một mảng control gồm 3 textbox với chỉ số lần lượt là 0, 1, 2. Cách làm phổ biến để truy cập tới các phần tử đó là:

    txtArray(0).Text = “Nguyễn Anh”
    txtArray(1).Text = “Tuấn”
    txtArray(2).Text = “124 Vương Thừa Vũ”

    Cách làm này buộc bạn phải nhớ textbox số 0 tương ứng với họ đệm, số 1 tương ứng với tên, ... Để đơn giản hoá công việc, chúng ta sẽ tạo enum cho các giá trị tương ứng với từng chỉ số.

    Private Enum TextBoxIndex
        txtLastName = 0
        txtFirstName = 1
        txtAddress = 2
    End Enum

    Sau đó, tạo một property procedure trả về textbox tương ứng với tham số enum.

    Private Property Get TextBoxItem(ByVal Index As TextBoxIndex) As TextBox
        Set TextBoxItem = txtArray(Index)
    End Property

    Từ giờ trở đi, công việc trở nên rất nhẹ nhàng:

    TextBoxItem(txtLastname).Text = “Nguyễn Anh”
    TextBoxItem(txtFirstName).Text = “Tuấn”
    TextBoxItem(txtAddress).Text = “124 Vương Thừa Vũ”
    Cách làm trên có hai cái lợi. Chương trình trở nên dễ hiểu hơn nhiều và chúng ta còn có thể tận dụng tính năng Intellisense để biết được có những textbox nào.

    Phát Hiện Và Phản Ứng Khi Độ Phân Giải Màn Hình Thay Đổi
    Với các ứng dụng chạy ở chế độ toàn màn hình, việc phát hiện và phản ứng khi độ phân giải màn hình thay đổi là rất quan trọng. Tính năng này có thể được thực hiện bằng cách sử dụng Microsoft SysInfo control. SysInfo control cung cấp thông tin về các thiết lập hệ thống và tạo ra các sự kiện (event) khi các thiết lập thay đổi.
    Bạn có thể kiểm tra thông tin về độ phân giải màn hình bằng đoạn lệnh sau:

    Debug.Print “Height : “ & SysInfo1.WorkAreaHeight
    Debug.Print “Width : “ & SysInfo1.WorkAreaWidth
    Debug.Print “Top : “ & SysInfo1.WorkAreaTop
    Debug.Print “Left : “ & SysInfo1.WorkAreaLeft

    Để nhận biết và phản ứng khi độ phân giải màn hình thay đổi, hãy thêm lệnh vào sự kiện DisplayChanged. Ví dụ như đoạn mã sau thay đổi kích thước form để phủ kín toàn màn hình:

    Private Sub SysInfo1_DisplayChanged()
        Me.Move SysInfo1.WorkAreaLeft, SysInfo1.WorkAreaTop, _
        SysInfo1.WorkAreaWidth, SysInfo1.WorkAreaHeight
    End Sub

    Ngoài thông tin về độ phân giải màn hình, SysInfo còn cung cấp thông tin về các thay đổi thiết bị, thiết lập sử dụng năng lượng và nhiều thiết lập khác. Các bạn có thể lập trình để ứng dụng phản ứng khi các thay đổi đó diễn ra (ví dụ như thay đổi thiết lập sử dụng năng lượng rất quan trọng với ứng dụng chạy trên laptop).

    Sử Dụng Filesystemobject Để Xử Lý Các Tệp Và Thư Mục
    Trong các ứng dụng, việc tìm kiếm và thao tác với tệp hay thư mục là các thao tác rất phổ biến. Ví dụ như tìm một tệp nào đó trên máy, lấy danh sách các tệp trong một thư mục nào đó hay kiểm tra sự tồn tại của một tệp, một thư mục. Cách làm đơn giản nhất là sử dụng FileSystemObject với một loạt các tính năng hữu ích của nó.
    FileSystemObject cho phép tạo, xử lý, xoá và thu thập thông tin về các ổ đĩa, thư mục và tệp. Trước khi dùng FileSystemObject, bạn phải khai báo như sau:

    Dim fso As New FileSystemObject

        Các kiểu đối tượng con của FileSystemObject liệt kê trong bảng 1.
        Các phương thức hay được dùng nhất của FileSystemObject liệt kê trong bảng 2.
        Khi sử dụng FileSystemObject, phải lưu ý một số hạn chế sau:
        • Cho phép tạo các tệp text ASCII hay Unicode.
        • Chỉ có thể đọc các tệp text ASCII.
        • Khi đọc các tệp, FileSystemObject chỉ có thể đọc theo một chiều và từng dòng một.
        • Một tệp không thể được mở để đọc và ghi đồng thời.
        • Khi tìm kiếm tệp, bạn không thể sử dụng các ký tự thay thế mà phải chỉ rõ tên.
        • Khi lấy tên tệp từ files collection, tên tệp không được sắp xếp; nếu cần, bạn phải tự làm.

    Chụp Màn Hình Trong Vb
    Việc chụp ảnh màn hình rất hữu ích trong nhiều trường hợp. Theo tôi biết, có hai cách để chụp ảnh màn hình trong VB. Cách thứ nhất sử dụng các Windows device context và các hàm API, thường được biết tới nhiều hơn mặc dù phức tạp hơn. Cách thứ hai đơn giản hơn nhưng lại ít người dùng –dùng tính năng chụp màn hình có sẵn của Window. Các bạn đều biết rằng nhấn phím [PrintScrn] sẽ chép toàn bộ màn hình vào clipboard, còn nhấn tổ hợp phím [Alt]+[PrintScrn] sẽ chép cửa sổ đang hoạt động. Như vậy, chương trình VB chỉ cần “nhấn phím” và chép lại từ clipboard.
    Tuy nhiên, lệnh SendKeys không giúp gì trong trường hợp này. Cái mà chúng ta cần chính là hàm  API  Keydb_Event. Hàm này tạo ra một cú nhấn phím và chính là hàm mà trình xử lý ngắt cứng của bàn phím gọi tới nên nó sẽ khiến cho ứng dụng (mà ở đây chính là Windows) nghĩ rằng có một phím được nhấn.
        Lệnh khai báo hàm như sau:

    Declare Sub keybd_event Lib “user32” (ByVal bVk As Byte, _
    ByVal bScan As Byte, ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long)

        Và với hằng số dưới đây, bạn đã có đủ công cụ trong tay:

    Const VK_SNAPSHOT As Byte = &H2C

        Để chụp ảnh cửa sổ đang hoạt động vào Clipboard, bạn dùng lệnh:

    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)

        Để chụp tòan bộ màn hình, bạn dùng lệnh:

    Call keybd_event(VK_SNAPSHOT, 1, 0, 0)

    Sau đó, bạn chỉ còn phải dùng phương thức GetData của Clipboard để lấy hình ảnh về dùng. Đoạn mã dưới đây chụp ảnh toàn bộ màn hình và hiển thị nó trong một PictureBox:

    Clipboard.Clear
    Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
    DoEvents
    Picture1.Picture = Clipboard.GetData(vbCFBitmap)

    Có hai điều cần lưu ý trong đoạn mã trên. Thứ nhất là dùng phương thức Clear của Clipboard trước khi “nhấn” phím [PrintScrn] để xoá dữ liệu có sẵn trong Clipboard. Thứ hai là gọi lệnh DoEvents trước khi lấy ảnh để Windows có thời gian xử lý lệnh Keybd_Event của bạn.

    Nguyễn Anh Tuấn
    nguyen_anh_tuan@yahoo.com

    ID: A0306_101