Showing posts with label hay. Show all posts
Showing posts with label hay. Show all posts

Friday, December 4, 2009

Tự Học Lập Trình trong 10 năm (Peter Norvig)

Tại sao mọi người lại vội vã như vậy?
Bước vào bất cư một hiệu sách nào, và bạn sẽ nhìn thấy cuốn Tự học Java trong 7 ngày cùng với vô số những cuốn sách tương tự giúp bạn tự học Visual Basic, Windows, Internet, … trong vòng một vài ngày, thậm chí một vài giờ. Tôi đã dùng công cụ Power Search của Amazon thử tìm những cuốn sách xuất bản sau năm 1992 với mục đích giúp bạn học một thứ gì đó trong vòng vài ngày và tìm được 248 cuốn. 78 cuốn đầu tiên là sách về computer (đứng thứ 79 là cuốn Learn Bengali in 30 days). Tôi thử thay thế “ngày” bằng “giờ” và kết quả giống nhau một cách kinh ngạc: 253 cuốn sách nữa, đầu tiên là 77 cuốn sách computer và đứng thứ 78 là cuốn Teach Yourself Grammar and Style in 24 Hours. Trong số 200 cuốn đầu tiên, 96% là sách máy tính.


Có thể kết luận rằng (1)Mọi người đang đổ xô đi học computer, (2) hoặc computer cực kỳ dễ học, dễ học hơn bất cứ một thứ gì khác. Chẳng có cuốn sách nào dạy bạn nghe Beethoven, dạy Vật lý lượng tử, hay thậm chí dạy cắt lông chó... chỉ trong vòng một vài ngày.
Thử phân tích tựa đề của cuốn Học Pascal trong 3 ngày (Learn Pascal in Three Days)

  • Học: Trong 3 ngày bạn sẽ không đủ thời gian để viết được những chương trình thực sự phức tạp, và học từ những thành công cũng như thất bại của bạn. Bạn cũng không đủ thời gian để làm việc với một lập trình viên giàu kinh nghiệm, và cũng không kịp hiểu cuộc sống trong môi trường đó là như thế nào. Nói một cách ngắn gọn bạn không đủ thời gian để học được nhiều. Đó chỉ có thể là một thứ kiến thức nông cạn chứ không thể là một hiểu biết sâu sắc. Theo như Alexander Pope thì: học một chút là một điều nguy hiểm.

  • Pascal: Trong 3 ngày có lẽ bạn sẽ học được cú pháp của Pascal (nếu bạn đã biết một ngôn ngữ tương tự), nhưng bạn không có nhiều thời gian để học cách sử dụng cú pháp ấy. Nếu bạn là lập trình viên BASIC, bạn sẽ viết một chương trình theo phong cách của BASIC nhưng lại dùng cúp pháp của Pascal, tuy nhiên bạn sẽ không học được Pascal hay ở đâu và dở ở chỗ nào. Vậy thì học Pascal để làm gì? Alan Perlis có nói “Nếu một ngôn ngữ không làm thay đổi cách suy nghĩ của bạn về lập trình thì ngôn ngữ đó không đáng học”. Rất có thể lý do bạn phải học một chút Pascal (hoặc thực tế hơn là Visual Basic hay Javascript) là vì bạn phải dùng một công cụ sẵn có nào đó để hoàn thành nhiệm vụ của bạn. Trong trường hợp này, bạn không học lập trình, bạn đang học cách hoàn thành nhiệm vụ.
  • Trong 3 ngày: Thật đáng tiếc, 3 ngày không đủ cho bạn, như sẽ thảo luận chi tiết hơn ở phần tiếp theo.

