[VB6]Tạo chương trình đọc file bằng VB6

tuhocvba

Administrator
Thành viên BQT
Nói là bảo mật Excel có thể sử dụng VB6. Nhưng nếu VB6 không thạo, thì cứ định làm gì chúng ta sẽ ngại. Do đó tôi lập topic này, bản thân thực hành và cố gắng viết lại thật dễ hiểu để các bạn có thể thực hành theo. Nếu ai chưa cài VB6 thì tham khảo .
Nếu là VBA Excel, cả google hay tự code đều rất đơn giản.
Vấn đề thực hành 1: Ở bài viết này tôi đặt ra yêu cầu là : Chúng ta ấn vào nút Open thì sẽ có hộp thoại Dialog hiện lên cho ta chọn file txt, người dùng ấn chọn file thì ô Text1 sẽ hiển thị đường dẫn fullpath của file text.
Bạn cần đăng nhập để thấy đính kèm

Tưởng như đơn giản nhưng tôi khá mất thời gian.
Nào chúng ta bắt đầu:
Bạn cần đăng nhập để thấy đính kèm

Mở VB6 lên, chọn Standard EXE. Mục đích chúng ta tạo ra một chương trình là file exe.
Ngay lập tức đã có sẵn một cái Form (tương tự Userform trong VBA).
Tôi muốn lấy ô Textbox để làm nơi lưu đường link của file.
Bạn cần đăng nhập để thấy đính kèm

Biểu tượng khá giống trên Excel. Sau khi click vào biểu tượng ô Textbox thì bạn dùng chuột và kéo thả vào Form.
Ở bước này, tôi không hiểu sao tôi di chuyển khá khó khăn. Thực sự không thể kéo thả cho đẹp như trên Excel. Các bạn kéo thả có tiện lợi không thì nêu ý kiến trong topic này nhé.
Tuy nhiên không sao cả, tôi cứ kéo thả nó vào trong Form.
Sau đó sẽ chỉnh vị trí và kích thước bằng "đại số".
Bạn cần đăng nhập để thấy đính kèm

Thông qua các thông số Top, Left, Width, Height, tôi đã có thể tinh chỉnh lại vị trí cũng như kích thước của ô Textbox (chú ý tên của nó là Text1).
Vậy là xong.

Bây giờ lôi cái nút bấm.
Bạn cần đăng nhập để thấy đính kèm

Tôi cũng chỉ có thể kéo thả nó ra Form. Rồi lại dùng phương pháp "đại số" để điều chỉnh kích thước cũng như vị trí của nó. Quá khổ sở.
Bạn cần đăng nhập để thấy đính kèm


Về thuộc tính của các đối tượng, tôi chưa thấy có điểm khác biệt nào với Excel. Ít nhất là những thứ tôi sử dụng.
Nào , giờ viết code cho nút Open thì cứ click đúp vào nút bấm để ra nơi viết code. Y chang như Excel phải không nào.

Đây là bước tôi mất thời gian. Cần phải code cho nút Open này để select được file txt.
Google thì sẵn đấy, giờ nếu bạn tự tin thì đóng topic này lại và tự google để tìm code đi.

Nào, đây là code của tôi:
Mã:
'Ham API select file
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

'Cau truc setting
Private Type OPENFILENAME
    lStructSize As Long         'Kich thuoc cau truc
    hwndOwner As Long           'Handle window cha
    hInstance As Long           'Handle instance
    lpstrFilter As String       'filter
    lpstrCustomFilter As String 'Bo loc filter
    nMaxCustFilter As Long      'Kic thuoc filter
    nFilterIndex As Long        'Index cua filter
    lpstrFile As String         'bufer cua ten file
    nMaxFile As Long            'Kich thuoc cua bufer cua ten file
    lpstrFileTitle As String    'bufer cua duong dan fullpath
    nMaxFileTitle As Long       'Kich thuoc cua fullpath bufer
    lpstrInitialDir As String   'Danh muc khoi tao
    lpstrTitle As String        'Title cua hop thoai
    Flags As Long               'Chi dinh Option
    nFileOffset As Integer      'Offset cho toi ten file trong fullpath
    nFileExtension As Integer   'Offset toi phan mo rong cua file
    lpstrDefExt As String       'Phan mo rong mac dinh
    lCustData As Long           'Du lieu trao cho ham
    lpfnHook As Long            'Con tro toi ham フック
    lpTemplateName As String    'Ten temp
