Tìm trong:Webe-CHÍP

Bộ gõ (kiểu Vni/Telex/Viqr)Tắt (Alt+T)Mở (Alt+M)

 
Trang chủ ĐÓ HỎI, ĐÂY TRẢ LỜI TC 69
Tạo ComboBox cho Datagrid trong VB6

Đó hỏi: Trong  Visual Basic 6, tôi có một form dạng 1-nhiều, phần nhiều là Datagrid. Tôi muốn tạo một field trong Datagrid là comboBox (hoặc datacombo) để khi thêm dữ liệu vào lưới, chỉ cần chọn mục trong comboBox, dữ liệu tương ứng sẽ hiện ra giống như màn hình 1-nhiều trong Access. <lengocdung.cg@>

Đây trả lời: Trong VB6, bạn có thể sử dụng ô điều khiển Flex Grid hoặc Hierarchical Flex Grid để nhập dữ liệu dạng datagrid. Với các ô điều khiển loại này, bạn có thể sử dụng một ComboBox để nhận dữ liệu vào một ô (cell) trong datagrid.
Ý tưởng là:
* Vẽ một ComboBox độc lập với datagrid (danh sách dữ liệu trong ComboBox được tạo từ đâu là tùy ứng dụng của bạn).
* Mỗi khi click vào một ô cần ComboBox xuất hiện, thì vẽ ComboBox đè lên đúng kích thước ô đó.
* Mỗi khi chọn xong một mục trong ComboBox, dữ liệu được gán cho ô.

Bạn có thể thực hiện ví dụ đơn giản như sau. Khởi động VB6 và tạo một project mới thuộc loại Standard EXE. Chọn mục Components trên trình đơn Project, rồi đánh dấu chọn mục Microsoft FlexGrid Control 6.0 trên hộp thoại Components. Bấm OK để thêm thành phần MSFlexGrid vào ứng dụng.

Trên Form1 mặc định, vẽ một ComboBox có tên Combo1, một MSFlexGrid có tên MSFlexGrid1. Gõ đoạn mã 1 vào Form1. Xong, bạn ghi project lại, compile thành tập tin .EXE rồi chạy thử.

 Hình 1

Đoạn mã 1

Option Explicit

Private Sub Form_Unload(Cancel As Integer)

    If IsHooked Then

         Unhook   ' Ngừng kiểm tra các message.

    End If

End Sub

Private Sub MSFlexGrid1_MouseUp(Button As Integer, _

    Shift As Integer, x As Single, y As Single)

    Static CurrentWidth As Single

    ' Kiểm tra xem kích thước bề ngang của ô có thay đổi không

    If MSFlexGrid1.CellWidth <> CurrentWidth Then

         Combo1.Width = MSFlexGrid1.CellWidth   ‘ Nếu có thì thay đổi kích thước Combo1

         CurrentWidth = MSFlexGrid1.CellWidth

    End If

End Sub

Private Sub Form_Load()

    gHW = MSFlexGrid1.hWnd

    Hook   ' Bắt đầu kiểm tra các message.

    MSFlexGrid1.AllowUserResizing = flexResizeColumns

    MSFlexGrid1.Cols = 4

    MSFlexGrid1.Rows = 6

    MSFlexGrid1.RowHeightMin = Combo1.Height

    Combo1.Visible = False

    Combo1.ZOrder (0)

    Combo1.Width = MSFlexGrid1.CellWidth

    ' Tạo danh sách cho Combo1.

    Combo1.AddItem "Muc thu nhat"

    Combo1.AddItem "Muc thu hai"

    Combo1.AddItem "Muc thu ba"

    Combo1.AddItem "Muc thu tu"

    Combo1.AddItem "Muc thu nam"

End Sub

