Xin cho biết nguyên nhân và cách để so sánh đúng.
2. Làm thế nào để chương trình có thể điều khiển được bàn phím, ví dụ khi nhấn chuột trên các nút lệnh của chương trình thì sẽ tương đương với việc nhấn các phím như NumLock, CapsLock, PrintScreen,... trên bàn phím.
3. Làm thế nào để chương trình luôn chạy thường trú trong Windows và luôn chờ đọc các ký tự từ bàn phím.
" />
  • Thứ Tư, 17/05/2006 09:06 (GMT+7)

    Lập trình tương tác với VB

    Câu hỏi :
    Tôi có một số câu hỏi về lập trình Visual Basic:
    1. Khi so sánh giá trị lấy từ TextBox (gõ từ bàn phím có dạng dd/mm/yyyy) với trường dữ liệu lấy từ CSDL Access có kiểu dữ liệu “short date” thì cho ra kết quả không đúng. Ví dụ câu lệnh:
    Select * from nhanvien where (ngayct >= #" & Format(T1.Text, "dd/mm/yyyy") & "#). Khi T1.text có giá trị 8/9/05, kết quả bao gồm các record có ngayct: 01/09/2005 -> 22/09/05
    Xin cho biết nguyên nhân và cách để so sánh đúng.
    2. Làm thế nào để chương trình có thể điều khiển được bàn phím, ví dụ khi nhấn chuột trên các nút lệnh của chương trình thì sẽ tương đương với việc nhấn các phím như NumLock, CapsLock, PrintScreen,... trên bàn phím.
    3. Làm thế nào để chương trình luôn chạy thường trú trong Windows và luôn chờ đọc các ký tự từ bàn phím.


    Trả lời :
    1. Dữ liệu thuộc kiểu Date/Time trong Access (hay trong VB)  dùng 8 byte bộ nhớ để lưu giữ 1 giá trị thời gian ở dạng số thực: phần nguyên (chiếm 4 byte) miêu tả ngày/tháng/năm và phần lẻ (chiếm 4 byte) miêu tả giờ/phút/giây. Mặc dù bên trong máy, giá trị thời gian được mã hóa và được lưu giữ dưới dạng số nhưng khi giao tiếp với người dùng đầu cuối hay người lập trình, giá trị thời gian được miêu tả dưới dạng chuỗi có định dạng '#....#', trong đó chuỗi trong 2 dấu # có thể được viết theo nhiều dạng khác nhau, trong đó định dạng mà người Việt thường dùng là 'dd/mm/yyyy'. Để Access, VB và các linh kiện phần mềm trong Windows hiểu giá trị thời gian theo định dạng 'dd/mm/yyyy', bạn cần vào Control Panel, Regional and language Option, chọn tab Regional Options, chọn button Customize, chọn tab Date rồi thiết lập định dạng ngày 'dd/mm/yyyy' cho máy hiểu để từ đây Windows và các ứng dụng của nó sẽ phân giải chuỗi miêu tả thời gian theo định dạng qui định.
    Riêng lệnh Select không giải quyết được yêu cầu của bạn vì nó có lỗi liên quan đến lệnh Format, thật ra nó đòi hỏi tham số thứ nhất thuộc kiểu Date chứ không phải chuỗi nhập vào như bạn tưởng.

    2. Câu hỏi của bạn không rõ ràng lắm, nếu bạn muốn khi click chuột trên button 'NumLock' của Form chương trình của mình sẽ tạo tự động sự kiện ấn phím NumLock để thực hiện chức năng định sẵn của phím này thì qui trình giải quyết như sau :
    - tạo button 'NumLock' (hay 1 option menu tương ứng) trong form giao diện của ứng dụng.
    - tạo hàm xử lý sự kiện Click cho button 'NumClock' và viết hàm này như sau :
    Private Declare Sub keybd_event Lib 'user32' (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Const VK_NUMLOCK = &H90
    Const SC_NUMLOCK = &H45
    Const KEYEVENTF_KEYUP = 2
    Const KEYEVENTF_KEYDOWN = 0
    Const KEYEVENTF_EXTENDEDKEY = 1
    Private Sub NumLock_Click()
    'tao sự kiện ấn/thả phím NumLock (thay cho người dùng ấn/thả)
    keybd_event VK_NUMLOCK, SC_NUMLOCK, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN, 0
    keybd_event VK_NUMLOCK, SC_NUMLOCK, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDUP, 0
    End Sub
    Bạn sẽ thực hiện cùng qui trình trên để tạo sự kiện ấn/thả các phím khác như CapsLock, PrintScreen một cách tự động từ chương trình.

    3. Windows là hệ điều hành đa tiến trình (multi-process), nó cho phép nhiều phần mềm chạy đồng thời, do đó khái niệm chạy 'thường trú' trên MSDOS không cần thiết nữa, bạn có thể cho bao nhiêu phần mềm chạy đồng thời cũng được, phần mềm nào đã chạy mà không được dừng tường minh bởi người dùng sẽ chạy luôn đến khi shutdown Windows (tương đương với chương trình thường trú của MSDOS).
    Chuyên mục: Ứng dụng văn phòng