End Type

'Hang so
Private Const OFN_HIDEREADONLY = &H4        'Khong hien thi checkbox Read Only
Private Const OFN_PATHMUSTEXIST = &H800     'Khong tiep nhan duong dan vo hieu
Private Const OFN_FILEMUSTEXIST = &H1000    'Khong tiep nhan ten file vo hieu
Private Const OFN_EXPLORER = &H80000        'Hien thi Explorer

'Bien so
Private strFileName As String               'Lay ten file

'Khi click vao nut bam se lay duong dan file
Private Sub Command1_Click()
 Dim OFN As OPENFILENAME
    Dim Ret As Long

With OFN

    'Thiet dinh kich thuoc cau truc
    .lStructSize = Len(OFN)

    'Thiet dinh handle window cha
    .hwndOwner = Me.hWnd

    'Thiet dinh handle instance
    .hInstance = App.hInstance

    'Thiet dinh bo loc
    .lpstrFilter = "File Tex(*.txt)" & vbNullChar & "*.txt" & vbNullChar & _
                   "All File(*.*)" & vbNullChar & "*.*"

    'Thiet dinh gia tri khoi tao cho bo loc
    .nFilterIndex = 1

    'Thiet dinh cung kich thuoc va dam bao bufer cho ten file
    .lpstrFile = String$(256, Chr$(0))
    .nMaxFile = 256

    'Thiet dinh cung kich thuoc va dam bao bufer cho fullpath
    .lpstrFileTitle = String$(256, Chr$(0))
    .nMaxFileTitle = 256

    'Thiet dinh folder mac dinh
    .lpstrInitialDir = "C:\"

    'Thiet dinh Title cho hop thoai
    .lpstrTitle = "Open File"

    'Thiet dinh Flags
    .Flags = OFN_EXPLORER Or _
             OFN_PATHMUSTEXIST Or _
             OFN_FILEMUSTEXIST Or _
             OFN_HIDEREADONLY

End With

    'Hien thi Dialog
    Ret = GetOpenFileName(OFN)

    'Truong hop nguoi dung an Cancel
    If Ret = 0 Then
        strFileName = ""

    'Truong hop nguoi dung an Open
    Else
        strFileName = Left$(OFN.lpstrFile, InStr(OFN.lpstrFile, vbNullChar) - 1)
    End If

    'Gan ten file cho Text
    Text1.Text = strFileName
End Sub
Nguồn:
Mã:
http://www.openreference.org/articles/view/426
API là phần khó, tôi không chắc tôi việt hóa comment đã tốt. Nếu các bạn muốn bổ sung thì cứ comment trong topic này.
OK. Code trên là chạy được rồi. Nói thật, tôi google ra được khá nhiều code nhưng trên máy tôi đều không chạy, chỉ có code này là ổn.
Máy tính của tôi là Win 10, 64bit.
Ấn nút Play để chạy thử nhé.
Bạn cần đăng nhập để thấy đính kèm


Bạn cần đăng nhập để thấy đính kèm


Form đã hiện ra rồi.
Giờ muốn build ra exe để chia sẻ cho máy tính khác thì ta làm như sau:

Vào File:
Bạn cần đăng nhập để thấy đính kèm

Make exe thôi.
Tôi chọn nơi lưu là destop.
Bạn cần đăng nhập để thấy đính kèm

Ấn OK.
 

NhanSu

SMod
Thành viên BQT
Trong vb6 có Common dialog control để hiện hộp thoại chọn file hoặc bộ 3 control Drive, Directory, File có thể thay thế API trên. @tuhocvba nếu khó khăn khi kéo thả thì có thể kích chọn điều khiển rồi vẽ trên form bằng cách kéo chuột từ góc trên trái đến góc dưới phải.
 

tuhocvba

Administrator
Thành viên BQT
Trong vb6 có Common dialog control để hiện hộp thoại chọn file hoặc bộ 3 control Drive, Directory, File có thể thay thế API trên. @tuhocvba nếu khó khăn khi kéo thả thì có thể kích chọn điều khiển rồi vẽ trên form bằng cách kéo chuột từ góc trên trái đến góc dưới phải.
Mình có tích chọn rồi mà code vẫn không chạy. Phải dùng hàm API.
Bạn cần đăng nhập để thấy đính kèm