Private Sub MSFlexGrid1_Click()

    ' Xác định vị trí và kích thước ComboBox, và hiển thị nó

    Combo1.Width = MSFlexGrid1.CellWidth

    Combo1.Left = MSFlexGrid1.CellLeft + MSFlexGrid1.Left

    Combo1.Top = MSFlexGrid1.CellTop + MSFlexGrid1.Top

    Combo1.Text = MSFlexGrid1.Text

    Combo1.Visible = True

End Sub

Private Sub Combo1_Click()

    ' Gán trị đã chọn vào ô, rồi ẩn ComboBox đi.

    MSFlexGrid1.Text = Combo1.Text

    Combo1.Visible = False

End Sub

Thêm một module có tên Module1 vào project rồi gõ đoạn mã sau đây vào:

Option Explicit

Declare Function CallWindowProc Lib "user32" Alias _

    "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _

    ByVal hWnd As Long, ByVal Msg As Long, _

    ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function SetWindowLong Lib "user32" Alias _

    "SetWindowLongA" (ByVal hWnd As Long, _

    ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_WNDPROC = -4

Private Const WM_SIZE = &H5

Private Const WM_PAINT = &HF

Private lpPrevWndProc As Long

Public IsHooked As Boolean

Public gHW As Long

Public Sub Hook()

    If Not IsHooked Then

        lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)

        IsHooked = True

    End If

End Sub

Public Sub Unhook()

    Dim temp As Long

    temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)

    IsHooked = False

End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As _

    Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    WindowProc = CallWindowProc(lpPrevWndProc, hw, _

             uMsg, wParam, lParam)

    If uMsg = WM_SIZE Or uMsg = WM_PAINT Then

        Form1.Combo1.Width = Form1.MSFlexGrid1.CellWidth

        Form1.Combo1.Left = Form1.MSFlexGrid1.CellLeft + Form1.MSFlexGrid1.Left

        Form1.Combo1.Top = Form1.MSFlexGrid1.CellTop + Form1.MSFlexGrid1.Top

    End If

End Function

CHƯƠNG CAN CHÍP
 
Định dạng ISZ

Đó hỏi: Tôi tải từ mạng tập tin nén, giải nén thì nhận được một tập tin định dạng ISZ. Tuy nhiên không biết dùng chương trình gì để xem được. Thông tin từ trang Web của nó cho biết nó là tập tin ảnh đĩa để chép ra đĩa DVD. Làm sao để chép đĩa được vì tôi có thử dùng vài chương trình ghi đĩa DVD đều không nhận ra? <phu_vinh@>