Tự học lập trình trong 10 năm
Một số nhà nghiên cứu (Hayes, Bloom) cho rằng phải mất khoảng 10 năm để đạt đến mức tinh thông về một lĩnh vực nào đó – bao gồm đánh cờ, soạn nhạc, vẽ tranh, chơi đàn piano, bơi, tennis… Hình như không có trường hợp ngoại lệ nào: ngay cả Mozart, người được xem là thần đồng âm nhạc vào năm lên 4, cũng phải mất đến 13 năm nữa mới sáng tác ra những kiệt tác âm nhạc. Trong một thể loại khác, ban nhạc The Beatles dường như đã từ chỗ vô danh leo thẳng lên vị trí số 1 bằng một loạt các #1 hit, và xuất hiện trong sô của Ed Sullivan năm 1964. Thực ra, The Beatles đã bắt đầu chơi trong các quán bar nhỏ ở Liverpool và Hamburg từ năm 1957, mặc dù họ đã tạo được sự thu hút từ rất sớm, nhưng thành công lớn thực sự của The Beatles – Sgt. Peppers – ra đời năm 1967. Sammuel Johnson cho rằng để đạt được sự hoàn hảo phải mất hơn 10 năm: “Sự hoàn hảo trong bất cứ một lĩnh vực nào chỉ có thể đạt được bằng cách làm việc cật lực trong suốt cuộc đời; nó không thể mua được với một cái giá rẻ hơn”. Còn Chaucer thì than phiền “Đời thì quá ngắn, mà thời gian học nghề thì quá lâu”
Còn đây là công thức của tôi để thành công trong lập trình:
  • Tìm thấy hứng thú trong việc lập trình và đảm bảo bạn còn đủ hứng thú để đeo đuổi công việc này trong 10 năm.
  • Trao đổi với các lập trình viên khác. Đọc những chương trình do người khác viết. Điều này quan trọng hơn bất cứ cuốn sách học khóa huấn luyện nào.
  • Lập trình. Cách học tốt nhất là vừa học vừa làm. Nói theo cách của giới chuyên môn thì “năng suất tối đa của mỗi người không đơn thuần chỉ do kinh nghiệm, năng suất tăng lên - ngay cả đối với người giàu kinh nghiệm - là kết quả của những cố gắng để hoàn thiện.” và “cách học có hiệu quả nhất cần có: mục đích được xác định rõ ràng với độ khó thích hợp, ý kiến đóng góp phê bình, cơ hội làm lại và sửa sai.” Cuốn Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life là một tài liệu tham khảo thú vị cho quan điểm này.
  • Nếu bạn muốn hãy theo học đại học (hoặc cao học). Như vậy, bạn sẽ thêm cơ hội để làm những công việc đòi hỏi bằng cấp, và cũng giúp bạn có một hiểu biết sâu sắc hơn, nhưng nếu bạn không thích môi trường trường học, bạn vẫn có thể (với một chút cố gắng nhất định) thu được kiến thức tương tự từ công việc. Trong mọi trường hợp, học từ sách sẽ không đủ. Eric Raymond, tác giả cuốn The New Hacker’s Dictionary nói: “Các chương trình giảng dạy về máy tính không thể biến bạn thành một chuyên gia máy tính, cũng giống như nghiên cứu chổi vẽ và bột màu cũng chẳng biến bạn thành một họa sĩ”. Một trong số những lập trình viên xuất sắc nhất mà tôi đã từng mướn chỉ học hết trung học; anh ta đã viết rất nhiều phần mềm tuyệt vời; có news group của riêng anh; và kiếm được đủ tiền từ stock options để mua cho mình một nightclub.
  • Làm việc chung với các lập trình viên khác. Hãy là lập trình viên giỏi nhất trong một số projects; là người kém nhất trong vài projects khác. Khi bạn là người giỏi nhất, bạn kiểm tra khả năng lãnh đạo của mình, và truyền cảm hứng cho người khác từ sư sắc sảo và tầm nhìn của mình. Khi bạn là người kém nhất, bạn học từ những việc mà người giỏi làm, và từ những việc họ không thích làm (vì họ sẽ bắt bạn làm thay họ)
  • Làm việc với các projects sau những lập trình viên khác. Cố gắng hiểu các chương trình viết bởi người khác. Để ý xem cần phải có những gì để hiểu và sửa nó lúc không có tác giả của chương trình. Thiết kế chương trình của bạn để những người làm việc sau bạn có thể bảo trì, sửa chữa nó một cách dễ dàng.
  • Học ít nhất là nửa tá ngôn ngữ lập trình. Bao gồm ít nhất là một ngôn ngữ hỗ trợ class abstractions (như Java hay C++), một ngôn ngữ hỗ trợ functional abstraction (như LISP hay ML), môt ngôn ngữ hỗ trợ syntactic abstraction (như LISP), môt ngôn ngữ hỗ trợ declarative specifications (như Prolog hay C++ template), một ngôn ngữ hỗ trợ coroutines (như Icon hay Scheme) và một ngôn ngữ hỗ trợ parallelism (như Sisal).
  • Nhớ rằng có chữ “computer” trong “computer science”. Bạn cần biết thời gian máy tính của bạn thực hiện một lệnh là bao lâu; thời gian để máy tính tìm một word trong bộ nhớ (khi word đó có và không có trong cache); thời gian đọc các word kế tiếp nhau từ đĩa cứng; và thời gian tìm đến một vị trí mới trong đĩa cứng.
  • Tham gia vào các cố gắng để tiêu chuẩn hóa ngôn ngữ lập trình. Đó có thể là cuộc họp của hội đồng ANSI C++, nhưng cũng có thể chỉ là quyết định xem nhóm lập trình của bạn sẽ dùng 2 hay 4 khoảng trắng ở đầu mỗi dòng. Bằng cách nào thì bạn cũng học được mọi người thích gì ở một ngôn ngũ lập trình, mức độ, và có lẽ hiểu được một chút tại sao họ lại cảm thấy như vậy.
  • Hoàn tất việc tiêu chuẩn hóa ngôn ngữ càng nhanh càng tốt.

Nếu theo công thức này, bạn thử tính xem bạn có thể học được bao nhiêu chỉ từ sách vở. Trước khi đứa con đầu lòng của tôi ra đời, tôi đã nghiền ngẫm tất cả các cuốn sách Làm cách nào để … mà vẫn cảm thấy mình vẫn chẳng biết gì. 30 tháng sau, khi đứa con thứ 2 của tôi chào đời, tôi có đọc lại những cuốn sách đó không? Không. Thay vào đó tôi dựa theo kinh nghiệm của mình, mà hóa ra là những kinh nghiệm này lại có ích và làm cho tôi yên tâm hơn hàng ngàn trang sách viết bởi các chuyên gia.
Fred Brooks, trong bài No Silver Bullets đã đưa ra một kế hoạch gồm 3 giai đoạn để tìm một người thiết kế phần mềm xuất sắc:
  • Tìm kiếm có một cách có hệ thống những người thiết kế phần mềm giỏi nhất càng sớm càng tốt.
  • Phân công các cố vấn nghề nghiệp để giúp đỡ họ thăng tiến trong công việc và theo dõi hồ sơ nghề nghiệp của họ.
  • Tạo cơ hộ để họ trao đổi và cạnh tranh lẫn nhau

Kế hoạch này dựa trên giả thiết là đã tìm được những người đã có sẵn các đức tính để trở thành một người thiết kế phần mềm xuất sắc, và công việc chỉ là tạo điều kiện để họ phát triển. Alan Perlis nói một cách ngắn gọn hơn: “Nếu tất cả mọi người đều có thể học được điêu khắc thì có lẽ Michelangelo đã được dạy để làm ngược lại. Với các lập trình viên xuất sắc cũng vậy.”
Bạn cứ mua cuốn sách Java đó đi, có lẽ bạn sẽ thấy nó có ích. Nhưng, là một lập trình viên, bạn sẽ không thay đổi cuộc đời bạn, hay trình độ của bạn trong 24 giờ, 24 ngày, thậm chí 24 tháng.

