Thứ sáu, 29/03/2024
Translate
Tìm kiếm
Giới thiệu chung VEIA
English
Tin tức và sự kiện
Doanh nghiệp hội viên VEIA
Xúc tiến thương mại
Dịch vụ trực tuyến B2B
Thế giới công nghệ
Xã hội điện tử-thông tin
Văn bản pháp quy
Hội viên Hiệp hội điện tử
English News and Events
Đại hội VEIA IV
Tạp chí Điện tử Vietnet24h, cơ quan ngôn luận của Hiệp hội Doanh nghiệp Điện tử Việt Nam
Thông tin thời tiết

  Cập nhật: 08/09/2011
Lỗi chức năng Repeat của chương trình nghe nhạc

Một bạn đọc đã xây dựng chương trình nghe nhạc bằng Visual Basic 6.0. Chương trình chạy được nhưng chức năng Repeat bị lỗi, không thể phát lặp lại được.

Cụ thể bạn đọc đã xây dựng chương trình và các đoạn mã theo quy trình như sau: Tạo Project mới loại "Standard EXE". Chọn menu Project.Components để hiển thị cửa sổ Components. Duyệt tìm và đánh dấu chọn vào 2 mục "Windows Media Player" và "Microsoft Common Dialog Controls 6.0" để "add" 2 điều khiển phục vụ chơi multimedia và duyệt hệ thống file vào Project. Chọn menu Tools.Menu Editor để chạy tiện ích thiết kế menu bar rồi thiết kế menubar cho Form ứng dụng gồm 1 menu pop-up có caption là File, trong menu pop-up này chứa 4 option lần lượt là mnuOpen, mnuPlay, mnuRepeat, mnuExit. Thiết kế Form ứng dụng gồm có 1 listbox có tên mặc định là List1, 1 Timer có tên mặc định là Timer1, 1 CommonDialog có tên mặc định là CommonDialog1, 1 WMP có tên là Media (vị trí của Timer và CommonDialog không quan trọng vì 2 đối tượng này sẽ bị ẩn khi ứng dụng chạy). Dời chuột về từng option menu và chọn nó để tạo thủ tục xử lý sự kiện click chuột của option tương ứng rồi viết code hiện thực. Chi tiết vấn đề này, mời quý bạn đọc tham khảo tại http://forum.pcworld.com.vn/default.aspx?g=posts&t=7358 

Chúng tôi đã kiểm tra chương trình của bạn và tìm ra một số lỗi cũng như một số chi tiết chưa đúng như sau:

1. Bạn có dùng timer với thời gian đếm nào đó (chúng tôi thiết lập 1 giây), khi timer đếm xong thời gian qui định thì thủ tục Timer1_Timer() sẽ được kích hoạt, thủ tục này kiểm tra xem hết bài hát chưa, nếu hết thì chuyển sang bài kế tiếp trong danh sách. Đây là nguyên nhân làm chức năng Repeat hoạt động không chính xác. Lý do là bạn miêu tả điều kiện hết bài hát là khi còn ít hơn hay bằng 1 giây, điều kiện này không chính xác. Hơn nữa chế độ Repeat cũng như playlist mà bạn thiết lập cho WMP không còn tác dụng nữa (do bạn thiết lập lại từng bài hát trong thủ tục Timer1_Timer).

Cách giải quyết là xóa bỏ Timer và thủ tục Timer1_Timer(), để WMP tự hoạt động theo chế độ Repeat mà bạn thiết lập trong thủ tục mnuRepeat_Click().

2. Trong thủ tục mnuPlay_Click(), bạn chuyển danh sách bài hát từ ListBox sang WMP mà không xóa nội dung playlist có sẵn trong WMP, như vậy nếu người dùng chọn nhiều lần option Play thì mỗi bài hát trong listbox sẽ được thêm vào playlist của WMP nhiều lần, điều này là không cần thiết và dễ làm mất sự kiểm soát của chương trình.

Cách khắc phục là thêm lệnh xóa nội dung playlist hiện có trong WMP trước khi chuyển danh sách bài hát từ Listbox sang WMP. Cụ thể thủ tục mnuPlay_Click được hiệu chỉnh lại như sau:

'thủ tục xử lý option Play
Private Sub mnuPlay_Click()
'định nghĩa các biến cần dùng trong thủ tục
Dim i As Integer
Dim MyPlaylist As IWMPPlaylist
Dim MyMedia As IWMPMedia

Set MyPlaylist = Me.Media.currentPlaylist
'xóa nội dung hiện có của Playlist
MyPlaylist.Clear
'chuyển các file từ Listbox vào Playlist
For i = 0 To List1.ListCount - 1
Set MyMedia = Me.Media.newMedia(List1.List(i))
MyPlaylist.appendItem MyMedia
Next
Media.currentPlaylist = MyPlaylist
'tô chọn bài đầu tiên trong ListBox
List1.ListIndex = 0
End Sub

3. Tương tự, trong thủ tục mnuOpen_Click(), bạn chuyển danh sách các file từ cửa sổ CommonDialog sang Listbox mà không xóa nội dung có sẵn trong Listbox, như vậy nếu người dùng chọn nhiều lần option Open thì listbox sẽ tích lũy dần rất nhiều file bài hát, các file này có thể trùng nhau, điều này là không cần thiết và dễ làm mất sự kiểm soát của chương trình.

Cách khắc phục là thêm lệnh xóa nội dung Listbox trước khi chuyển danh sách file bài hát từ CommonDialog sang Listbox. Cụ thể bạn nên thêm lệnh sau vào đầu thủ tục mnuOpen_Click():
'xóa nội dung hiện có của Listbox
List1.Clear

4. Việc tô đậm tên file bài hát trong Listbox đồng bộ với bài hát mà WMP đang chơi sẽ được thực hiện trong thủ tục xử lý sự kiện MediaChange của WMP. Cụ thể bạn hãy viết thêm thủ tục xử lý sự kiện MediaChange như sau:

'thủ tục xử lý sự kiện chuyển bài hát
Private Sub Media_MediaChange(ByVal Item As Object)
'định nghĩa các biến cần dùng trong thủ tục
Dim MyMedia As IWMPMedia
Dim i As Integer, pos As Integer
Dim sbuf As String
Dim lbuf() As String
Set MyMedia = Item
'duyệt tìm file đang hát
For i = 0 To List1.ListCount - 1
'đổi pathname thành nhiều thành phần
lbuf = Split(List1.List(i), "\")
'xác định tên file bài hát
sbuf = lbuf(UBound(lbuf))
'xác định tên bài hát (bỏ phần mở rộng)
pos = InStr(1, sbuf, ".")
If pos <> 0 Then
sbuf = Mid(sbuf, 1, pos - 1)
End If
If MyMedia.Name = sbuf Then
'nếu bài đang hát là bài i trong Listbox thì tô đậm nó
List1.ListIndex = i
Exit For
End If
Next
End Sub

Nếu bạn hiệu chỉnh lại các chi tiết nêu trên thì ứng dụng sẽ chạy tốt, nó sẽ chơi lặp lại hay không tùy thuộc vào option Repeat có được chọn hay không. Mỗi lần hát bài mới. Listbox sẽ tô đậm tên file bài hát ấy cho người dùng tiện theo dõi.

Theo www.pcworld.com.vn

  Trang trước    | Về đầu trang
Hiệp hội doanh nghiệp Điện tử Việt Nam
Hội Tin học Việt Nam
VAA
Hội tin học Thành Phố Hồ Chí Minh
Công ty TNHH MTV Hanel
Công ty CP Minh Việt
Trung tam TKNL Hanoi (ECC Hanoi)
Công ty TNHH Thiết bị Phụ tùng An Phát



www.veia.org.vn

HIỆP HỘI DOANH NGHIỆP ĐIỆN TỬ VIỆT NAM
Trụ sở chính: Tầng 11, Tòa nhà MIPEC TOWER 229 Tây Sơn, Đống Đa, Hà Nội.
Tel: (84-4) 39332845 Fax: (84-4) 39332846
Email: hiephoidientu@veia.org.vn, Website: www.veia.org.vn

.Designed by Intecom ( Minh Việt JSC and HanelCom )