về việc vẽ kéo từ góc trên trái xuống góc phải dưới, mình kéo rồi đó. Chuột nó cứ giật giật. Đành dùng phương pháp "đại số". :(
 

NhanSu

SMod
Thành viên BQT
Common dialog không hiện trên form như command button hay textbox, cần hiện nó lên bằng ShowOpen.
Mã:
Private Sub Command1_Click()
Dim FileFullName As String
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName
End Sub
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Máy mình báo lỗi.
Bạn cần đăng nhập để thấy đính kèm
 

NhanSu

SMod
Thành viên BQT
Nói chung là VB6 cũ rồi, mình vừa cài thử nó nhảy ra nhiều cảnh báo, không biết nó có xung đột với VS2019 không.
 

tuhocvba

Administrator
Thành viên BQT
Vấn đề thực hành 2: Ở bài viết này tôi đặt ra yêu cầu là : Chúng ta ấn vào nút Open thì sẽ có hộp thoại Dialog hiện lên cho ta chọn Folder.
Tôi sẽ tiếp tục tạo ô Textbox và Commandbutton như bước trước.
Bạn cần đăng nhập để thấy đính kèm


Tôi cần tạo Class mà tôi sẽ nêu lý do sau.
Bạn cần đăng nhập để thấy đính kèm

Bạn click chuột phải vào Project và chọn Add => Class Module.
Thay đổi tên Class này thành:
FolderBrowserDialog

Bạn cần đăng nhập để thấy đính kèm

Ở VB6 , do CommonDialog không có FolderBrowserDialog, vì vậy ta sẽ sử dụng hàm Win32API là SHBrowseForFolder để thực hiện select folder.
Chú ý: Ngay ở bước tạo select file trước đây, tôi thử dụng CommonDialog nhưng không được (mặc dù Smod @NhanSu thì lại làm được, tôi không thấy thoải mái với CommonDialog lắm).

Trên class này các bạn viết code như sau:
Mã:
' Ham SHBrowseForFolder 
Private Declare Function SHBrowseForFolder Lib "SHELL32.DLL" Alias "SHBrowseForFolderA" ( _
    ByRef lpBrowseInfo As TypeBrowseInfo _
) As Long

' Ham SHGetPathFromIDList 
Private Declare Function SHGetPathFromIDList Lib "SHELL32.DLL" Alias "SHGetPathFromIDListA" ( _
    ByVal pidl    As Long,  _
    ByVal pszPath As String _
) As Long

' Ham CoTaskMemFree 
Private Declare Sub CoTaskMemFree Lib "OLE32.DLL" (ByVal pv As Long)

' Ham BrowseInfo 
Private Type TypeBrowseInfo
    OwnerHandle As Long
    Root        As Long
    DisplayName As String
    Description As String
    Flags       As BifOptions
    lpfn        As Long
    lParam      As String
    iImage      As Long
End Type

' FolderBrowseDialog: Enum de cau hinh
Private Enum BifOptions
    ReturnOnlyFileSystemDirectories = &H1     ' Khong cho select ControlPanel. Printer. Briefcase
    HideNetworkResource             = &H2     ' Khong hien thi Network
    StatusText                      = &H4     ' Hien thi chuoi ky tu (Thiet dinh tien hanh bang ham Callback)
    OnlyNetworkResource             = &H8     ' Cho select network
    ShowEditBox                     = &H10    ' Hien thi Texbox bien tap ten folder
    Validate                        = &H20    ' Tien hanh dieu tra
    NewDialogStyle                  = &H40    ' Hien thi tao folder moi ( tu Winodws 2000 tro di)
    BrowseForComputer               = &H1000  ' Cho select network computer
    BrowseForPrinter                = &H2000  ' Cho select chi co network printer
    BrowseIncludeFiles              = &H4000  ' Hien thi ca ten file trong folder ( Tu Windows 98 tro di)
End Enum

' Thuoc tinh bien so
Private m_SelectedPath As String
Private BrowseInfo     As TypeBrowseInfo

' SelectedPath - Get
Public Property Get SelectedPath() As String
    SelectedPath = m_SelectedPath
End Property

' SelectedPath - Let
Public Property Let SelectedPath(ByVal value As String)
    m_SelectedPath = value
End Property

' Description - Get
Public Property Get Description() As String
    Description = BrowseInfo.Description
End Property

' Description - Let
Public Property Let Description(ByVal value As String)
    BrowseInfo.Description = value
End Property

' ShowNewFolderButton - Get
Public Property Get ShowNewFolderButton() As Boolean
    ShowNewFolderButton = ((BrowseInfo.Flags And NewDialogStyle) > 0)
End Property

' ShowNewFolderButton - Let
Public Property Let ShowNewFolderButton(ByVal value As Boolean)
    If value Then
        BrowseInfo.Flags = BrowseInfo.Flags Or NewDialogStyle
    Else
        BrowseInfo.Flags = BrowseInfo.Flags And Not NewDialogStyle
    End If
End Property

' constructor
Private Sub Class_Initialize()
    BrowseInfo.Flags = BrowseInfo.Flags Or NewDialogStyle
End Sub

'Hien thi Dialog tham chieu folder
Public Function ShowDialog(Optional ByVal hOwnerHandle As Long = 0&) As Boolean
    Dim lReturn As Long

    ' Thiet dinh handle cha
    BrowseInfo.OwnerHandle = hOwnerHandle

    'Goi dialog tham chieu folder
    lReturn = SHBrowseForFolder(BrowseInfo)

    ' Truong hop nguoi dung da an vao OK
    If lReturn <> 0 Then
        Dim stPath As String

        stPath = String$(65536, vbNullChar)

        Call SHGetPathFromIDList(lReturn, stPath)
        Call CoTaskMemFree(lReturn)

        Me.SelectedPath = Left$(stPath, InStr(stPath, vbNullChar) - 1)
        ShowDialog = True
    End If
End Function
Code cho nút bấm Command2 :
Mã:
    ' Tao class FolderBrowserDialog 
    Dim cFolderBrowserDialog As FolderBrowserDialog
    Set cFolderBrowserDialog = New FolderBrowserDialog

    ' Thiet dinh thuyet minh Dialog
    cFolderBrowserDialog.Description = "Select folder"

    ' Hien thi nut bam New folder (Gia tri khoi tao la True )
    'cFolderBrowserDialog.ShowNewFolderButton = True

    ' Hien thi dialog, truong hop gia tri tra ve la OK thi hien thi duong dan fullpath da select
    If cFolderBrowserDialog.ShowDialog(Me.hWnd) Then
        Call MsgBox(cFolderBrowserDialog.SelectedPath)
    End If

    ' Giai phong
    Set cFolderBrowserDialog = Nothing
Kết quả chạy thử code:
Bạn cần đăng nhập để thấy đính kèm

Bạn cần đăng nhập để thấy đính kèm


Tôi đã tham khảo code ở đây:
Mã:
http://jeanne.wankuma.com/tips/vb6/dialog/folderbrowser.html
Qua hai vấn đề ta đã giải quyết, có thể thấy việc nhớ và gõ lại các code trên là khó, tôi cho rằng bạn chỉ cần hiểu tác dụng của code dùng để làm gì, khi cần sử dụng thì lấy ra dùng là được.
Đây chỉ là phần thiết kế giao diện, không liên quan tới xử lý logic bên trong, cho nên ta có thể làm như thế mà không cần lý giải gì nhiều.
Chúc các bạn thành công.
 

NhanSu

SMod
Thành viên BQT
@tuhocvba code trên có lỗi khi tên folder và file là unicode không nhỉ? Mình nhìn API có tên kết thúc bằng chữ A thì đoán là không chạy được, đang không ở nhà không test được.
 

tuhocvba

Administrator
Thành viên BQT
Hiển thị bình thường.
Bạn cần đăng nhập để thấy đính kèm


Sửa code trên để trả kết quả vào ô textbox.
Mã:
If cFolderBrowserDialog.ShowDialog(Me.hWnd) Then
        Text2.Text = cFolderBrowserDialog.SelectedPath
    End If
Khi load vô ô textbox thì hiển thị không được ổn.
Bạn cần đăng nhập để thấy đính kèm


Không biết nếu đường link lưu trong biến lk và open link từ biến lk này thì sao, mình test sau.
Nhưng hiển thị như trên thì cũng xấu nhỉ.
 

NhanSu

SMod
Thành viên BQT
Có thể không được do API đó là phiên bản ANSI SHBrowseForFolderA, phiên bản unicode sẽ có tận cùng là W (SHBrowseForFolderW). Tên nằm trong Alias í.
 
Top