Phụ lục: Lựa chọn ngôn ngữ lập trình
Rất nhiều người hỏi tôi: nên bắt đầu từ ngôn ngữ lập trình nào. Không có một câu trả lời chung, nhưng bạn hãy cân nhắc những điểm sau:
Dùng ngôn ngữ lập trình mà bạn bè dùng: Khi người ta hỏi tôi: “Tôi nên dùng hệ điều hành nào, Windows, Unix, hay Mac?” câu trả lời của thôi thường là “Hãy dùng hệ điều hành mà bạn bè của bạn dùng”. Những gì bạn học từ bạn bè quá đủ đề bù đắp những điểm khác nhau giữa các hệ điều hành, hoặc giữa các ngôn ngữ lập trình. Cũng nên xem xét đến những bạn bè tương lai của bạn: cộng đồng lập trình viên mà bạn sẽ là tham gia nếu bạn tiếp tục. Ngôn ngữ mà bạn chọn có một cộng đồng đang phát triển hay đang lụi tàn? Có sách, có website, có diễn đàn để tìm kiếm câu trả lời cho những vấn đề mà bạn gặp phải hay không? Bạn có thích mọi người trên các diễn đàn đó hay không?
Đơn giản. Những ngôn ngữ lập trình như C++Java được thiết kế cho những nhóm làm việc gồm nhiều lập trình viên giàu kinh nghiệm và mối quan tâm của họ là hiệu quả của chương trình. Hậu quả là chúng đã bị phức tạp hóa đề phục vụ cho mục đích này. Mối quan tâm chính của bạn là học lập trình, bạn chưa cần đến sự phức tạp đó. Bạn muốn một ngôn ngũ được thiết kế thật đơn giản, dễ học, dễ nhớ cho một người mới bắt đầu.
Chơi. Nếu bạn muốn học chơi piano, bạn sẽ học chơi theo cách nào: (1)bạn muốn nghe thấy note nhạc ngay sau khi bạn gõ vào phím đàn (interactive mode) hay (2) bạn muốn nghe lại toàn bộ các notes sau khi bạn hoàn tất bản nhạc (batch mode). Rõ ràng cách 1 giúp bạn học piano dễ dàng hơn, và học lập trình cũng vậy. Tìm một ngôn ngữ lập trình có hỗ trợ interactive mode và dùng nó.
Dựa trên những tiêu chuẩn trên, ngôn ngũ lập trình cho người mới bắt đầu mà tôi giới thiệu là Python hay Scheme. Nhưng tùy vào hoàn cảnh của bạn, còn có nhiều chọn lựa tốt khác. Với các lập trình viên tương lai còn đang trong lứa tuổi nhi đồng, thì Alice hoặc Squeak có lẽ thích hợp nhất. Điều quan trọng là bạn chọn nó và hãy bắt đầu.
Source here
http://my.opera.com/lechuck60/blog/tu-hoc-lap-trinh-trong-10-nam-peter-norvig

Friday, November 13, 2009

Google lại gây sốc với ngôn ngữ lập trình Go

Go là một ngôn ngữ lập trình hoàn toàn mới. Nó gần giống như C và C++ nhưng được bổ sung những đặc tính rất hiện đại và có thể sử dụng ngay trong trình duyệt

Hãng tìm kiếm và Internet khổng lồ Google vừa tiếp tục gây sốc với thế giới khi tiết lộ dự án phát triển một ngôn ngữ lập trình hoàn toàn mới với tên gọi Go và hy vọng ngôn ngữ này sẽ giúp thúc đẩy sức mạnh của ngành công nghiệp điện toán, máy tính và “mang đến cho các nhà lập trình những năng lực mới với những trải nghiệm hoàn toàn mới”.

Những thông tin ban đầu về dự án này đã được Google tiết lộ hôm 10/11 và họ đang lên tiếng kêu gọi những chuyên gia khác tham gia vào dự án nguồn mở này.


Linh vật biểu tượng của Google Go

Bấy lâu nay ngành công nghiệp điện toán vẫn đang “mắc kẹt” giữa 2 xu hướng: Xây dựng từ đầu hay tiếp tục phát triển thêm dựa trên những công nghệ đã có sẵn. Sự giới hạn của thiết kế phần cứng và công nghệ lập trình hiện nay đã khiến Google nảy sinh ý tưởng cho ra đời Go.

Dự án Google Go bao gồm một ngôn ngữ lập trình và một chương trình đóng gói giúp những lập trình viên đưa sản phẩm của họ thành một phần mềm có thể chạy trên máy tính. “Nó gần giống như C và C++ nhưng đã được tích hợp thêm những đặc tính hiện đại và có đủ sự linh hoạt để sử dụng ngay trong trình duyệt web”, Pike – kỹ sư trưởng của dự án tiết lộ.

Nhưng giữa việc cho ra đời một ngôn ngữ lập trình mới và đưa nó thành một “thế lực” trong lĩnh vực CNTT vẫn tồn tại một khoảng cách rất xa. Sun Microsystems là một ví dụ. Họ đã rất thành công với Java nhưng lại thất bại nặng nề với Fortress.

Nhưng Go có những thứ mà các ngôn ngữ khác không có.

Trước tiên, đó là một dự án của Google, một công ty có đủ tiềm lực và điều kiện để biến bất cứ một thứ gì đó trở nên hữu dụng bằng việc khai thác hàng trăm ngàn máy chủ và vô số những lập trình viên nội bộ của mình. Một phiên bản thử nghiệm của Google thậm chí còn có giá trị và ứng dụng thương mại lớn gấp nhiều lần một sản phẩm thực thụ và hoàn chỉnh của nhiều công ty khác. Và Go là một sản phẩm được Google đang rất ưu ái.

"Chúng tôi không có ý định thử nghiệm nó mãi mãi", Pike nói, "Chúng tôi muốn xây dựng một cái gì đó thực sự có nghĩa bằng dự án này".

Thứ hai, Go đang được những chuyên gia “sừng sỏ” nhất của Google dẫn dắt.

Đó là Thompson, người đã giành giải thưởng Turing Award năm 1983 (một giải thưởng được đánh giá là “giải Nobel trong lĩnh vực điện toán”) và Huy chương quốc gia về công nghệ năm 1998 Thompson cũng là người đã góp phần đưa ngôn ngữ lập trình B ra đời và sau đó được thay thế bằng C.