Đây trả lời: Đây thực sự là tập tin nén từ tập tin ảnh đĩa DVD do dung lượng quá lớn, cần thu nhỏ bớt lại. Muốn chép ra DVD, bạn phải giải nén nó bằng chương trình UltraISO (có thể tải bản portable không cần cài đặt tại http://filexoom.com/files/12887/UltraISO.PE.v8.Portable.rar). Cho chạy UltraISO, vào menu Tools > Uncompress ISZ rồi chọn tập tin ISZ, lưu vào phân vùng có dung lượng tương đối lớn vì sau khi giải nén sẽ được tập tin ISO, dung lượng có thể lớn hơn 20% tập tin ISZ ban đầu. Với tập tin ISO, bạn dễ dàng chép ra đĩa rồi đấy.

 
Nên lưu trên phân vùng NTFS

Đó hỏi: Tôi tải một tập tin zip khoảng 3,5GB, giải nén ra thì báo lỗi dung lượng ổ đĩa không đủ. Đây là tập tin ISO để chép DVD. Tôi thắc mắc là sao lại bị lỗi này vì ổ cứng tôi còn trống hàng chục GB? <duongqua_daihiep@>

Đây trả lời: Lỗi này là do bạn đã lưu tập tin ISO sau khi giải nén vào phân vùng ổ cứng định dạng FAT32. Phân vùng FAT32 không chấp nhận một tập tin bất kỳ có dung lượng lớn hơn 4,2GB. Vì vậy, bạn nên giải nén vào phân vùng NTFS. Nếu không có phân vùng NTFS, bạn dùng Partition Magic để tạo mới phân vùng NTFS hay chuyển đổi định dạng phân vùng FAT32 sang NTFS, cũng có thể (trong Windows 2000/XP) dùng lệnh “convert x: /fs:ntfs” (x là ký tự phân vùng), xem chi tiết tại www.echip.com.vn/echiproot/html/2006/so324/hoidap.html.

HIẾU TRUNG
 
Chỉ định thời gian sao lưu tự động của Word 2003/2007

Đó hỏi: Mạng lưới điện nơi tôi ở hay bị mất bất ngờ, xin e-CHÍP hướng dẫn tôi cách lấy lại đoạn văn bản đang soạn thảo mà tôi chưa kịp lưu (tôi đang dùng Office 2003 và muốn thử nghiệm Office 2007). <longmy_2006@>

Đây trả lời: Nếu điện bị ngắt bất ngờ thì dữ liệu đang soạn thảo mà chưa lưu của bạn sẽ bị mất, không có cách gì phục hồi lại được vì chúng chưa được lưu vào đĩa cứng. Tuy nhiên, bạn có thể giới hạn số dữ liệu bị mất xuống mức ít nhất bằng cách vào Word 2003 > mở menu Tools/ Options > trong bảng Save, bạn chọn mục Save AutoRecover info every x minutes. Word sẽ tự động sao lưu file văn bản đang soạn thảo (định kỳ theo thời gian chỉ định này) vào một file tạm trên đĩa cứng cho đến khi bạn lưu chính thức. Với x càng nhỏ, dữ liệu mất càng ít khi mất điện nhưng Word chạy chậm vì phải thường xuyên sao lưu. Khi bạn khởi động lại Word sau khi có điện, Word sẽ nạp lại phần dữ liệu đã lưu tự động cuối cùng trước khi mất điện.

Nếu sử dụng Office 2007, bạn bấm chuột vào nút Office ở góc trên bên trái cửa sổ Word 2007 rồi chọn Word Options > chọn mục Save trong khung bên trái > trong khung bên phải chọn mục Save AutoRecover information every x minutes.

 
Giới hạn dung lượng thư của Yahoo! và Gmail

Đó hỏi: Xin hỏi có cách nào gửi 1 file khoảng 100MB vào Yahoo! Mail hay Gmail được không? <huynguyen_typn18@>

Đây trả lời: Dịch vụ e-mail miễn phí của Yahoo và Gmail chỉ cho phép bạn gửi thư có dung lượng tối đa là 10MB. Nếu muốn gửi file có dung lượng trên 10MB, bạn có thể dùng WinRar để nén lại cho nhỏ hay cắt file này ra thành nhiều file nhỏ rồi gửi kèm theo nhiều thư, sao cho mỗi thư có dung lượng tối đa là 10MB mà thôi.

 
Kiểm tra và sửa lỗi đĩa bằng CHKDSK

Đó hỏi: Khi em chạy Disk Defragmenter, chọn các ổ đĩa và bấm chuột vào nút Defragment hay Analyze thì bị báo lôi là: "Disk Defragmenter has detected that Chkdsk is scheduled to run on the volume: GIAI TRI (D:). Please run Chkdsk/f.". Nhưng khi chạy với ổ đĩa C thì bình thường. Xin chỉ em cách khắc phục. <mambo475@>

Đây trả lời: Thông báo này xuất hiện là do ổ D của bạn có trục trặc về vật lý nên Windows yêu cầu bạn chạy trình kiểm tra và sửa lỗi đĩa chkdsk, trước khi chạy Defragmenter. Để chạy chkdsk, bạn làm như sau: Mở menu Start/ Run, gõ cmd và nhấn OK > tại dấu nhắc DOS, gõ lệnh chkdsk /f > chọn Y để Windows kiểm tra đĩa vào lần khởi động tới > khởi động lại Windows.

LH

[Đầu trang]