Sử dụng VB 6.0 Resource Editor

   Một vấn đề mà người lập trình VB hay gặp phải là sai đường dẫn tập tin dùng trong chương trình. Ví dụ như khi sử dụng tập tin (file) ảnh với hàm LoadPicture(), nếu vì lý do nào đó mà file này không hiện diện ở đúng đường dẫn thì sẽ gây báo lỗi hoặc chương trình thực thi không theo đúng thiết kế. Để giải quyết vấn đề này, VB 6.0 có một công cụ rất hay, không thể thiếu cho các nhà lập trình VB chuyên nghiệp, đó là RESOURCE EDITOR (RE). Đây là  công cụ cho phép tạo cho chương trình một nguồn dữ liệu gồm các file, được lưu dưới dạng file *.RES khi lập trình và được ghi chung vào file *.EXE khi biên dịch ra file thực thi.

RE làm việc với 5 loại tài nguyên chính: file ảnh (bitmap), file biểu tượng (icon), file con trỏ của Windows (cursor), bảng chuỗi ký tự (string table) và các dạng file dữ liệu khác do người dùng định nghĩa. Các file tài nguyên được RE quản lý theo số chỉ mục (Index – viết tắt là ID), định dạng tài nguyên (type) và ngôn ngữ (language). ID trong RE có giá trị từ 1 đến 32767 (đối với string table thì từ 1 đến 65535) và được tự động đánh số bắt đầu từ 101. Bạn cũng có thể dùng dạng chuỗi ký tự cho ID của file tài nguyên (riêng string table chỉ cho phép ID dạng số), lưu ý là ký tự trắng (space) sẽ được tự động bỏ còn các ký tự đặc biệt (ví dụ: &,^,%,$,@,# ...) thì không được dùng. Nếu nguồn tài nguyên của bạn có nhiều file thì tốt nhất nên đánh ID dưới dạng tên file tương ứng để dễ nhớ.

VB có 3 hàm hỗ trợ việc truy cập và sử dụng các file trong resource:

 
Cửa sổ chính của Resource Editor

LoadResPicture(index,format) as Picture

LoadResString(index) as String

LoadResData(index,format) as ByteArray

• Hàm LoadResPicture(index,format) có giá trị trả về phụ thuộc vào tham số format, giá trị này có thể tham khảo trong bảng 1.

Tuỳ theo loại file trong resource mà ta truyền tham số tương ứng cho hàm LoadResPicture để có giá trị trả về phù hợp.

• Hàm LoadResString(index) trả về String tương ứng với index trong String Table.

• Hàm LoadResData(index,format) trả về một mảng các giá trị byte (Byte Array). Tham số format là tên của loại dữ liệu mà người dùng định nghĩa trong RE (mặc định là “Custom” khi  thêm loại dữ liệu khác). Đây là một hàm đặc biệt cho phép người dùng nạp vào bộ nhớ hầu hết các loại dữ liệu với dung lượng có thể lên tới hàng chục MB hay hơn. Có thể dùng hàm này thay cho hàm LoadResPicture và LoadResString để nạp các loại dữ liệu đã giới thiệu ở trên (bitmap, icon, cursor), tuy nhiên việc làm này sẽ khá phức tạp vì hàm LoadResData trả về một chuỗi các byte chứ không trả về một file đã được định dạng sẵn (như file bitmap). Sau đây là một số ví dụ về sử dụng các hàm truy cập tài nguyên trong Resource File.

Ví dụ 1: Dùng hàm LoadResPicture và LoadResString để lấy tài nguyên từ trong file *.RES.

Sau khi tạo một project mới có tên là prj_VbResource bạn hãy thao tác theo các bước sau:

Bước 1:

Vào menu Add-Ins/Add-Ins Manager, khi xuất hiện cửa sổ Add-Ins Manager chọn mục VB 6 Resource Editor bên cột Available Add-Ins (nếu không có, bạn hãy tìm “path” của file resedit.dll, thường là “Program Files\Microsoft Visual Studio\VB98\Wizards”, và “đăng ký” thư viện này bằng cách vào Start.Run, nhập lệnh regsvr32 <path>\resedit.dll). Chọn mục Loaded/Unloaded nếu bạn muốn nạp/dừng nạp RE ngay lập tức và Load On Startup nếu bạn muốn VB tự động nạp RE mỗi khi VB khởi chạy, sau cùng chọn OK.

Bước 2:

Vào menu Tools, chọn Resource Editor hoặc biểu tượng của RE  trên toolbar.

Bước 3:

Đây là bước quan trọng, bạn phải thiết lập hệ thống các file resource của mình cẩn thận và chính xác. Trên toolbar của RE là một số nút cho phép nhập các loại file cơ bản vào resource của chương trình: String Table, Cursor, Icon, Bitmap và Custom Data.

 

• Chọn biểu tượng String Table sẽ xuất hiện một bảng gồm 2 cột ID và Language. Khi nhấn đúp vào nhãn Language bạn sẽ thấy xuất hiện một Combo box các ngôn ngữ trên thế giới. Nội dung của Combo box này được lấy chủ yếu từ mục Region Setting trong Control Panel của Windows. Để tạo một String table gồm nhiều ngôn ngữ bạn có thể chọn ngôn ngữ cho một cột rồi tiếp tục nhấn vào biểu tượng , bảng sẽ có thêm cột mới. Tạo một String Table như minh hoạ sau:

Như vậy có thể thấy với cùng một ID nhưng có đến 2 String tương ứng với hai loại ngôn ngữ. Khi gọi ID 101 hàm LoadResString sẽ tự động kiểm tra ngôn ngữ hiện tại máy đang dùng rồi đối chiếu với các loại ngôn ngữ tương ứng trong String Table, nếu không có trong String Table thì hàm sẽ tự động nạp String ở cột đầu tiên (ở ví dụ này là “Xin Chào !” nếu bạn chọn ngôn ngữ của máy là Vietnamese).

• Thêm một Cursor (ID=103), một Icon (ID=104) và một Bitmap (ID=105) tuỳ ý vào resource.

• Chọn Save, ghi resource vào file .../prj_VbResource.res

• Trong project prj_VbResource tạo một Form mới (Form1) cùng 3 Command Button (Command1, Command2, Command3), một TextBox (Text1) và một Image (Image1) rồi gõ đoạn code sau vào phần code của form:

Option Explicit

Private Sub Form_Load()

    Form1.Caption = LoadResString(102)

    Form1.Icon = LoadResPicture(104, 1)

    Form1.MousePointer = vbCustom

    Form1.MouseIcon = LoadResPicture(103, 2)

    Command1.Caption = “String”

    Command2.Caption = “Picture”

    Command3.Caption = “Exit”

    Text1.Font.Size = 12

    Text1.ForeColor = vbBlue

    Text1.Text = “”

    Image1.BorderStyle = 1

    Image1.Stretch = True

End Sub

 

Private Sub Command1_Click()

    Text1.Text = LoadResString(101)

End Sub

 

Private Sub Command2_Click()

    Image1.Picture = LoadResPicture(105, 0)

End Sub

 

Private Sub Command3_Click()

    End

End Sub

‘ ********* End Code *********

 

Hãy thử chuyển ngôn ngữ hiện tại sang English (dùng Region Setting trong Control Panel của Windows), bạn sẽ thấy sự khác biệt!

Ví dụ 2: Dùng định dạng file “custom”

Nếu chỉ sử dụng 2 hàm LoadResString và LoadResPicture thì bạn chỉ có thể sử dụng resource từ những file có định dạng *.ico, *.cur, *.bmp, còn với những file có định dạng khác như  *.gif, *.wav, *.avi , *.mdb  v.v... thì hai hàm này thì chưa đủ. Hàm LoadResData trả về một định dạng hoàn toàn không xác định đó là một mảng các byte (Byte Array). Kết hợp mảng dữ liệu này với một số hàm WinAPI và các lệnh thao tác file của VB, bạn hoàn toàn có thể có được một resource theo ý muốn. Ví dụ sau sẽ hướng dẫn bạn tạo một resource chứa file *.wav và *.avi

Mở một Project mới, dùng VB Resource Editor thêm vào resource một file *.wav với ID=101 và Type=”Sound” cùng một file *.avi với ID=102 và Type=”Video”.

Tạo một Form mới (Form1) với 4 Command Button. Chọn menu Project/Components, chọn Microsoft Windows Common Controls-2 6.0, sau đó tạo một control Animation mới. Tạo một Module mới có nội dung sau:

Option Explicit

 ‘ ********* Module Code **********

Private Declare Function sndPlaySound Lib “WINMM.DLL” Alias_ “sndPlaySoundA” (lpszSoundName As Any, ByVal uFlags As Long) As Long

Const SND_ASYNC = &H1

Const SND_NODEFAULT = &H2

Const SND_MEMORY = &H4

Dim SoundBuffer() As Byte

 

Public Sub BeginPlaySound(ByVal ResourceID As Integer)

    SoundBuffer = LoadResData(ResourceId, “Sound”)

    sndPlaySound SoundBuffer(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY

End Sub

 

Public Sub EndPlaySound()

    sndPlaySound ByVal vbNullString, 0&

End Sub

 

Public Function CreateFileRs(ByVal FilePath As String, ByVal ResID As String, ByVal ResType As String) As Boolean

Dim hFile As Long

Dim FileArr() As Byte

FileArr = LoadResData(ResID, ResType)

On Error Resume Next

If Len(FileArr(1)) > 0 Then

    hFile = FreeFile()

    Open FilePath For Binary Access Write As #hFile

    Put #hFile, 1, FileArr

    Close #hFile

    CreateFileRs = True

End If

End Function

‘ ***** End Module Code *****

 

Sau đó tiếp tục nhập đoạn code sau vào phần form code:

Option Explicit

‘ ********* Form Code *******

Private Sub Command1_Click()

    Animation1.Play

End Sub

 

Private Sub Command2_Click()

    Animation1.Stop

End Sub

 

Private Sub Command3_Click()

    BeginPlaySound 101

End Sub

 

Private Sub Command4_Click()

    End

End Sub

 

Private Sub Form_Load()

    Command1.Caption = “Play”

    Command2.Caption = “Stop”

    Command3.Caption = “Play Sound”

    Command4.Caption = “Exit”

   If Dir(“c:\vbResAvi.avi”) = “” Then

CreateFileRs “c:\vbResAvi.avi”, 102, “Video”

    End If

    Animation1.Open “c:\vbResAvi.avi”

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

    EndPlaySound

End Sub

 

Hàm CreateFileRs() nhận 3 tham số sau:

- FilePath: tham số xác định đường dẫn trên đĩa cứng nơi sẽ sao chép dữ liệu trong Reource ra một file mới. Đường dẫn này phải gồm cả tên và phần mở rộng của file. Ví dụ: “C:\temp\vbRes.AVI”.

- ResID và ResType là các tham số xác định ID và định dạng của file cần copy trong Resource.

Có thể ví RE như một chiếc “máy ảnh” chuyên sao chụp file thông tin lên “phim”,  còn hàm CreateFileRs “rửa” những đoạn “phim” đó ra giấy. Bạn cũng có thể sử dụng hàm này thay cho hàm LoadResPicture để sao chép các tài nguyên bitmap trong Resource ra các file ảnh thông thường rồi dùng hàm LoadPicture để sử dụng các file ảnh đó. Kết hợp RE với hàm CreateFileRs,  bạn hoàn toàn có thể đọc vào và ghi ra từ resource của chương trình tất cả các loại file dữ liệu, việc sử dụng các file này như thế nào là tuỳ ứng dụng. Hy vọng với công cụ Resource Editor, bạn không còn phải băn khoăn trong việc lựa chọn và xây dựng hệ thống tài nguyên cho chương trình để chạy trên bất kỳ máy tính nào. Chúc bạn thành công!

Trần Nam Khanh - FPT APTECH
trannamkhanh@yahoo.com

 

In trang [In trang]    Đóng trang [Đóng trang]

© Tạp chí Thế Giới Vi Tính - PC World VN. CQ chủ quản: Sở Khoa Học và Công Nghệ TP.HCM
Giấy phép số 196/GP-BVHTT do Bộ Văn Hóa Thông Tin cấp ngày 27-06-2003
Tòa soạn: 126 Nguyễn Thị Minh Khai, Q.3 TP.HCM - ĐT: 84.8.39304324 - FAX: 84.8.39304338
Bản quyền của Thế Giới Vi Tính - PC World VN