Rob Pike - kỹ sư trưởng của dự án (Ảnh: Cnet)

Người thứ hai là Pike, trưởng kỹ sư phần mềm, một trong những thành viên của nhóm phát triển Unix tại Bell Labs. Pike và Thompson đã có nhiều năm làm việc cùng nhau để tạo ra bộ mã font chữ Unicode UTF-8 rất phổ biến ngày nay.

Người thứ 3 là Robert Griesemer, người đã có công viết chương trình đóng gói HotSpot cho Java và V8 – bộ mã JavaScript đang được sử dụng trong trình duyệt Chrome.

Và còn rất nhiều những tên tuổi khác nữa.

Cái tên “Go” (có nghĩa là: Đi) thể hiện sự thách thức đối với nhóm dự án, nó khiến mọi người liên tưởng đến Google và quan trọng hơn cả là nó sẽ nhắc nhở chúng tôi rằng ý tưởng này cần phải đi được đến cái đích nào đó”, Pike cho biết.

Friday, October 30, 2009

Tự tạo chương trình nghe nhạc bằng VB 6.0

Các điều khiển của VB thật dồi dào, và vẫn liên tục phát triển, điều này giúp cho người lập trình nhanh chóng cho ra lò một sản phẩm không đến nỗi nào, mà chỉ trong một thời gian rất ngắn. Bài viết này trình bày về chương trình nghe nhạc số (MP3,WAV,MID) sử dụng điều khiển Windows Media Player, chương trình có khả năng phát tuần tự từng bài trong danh sách, save danh sách bài hát vào một file, cho phép Browse để chọn các bài hát và thêm vào danh sách, có chức năng ghi các thông tin cấu hình vào Registry để lưu giữ, khi chạy chiếm rất ít tài nguyên hệ thống, khởi động tức thì. Giao diện đơn giản dễ sử dụng, có các chức năng tối thiểu của một trình nghe nhạc, có mã nguồn hoàn chỉnh đi kèm

Chương trình này sử dụng file danh sách là một file kiểu bản ghi, điều này có lợi thế là truy xuất nhanh, thêm xoá sửa cũng dễ dàng hơn, nhưng bù lại kích thước file khá lớn.

Với chương trình này bạn đã sở hữu trong tay một máy nghe nhạc, và với một chút kiến thức lập trình bạn có thể làm cho giao diện cũng như hoạt động của nó chuyên nghiệp hơn, chương trình còn nhiều hạn chế, tôi rất mong các bạn cải tiến cho nó mạnh hơn nữa.

Giao diện chương trình

Mã nguồn của chương trình.

Tôi không liệt kê thuộc tính của các control được sử dụng trong chương trình vì đã có mã nguồn hoàn chỉnh đi kèm, bạn chỉ việc download project này về ổ cứng, giải nén và mở nó bằng Visual Basic là xong. Tôi sử dụng Visual Basic 6.0, Windows 98 SE, nếu bạn dùng các phiên bản cũ hơn có thể chương trình không chạy.

1. Tạo một Project mới

Thêm vào Project một Modul với tên là Modul1

- Nội dung:

Option Explicit
'Kiểu bản ghi của file danh sách, chỉ gồm 2 trường
Type Media
Path As String * 250
Name As String * 100
'Tên file bài hát không dài quá 250 ký tự
'Đường dẫn không dài quá 100 ký tự
End Type

2. Đặt tên cho Form hiện hành là frmMedia

- Nội dung:

Dim Song As Media
Dim DATAfile As String
Dim
RecEnd
Dim i, Filenum, Sogia As Integer
Dim p

'Hàm kiểm tra sự tồn tại của 1 file
Function FileExists(FileName) As Boolean
Dim Msg As String
On Error GoTo CheckError
FileExists = (Dir(FileName) <> "")
Exit Function
CheckError:
Const mnErrDiskNotReady = 71, mnErrDeviceUnavailable = 68
If (Err.Number = mnErrDiskNotReady) Then
Msg = "Put a floppy disk in the drive."
If MsgBox(Msg, vbExclamation & vbOKCancel) = vbOK Then
Resume
Else

Resume Next
End
If
ElseIf Err.Number = mnErrDeviceUnavailable Then
Msg = "This drive or path does not exist: " & FileName
MsgBox Msg, vbExclamation
Resume Next
Else

Msg = "Unexpected error #" & Str(Err.Number) & " occurred: " _
& Err.Description
MsgBox Msg, vbCritical
Stop
End
If
Resume
End
Function

Private Sub cmdCapNhat_Click()
Capnhat
End Sub

Private Sub Command1_Click()
PopupMenu mnuSetting
End Sub

Private Sub Capnhat()
Filenum = FreeFile
Open DATAfile For Random As #Filenum Len = Len(Song)
RecEnd = FileLen(DATAfile) / Len(Song)
For i = 1 To RecEnd
Get #Filenum, i, Song
List1.AddItem (Trim(Song.Name))
List2.AddItem (Trim(Song.Path))
Next i
Close #Filenum
End Sub

Private Sub Form_Load()
Volume1.Value = 10 'Giá trị mặc định của Volume khi khởi động

'Mở file danh sách
If Len(App.Path) > 3 Then
DATAfile = App.Path & "\TMedia.lst"
Else
DATAfile = App.Path & "TMedia.lst"
End If
mnuRepeat.Checked = True
mnuMini.Checked = False
On Error Resume Next
mnuMini.Checked = GetSetting("FastRun 1.0", "Media", "Check Mini")
mnuRepeat.Checked = GetSetting("FastRun 1.0", "Media", "Check Repeat")
frmMedia.Top = GetSetting("FastRun 1.0", "Media", "Media Top")
frmMedia.Left = GetSetting("FastRun 1.0", "Media", "Media Left")
List1.BackColor = GetSetting("FastRun 1.0", "Media", "Back Color")
List1.ForeColor = GetSetting("FastRun 1.0", "Media", "Text Color")
mnuDam.Checked = GetSetting("FastRun 1.0", "Media", "Font Bold")
Hengio = GetSetting("FastRun 1.0", "Media", "Time Song")
Volume1.Value = GetSetting("FastRun 1.0", "Media", "Volume")
CheckDefaultList = GetSetting("FastRun 1.0", "Media", "DefaultList")
Capnhat
Mini
Dam
Volume1_Scroll
End Sub

Private Sub SaveReg()

'Ghi cấu hình vào Registry
On Error Resume Next
SaveSetting "FastRun 1.0", "Media", "Check Mini", mnuMini.Checked
SaveSetting "FastRun 1.0", "Media", "Check Repeat", mnuRepeat.Checked
SaveSetting "FastRun 1.0", "Media", "Media Top", frmMedia.Top
SaveSetting "FastRun 1.0", "Media", "Media Left", frmMedia.Left
SaveSetting "FastRun 1.0", "Media", "Volume", Volume1.Value
SaveSetting "FastRun 1.0", "Media", "Font Bold", mnuDam.Checked
SaveSetting "FastRun 1.0", "Media", "Back Color", List1.BackColor
SaveSetting "FastRun 1.0", "Media", "Text Color", List1.ForeColor
DeleteSetting "FastRun 1.0", "Media", "Time Song"
End Sub

Private Sub KetThuc()
SaveReg
Unload frmMedia
Unload frmAuthor
Unload frmOpen
End Sub

Private Sub Form_Unload(Cancel As Integer)
KetThuc
End Sub

Private Sub List1_DblClick()
If FileExists(List2.List(List1.ListIndex)) = True Then
MediaPlayer1.FileName = List2.List(List1.ListIndex)
ThanhCong = True
Else
If List1.ListIndex = List1.ListCount - 1 And ThanhCong = False Then
MsgBox "TÊt c¶ c¸c bµi trong danh s¸ch ®Òu sai ®­êng dÉn hoÆc tªn file." + vbCrLf + "B¹n cÇn n¹p l¹i danh s¸ch !", vbCritical, "Media - Warning"
Else
HetBai
End If
End If
End Sub


Private Sub HetBai()
If mnuRepeat.Checked = True And List1.ListCount > 0 Then
If List1.ListIndex + 1 < style="color: blue;">Then
List1.ListIndex = List1.ListIndex + 1
Else
List1.ListIndex = 0
ThanhCong = False
End If
On Error Resume Next
List1_DblClick
End If
End Sub

Private Sub List1_KeyPress(KeyAscii As Integer)
If Keyascii = 13 Then
List1_DblClick
End If
End Sub

Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If List1.ListIndex >= 0 Then
List1.ToolTipText = Left(List1.List(List1.ListIndex), Len(List1.List(List1.ListIndex)) - 3)
End If
End Sub

Private Sub MediaPlayer1_EndOfStream(ByVal Result As Long)
'Hành động khi hết một bài

HetBai
End Sub

Private Sub mnuAdd_Click()
frmOpen.Show vbModal
End Sub

Private Sub mnuAuthor_Click()
frmAuthor.Show
End Sub

Private Sub mnuDelete_Click()
frmListEdit.Show
End Sub

Private Sub mnuChu_Click()
CommonDialog1.Color = List1.ForeColor
CommonDialog1.Action = 3
List1.ForeColor = CommonDialog1.Color
End Sub

Private Sub mnuDam_Click()
If mnuDam.Checked = False Then
List1.FontBold = False
mnuDam.Checked = True
Else
List1.FontBold = True
mnuDam.Checked = False
End If
Dam
End Sub

Private Sub Dam()
If mnuDam.Checked = False Then
List1.FontBold = False
Else
List1.FontBold = True
End If
End Sub

Private Sub mnuExit_Click()
KetThuc
End Sub

Private Sub mnuMini_Click()
If mnuMini.Checked = True Then
mnuMini.Checked = False
Else
mnuMini.Checked = True
End If
Mini
End Sub

Private Sub Mini()
If mnuMini.Checked = True Then
List1.Height = 255
frmMedia.Height = 1740
List1.ListIndex = List1.ListIndex
Else
List1.Height = 2400
frmMedia.Height = 3885
End If
End Sub

Private Sub mnuNumber_Click()
If mnuNumber.Checked = True Then
mnuNumber.Checked = False
Else
mnuNumber.Checked = True
End If
End Sub

Private Sub mnuNen_Click()
CommonDialog1.Color = List1.BackColor
CommonDialog1.Action = 3
List1.BackColor = CommonDialog1.Color
End Sub

Private Sub mnuRepeat_Click()
If mnuRepeat.Checked = True Then
mnuRepeat.Checked = False
Else
mnuRepeat.Checked = True
End If
End Sub

Private Sub Text1_Click()
Text1.Text = Str(MediaPlayer1.Volume)
End Sub

Private Sub Volume1_Scroll()
Select Case Volume1.Value
Case 13: Sogia = 0
Case 12: Sogia = -40
Case 11: Sogia = -90
Case 10: Sogia = -180
Case 9: Sogia = -280
Case 8: Sogia = -410
Case 7: Sogia = -500
Case 6: Sogia = -650
Case 5: Sogia = -860
Case 4: Sogia = -1100
Case 3: Sogia = -1350
Case 2: Sogia = -1900
Case 1: Sogia = -2600
Case 0: Sogia = -9640
End Select
MediaPlayer1.Volume = Sogia
End Sub

3. Tạo một form mới đặt tên là frmOpen

-Nội dung:

Option Explicit
Dim SongOpen As Media
Dim i, CurrentSong, Filenum As Integer
Dim PathSong As String
Dim DATAfile As String
Dim RecEnd

Function FileExists(FileName) As Boolean
Dim Msg As String
On Error GoTo CheckError
FileExists = (Dir(FileName) <> "")
Exit Function
CheckError:
Const mnErrDiskNotReady = 71, mnErrDeviceUnavailable = 68
If (Err.Number = mnErrDiskNotReady) Then
Msg = "Put a floppy disk in the drive."
If MsgBox(Msg, vbExclamation & vbOKCancel) = vbOK Then
Resume
Else
Resume Next
End If
Else If Err.Number = mnErrDeviceUnavailable Then
Msg = "This drive or path does not exist: " & FileName
MsgBox Msg, vbExclamation
Resume Next
Else
Msg = "Unexpected error #" & Str(Err.Number) & " occurred: " _
& Err.Description
MsgBox Msg, vbCritical
Stop
End If
Resume
End Function

Private Sub cmdAddAll_Click()
If Len(Dir1.Path) = 3 Then
PathSong = Dir1.Path
Else
PathSong = Dir1.Path + "\"
End If
For i = 0 To File1.ListCount - 1
List1.AddItem (File1.List(i))
List2.AddItem (PathSong + File1.List(i))
Next i
If cmdClear.Enabled = False Then
cmdClear.Enabled = True
End If
KTnutClear
End Sub

Private Sub cmdCancel_Click()
Unload frmOpen
End Sub

Private Sub cmdClear_Click()
KTnutClear
If cmdClear.Enabled = True Then
If List1.ListIndex <> 0 Then
List1.ListIndex = 0
End If
CurrentSong = List1.ListIndex
List1.RemoveItem (CurrentSong)
List2.RemoveItem (CurrentSong)
If List1.ListCount < style="color: rgb(51, 102, 255);">Then
List1.ListIndex = List1.ListCount - 1
End If
If List1.ListCount = 0 Then
cmdClear.Enabled = False
End If
End If
End Sub

Private Sub cmdClearAll_Click()
KTnutClear
If cmdClearAll.Enabled = True Then
List1.Clear
List2.Clear
End If
End Sub

Private Sub cmdOK_Click()
'save in file
If Len(App.Path) > 3 Then
DATAfile = App.Path + "\TMedia.lst"
Else
DATAfile = App.Path + "TMedia.lst"
End If
If FileExists(DATAfile) = True Then
Kill DATAfile
End If
frmMedia.List1.Clear
frmMedia.List2.Clear
If List1.ListCount > 0 Then
Filenum = FreeFile
Open DATAfile For Random As #Filenum Len = Len(SongOpen)
If List1.ListCount > 0 Then
For i = 0 To List1.ListCount - 1
SongOpen.Name = List1.List(i)
SongOpen.Path = List2.List(i)
Put #Filenum, i + 1, SongOpen
Next i
End If
Close #Filenum
frmMedia.cmdCapNhat.Value = True
End If
Unload frmOpen
frmMedia.SetFocus
End Sub


Private Sub Combo1_Click()
File1.Pattern = Combo1.Text
If Combo1.ListIndex = 1 Then
cmdAddAll.Enabled = False
MsgBox "NÕu b¹n chän kiÓu file lµ '' *.* '', b¹n sÏ kh«ng thªm ®­îc file vµo danh s¸ch", vbCritical, "Warning"
Else
cmdAddAll.Enabled = True
End If
End Sub

Private Sub Dir1_Change()
File1.Path = Dir1.Path
KTnutAddAll
End Sub

Private Sub Dir1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Dir1.Path = Dir1.List(Dir1.ListIndex)
'File1_DblClick
End If
End Sub

Private Sub Drive1_Change()
On Error Resume Next
Dir1.Path = Drive1.Drive
If Err Then
MsgBox "Kh«ng t×m thÊy ®Üa", vbCritical, "Media - Warning"
Drive1.Drive = Dir1.Path
End If
End Sub

Private Sub File1_DblClick()
If File1.Pattern <> "*.*" Then
If Len(Dir1.Path) = 3 Then
PathSong = Dir1.Path + File1.FileName
Else
PathSong = Dir1.Path + "\" + File1.FileName
End If
List1.AddItem (File1.FileName)
List2.AddItem (PathSong)
If cmdClear.Enabled = False Then
cmdClear.Enabled = True
End If
KTnutClear
Else
MsgBox "B¹n cÇn ®Æt kiÓu file trong hép Pattern lµ ''*.mp3;*.wav;*.mid''", vbCritical, "Media - Warning"
End If
End Sub

Private Sub File1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
File1_DblClick
End If
End Sub

Private Sub Form_Load()
For i = 0 To frmMedia.List1.ListCount - 1
List1.AddItem (frmMedia.List1.List(i))
List2.AddItem (frmMedia.List2.List(i))
Next i
KTnutAddAll
KTnutClear
Combo1.ListIndex = 0
File1.Pattern = Combo1.Text
File1.Hidden = True
File1.ReadOnly = True
File1.System = True
End Sub

Private Sub KTnutAddAll()
If File1.ListCount > 0 And File1.Pattern <> "*.*" Then
cmdAddAll.Enabled = True
Else
cmdAddAll.Enabled = False
End If
End Sub

Private Sub KTnutClear()
If List1.ListCount > 0 Then
cmdClear.Enabled = True
cmdClearAll.Enabled = True
Else
cmdClear.Enabled = False
cmdClearAll.Enabled = False
End If
End Sub


4.Tạo thêm một form đặt tên là frmAuthor

-Nội dung:

Đây là form ghi thông tin về tác giả chương trình, tuỳ ý bạn

Thiết kế chương trình duyệt file âm thanh

MediaPlayer của Windows từ version 6.x trở đi có thể player được rất nhiều dạng thức tập tin Multimedia khác nhau như: .avi, .asf, .asx, .rmi, .wav ; .ra, .ram, .rm, .rmm ; .mpg, .mpeg, .m1v, .mp2, .mpa, .mpe ; .mid, .rmi ; .qt, .aif, .aifc, .aiff, .mov ; .au, .snd ... Chất lượng cũng được cải thiện rất rõ rệt so với các phiên bản trước.

Nếu bạn đang sử dụng Windows 98 thì MediaPlayer đã sẵn sàng, nếu dùng Windows 95, 97 bạn buộc phải cài đặt bổ sung để lên đời MediaPlayer của mình. Bạn có thể tìm bộ nâng cấp trên các CDROM phần mềm hay nằm chung trong bộ Internet Explorer 4.01 SP2.

Các file multimedia hiện này tràn ngập trên Internet, CDROM, rất nhiều. Đặc biệt là MP3 & Midi, 2 loại file này rất thịnh hành và đang được ưa chuộng.

Cái gì nhiều cũng gây nên ý tưởng (nói dúng hơn là sinh tật). Mặc dù chỉ cần double click lên file Mp3 hay Midi trong một trình quản lý file là có thể Play được một cách dễ dàng nhờ MediaPlayer của Windows nhưng cái gì của riêng mình mới khoái.

Chính vì vậy trong bài viết này tôi xin mạn phép hướng dẫn các bạn tự thiết kế một MediaPlayer rất tiện dụng và để dành làm của riêng. Tuy nhiên nói của riêng không phải là tự làm hết mà chúng ta phải dùng một bản sao của MediaPlayer trong chương trình.

Khái quát về chương trình

Chúng ta sẽ thiết kế chưong trình có giao diện như sau:

Đầu tiên người dùngười chọn ổ đĩa, thư mục có chứa các file Multimedia (thí dụ là file Midi). Kế đến nhấn nút Play hoặc double click trên tên file cần phát để nghe nhạc.

Ngoài ra còn có các nút Help, Author, Exit

Phía dưới là một MediaPlayer được nhúng vào chương trình, có thể điều chỉnh các chức năng như một chương trình riêng biệt (bạn có thể right click để mở menu tắt quen thuộc như khi dùng MediaPlayer), ở cuối của cửa sổ có dòng thông báo tên file & đường dẫn đang Play.

Các xác lập trong hộp thoại Options của MediaPlayer

Phía dưới của hộp chọn thư mục có một Text box dùng để lọc file. Các loại file này ngăn cách bởi dấu chấm phảy ";". Thí du như bạn muốn lọc các file MP3 & MIDI thì gõ vào: *.mp3;*.mid

Cũng lưu ý thêm là: nếu như trong hộp liệt kê tên file không có file nào, thì nút Play bị vô hiệu hoá (Enabled=False). Chỉ khi nào có file nút Play mới có tác dụng.

Thiết kế giao diện

Bạn hãy khởi động Visual Basic và bắt tay vào việc tạo dáng cho ứng dụng của mình. Cách bố trí các Control trên form tùy theo ý mỗi người, riêng tôi, tôi trình bày như sau:

Các thuộc tính & Caption của các Control trong chương trình:

FORM

Form1.caption = "MediaPlayer - Browser"

Form1.BorderStyle = 1-Fixed Single

Form1.Minbutton=True

TEXTBOX/LABELBOX

Text1.text="*.mid;*.mp3"

Label1.caption=""

COMMAND BUTTON

cmdPlay.caption="&Play"

cmdPlay.enabled=False

cmdHelp.caption="&Help"

cmdAuthor.caption="&Author"

cmdExit.caption="&Exit"

Trên thanh Toolbox của Visual Basic không có đối tượng MediaPlayer. Bạn phải dùng một Custom Control để thêm đối tượng đó vào.

Nhấn CTRL - T. Trong hộp thoại Components chọn Windows MediaPlayer (thường ở cuối danh sách), Click nút OK

Đối tượng MediaPlayer sẽ được thêm vào Toolbox, việc còn lại, chỉ cần vẽ nó lên form, đặt ở vị trí thích hợp (nó có tên mặc nhiên là MediaPlayer1)

Viết Code

Đầu tiên bạn cần cho bộ 3 control: Drive1, Dir1, File1 hoạt động. Hãy gõ đoạn Code sau đây để cho chúng "hiểu nhau"

Private Sub Dir1_Change()

File1.Path = Dir1.Path

If File1.ListCount = 0 Then
'Kiểm tra xem có file nào trong listbox File1 chưa

cmdPlay.Enabled = False
'Nếu chưa có thì vô hiệu nút Play

Else

cmdPlay.Enabled = True
'Nếu có rồi thì cho hiệu lực nút Play

End If

End Sub

Private Sub Drive1_Change()

Dir1.Path = Drive1.Drive

End Sub

Double click lên nút Play và viết

Private Sub Command1_Click()

MediaPlayer1.filename = Dir1.Path & "\" _
& File1.List(File1.ListIndex)

Label1.Caption = MediaPlayer1.filename

End Sub

Nếu thuộc tính AutoStart của MediaPlayer được gán bằng True. MediaPlayer sẽ tự động Play nếu bạn truyền cho thuộc tính FileName của nó một chuỗi là đường dẫn đến file cần Play. Khi thuộc tính FileName là rỗng, nó sẽ ngừng.

ở đoạn Code trên tôi đã ghép nối các thuộc tính của Drive1, Dir1 & File1 để chỉ ra file cần Play. Đoạn code sẽ gặp lỗi khi các file cần Play nằm ngoài thư mục gốc, bạn hãy tự hoàn chỉnh lấy bằng hàm IIF() hay câu lệnh IF

Dòng thứ 2 dùng để hiển thị đường dẫn file đang Play trong Labelbox ở cuối form.

Nếu muốn khi người dùng Double Click lên tên file trong danh sách file thì MediaPlayer sẽ Play file đó, bạn chỉ cần làm như sau:

Private Sub File1_DblClick()

cmdPlay_Click

End Sub

Để khả năng lọc (Pattern) của File1 hoạt động theo nội dung trong Textbox (Text1). Bạn cần gán các chuỗi trong Textbox do người dùng gõ vào mỗi khi có sự thay đổi (thuộc tính Change của Textbox).

Private Sub Text1_Change()

File1.Pattern = Trim(Text1)

End Sub

Đồng thời lúc chương trình khởi động bạn cũng phải gán nội dung trong Textbox cho thuộc tính Pattern của File1

Private Sub Form_Load()

Text1_Change

End Sub

MediaPlayer còn có một thuộc tính tên là PlayCount - Số lần phát lại một file nhạc, bạn hãy gán cho nó một số thích hợp trong khi thiết kế chương trình.

Khả năng của MediaPlayer còn tùy thuộc vào MediaPlayer đang sử dụng trong Windows của bạn.

Vậy là xong, một chương trình duỵệt file âm thanh, thật là quá đơn giản phải không bạn :-)

Thay lời kết

Bây giờ bạn có thể dịch ra file exe, đem tặng cho bạn bè "làm kỷ niệm". Nhớ chép thêm các file cần thiết cho chương trình nhé. MSDXM.OCX là file chứa Custom Control MediaPlayer đã sử dụng trong chương trình. Hãy nén lại cho chúng thật mi nhon trước khi chép ra đĩa mềm hay gởi kèm theo E-mail.

Trên đây chỉ là một chương trình rất đơn giản, nhưng tính năng có nó thì đáng khâm phục phải không bạn. Còn lại vài chi tiết khác bạn có thể tự mình làm lấy theo ý thích. Bạn có thể thêm vài tính năng nữa cho chương trình trở nên đa dụng, thí dụ như: Play các file Video, tự động Play một loạt các file...

Thủ thuật nhỏ trong VB p11

1. Kiểm tra sự tồn tại của tập tin
Đặt dòng code này vào tập tin .BAS (module) và có thể gọi nó từ bất kỳ đâu trong chương trình của bạn.

Function FileExists(Byval FileName As String)

Dim Exist As Integer

On Local Error Resume Next

Exists = Len(Dir(FileName$))

On Local Error Goto 0

If Exists = 0 Then

FileExists = False

Else

FileExists = True

End If

End Function

Hàm này sẽ nhận tham số là một String (chính là đường dẫn đến file cần kiểm tra sự tồn tại). Trả về một trị kiểu Boolean (TRUE/FALSE), phản ảnh kết quả kiểm tra của hàm.

2. Sử dụng phím Enter như là phím Tab để luân chuyển giữa các Control trên Form

Private Sub Form_KeyPress(KeyAscii As Integer)

If KeyAscii = vbKeyReturn Then 'Bắt phím Enter

SendKeys "{TAB}" 'Giả như người dùng nhấn Tab

KeyAscii = 0 'Huỷ phím Enter

End If

End Sub

Nhớ đặt thuộc tính KeyPreview của Form là TRUE bạn nhé (để cho Form đón các phím nhấn trước các Control trên nó, nếu không bạn sẽ nghe tiếng Beep trong loa chứ chẳng thấy tác dụng gì đâu).

3. Làm cho Form thành TopMost

Là form luôn nằm trên tất cả các cửa sổ khác mặc dù nó không bị kích hoạt (Active).

Khai báo hàm API SetWindowPos trong Module như sau:

#If Win32 Then

Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Global success As Long

#Else

Declare Function SetWindowPos Lib "user" (ByVal hWnd As Integer, _
ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal Y As _
Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As _
Integer) As Integer

Global success As Integer

#End If

Khai báo thêm một số hằng cần thiết trong Module:

Global Const SWP_NOMOVE = 2

Global Const SWP_NOSIZE = 1

Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE

Global Const HWND_TOPMOST = -1

Global Const HWND_NOTOPMOST = -2

Lúc nào muốn cho Form thành TopMost thì dùng đoạn code sau đây:

success = SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)

Như vậy khi muốn Form không TopMost nữa thì:

success = SetWindowPos(Me.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)

Để minh họa, bạn hãy tạo một Project mới.

- Trên Form1 tạo 2 command button là: Command1 & Command2, Add thêm 1 Module (Module1).

- Khai báo hàm API & các hằng trong Module1.

- Lần lượt đặt dòng code thứ nhất cho Command1 (TOPMOST)

success = SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)

- Và dòng code thứ 2 cho Command2 (NOTOPMOST).

success = SetWindowPos(Me.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)

- Lúc này hãy ung dung mà nhấn F5 để chạy thử.

4. Hãy tạo Form mẫu cho riêng mình

Có bao giờ bạn tự hỏi: "Làm sao để tạo riêng cho mình một cái Form (của chính mình) và add nó vào Menu của VB để khi cần cho lệnh Add Form là có thể chèn vào ứng dụng của mình ngay lập tức ?". Giống như các mẫu có sẵn của Vb vậy đó.

Bạn thấy không ? About Dialog, Dialog, Splash Screen, Tip of the Day ... các thứ này bạn đều có thể tại riêng cho mình để chương trình mang một sắc thái riêng, độc đáo, và bất ngờ.

Hãy tạo ra những Form thật ưng ý bằng cách:

- Thay đổi các Properties

- Thêm một số Control cần thiết

- và cái gì bạn thích hoặc hay dùng

- Gõ cả Source Code nếu cần.

Save Form vào thư mục Template\Forms của thư mục chứa chương trình VB (nhớ là chỉ cần Form thôi nhé, không cần tới Project đâu).

Ví dụ như: C:\soft\Microsoft Visual Studio\VB98\Template\Forms

Sau đó bạn hãy vào mục Add Form xem

Lưu ý:

  • Tên File chính là tên sẽ xuất hiện trong danh sách này. Ví dụ hình bên dưới là file "Day la mau Form cua tui.frm"

  • Nếu bạn "dị ứng" với cái mẫu Form nào có sẵn của VB bạn có thể cho nó mất tích bằng cách Delete (hoặc Move đi nơi khác) tập tin tương ứng với tên là xong.

Và hãy nhìn xem

Đáng ghét ở chỗ là nó luôn cho Form của chúng ta vừa tạo vào cuối danh sách, dẫu bạn đặt tên có cả trăm chữ "a" đi nữa thì cũng "đội sổ" như thường. Thôi kệ, có cũng dzui rồi, đứng đâu cũng được miễn lợi hại hơn là OK hà (à không, Open mới chính xác).