• Thứ Hai, 30/08/2010 07:19 (GMT+7)

    Trả lời thư bạn đọc

    BBT
    Mục giải đáp thắc mắc của các bạn đọc do TS. Nguyễn Văn Hiệp phụ trách.

    Q: Xin hướng dẫn tạo điều khiển Windows Media Player bằng hàm API trong VB 6.0, chạy riêng biệt với chương trình điều khiển VB 6.0.

    A: Trước hết bạn cần phân biệt 2 phần tử:

    1. điều khiển (ActiveX) tên là "Windows Media Player" (viết tắt là WMP) là 1 linh kiện phần mềm do Microsoft cung cấp có chức năng "play" nhiều loại file multimedia khác nhau, nó có giao diện chứa 1 số đối tượng giao diện để có thể tương tác trực tiếp với người dùng. Tuy nhiên bản thân nó, điều khiển WMP không thể tự chạy, nó cần được gắn vào 1 phần tử chứa nào đó (container) như trang web, form giao diện của ứng dụng người dùng,... để có thể hoạt động được.

    2. ứng dụng tên là "Windows Media Player" là 1 chương trình do Microsoft cung cấp có chức năng "play" nhiều loại file multimedia khác nhau, nó là form giao diện có gắn điều khiển WMP bên trong. Ta có thể xem ứng dụng Windows Media Player như là 1 "cò" giao tiếp, cung cấp các đối tượng giao diện thân thiện như menu, toolbar để giúp người dùng giao tiếp dễ dàng, mỗi khi người dùng yêu cầu 1 chức năng nào đó, nó sẽ gọi 1 tác vụ tương ứng của điều khiển WMP làm giúp.

    Tóm lại, ta có thể dùng điều khiển WMP thông qua cơ chế tương tác trực tiếp với các đối tượng giao diện của nó, hoặc ta có thể gọi tác vụ trong thư viện hàm API của nó để nhờ thực hiện chức năng tương ứng. Để lập trình sử dụng được điểu khiển WMP, bạn cần tìm hiểu và nắm vững các hàm chức năng của điều khiển WMP. Thông tin cụ thể về các hàm này được trình bày trong bộ MSDN của Microsoft.

    Sau đây là qui trình điển hình xây dựng 1 ứng dụng VB 6.0 nhỏ demo việc chọn file playlist (file chứa nhiều bản nhạc) để chơi bằng điều khiển Windows Media Player:

    1. dùng trình soạn thảo văn bản như NotePad, WordPad để soạn nội dung các file playlist, mỗi file playlist có phần nới rộng là *.asx và được viết bằng ngôn ngữ XML có dạng sau:
    <ASX version = "3.0">
    <TITLE>Cac bai nhac toi ua thich</TITLE>
    <ENTRY>
    <TITLE>Bien nho - Quang Dung</TITLE>
    <REF HREF = "d:\NhacMP3\Bien nho.wma" />
    </ENTRY>
    <ENTRY>
    <TITLE>Loi Cuoi Cho Em - Quang Dung</TITLE>
    <REF HREF = "d:\NhacMP3\Loi Cuoi Cho Em.wma" />
    </ENTRY>
    <ENTRY>
    <TITLE>Vi do la em - Quang Dung</TITLE>
    <REF HREF = "d:\NhacMP3\Vi Do La Em.wma" />
    </ENTRY>
    </ASX>
    Mỗi phần tử <Entry> trong file sẽ đặc tả thông tin về 1 file multimedia mà bạn cần chơi.

    2. chạy VB 6.0, khi cửa sổ "New project" hiển thị, chọn icon "Standard EXE" rồi button Open để tạo mới Project chứa Form đơn giản.

    3. chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm và chọn 2 thư viện có tên là "Microsoft Forms 2 Object Library" và "Windows Media Player" rồi OK để thêm các điều khiển trong 2 thư viện này vào ToolBox của Project hiện hành. Lưu ý thư viện "Microsoft Forms 2 Object Library" chứa các đối tượng giao diện có khả năng xử lý chuỗi văn bản Unicode tiếng Việt.

    4. Chọn Form để hiển thị cửa sổ Properties của nó lên, duyệt tìm trong danh sách mục Font, thay đổi tên font thành "Tahoma" hay tên 1 font nào đó mà bạn chắc chắn hỗ trợ tốt tiếng Việt Unicode.

    5. vẽ Form có 1 TextBox (của Form2) tên là txtFileName, 1 button tên là btnStart, và 1 điều khiển Windows Media Player có tên là WMP1 như sau:

    6. Ấn kép chuột vào button Start để tạo thủ tục xử lý click chuột trên button và viết code như sau:

    Private Sub btnStart_Click()
    Dim pl As IWMPPlaylist
    'tạo đối tượng playlist
    Set pl = WMP1.newPlaylist("pl1", txtFileName.Text)
    'gán đối tượng playlist cho WMP biết
    WMP1.currentPlaylist = pl
    'yêu cầu WMP chơi file playlist
    WMP1.Controls.Play
    End Sub

    7. Chọn menu Run.Start để chạy thử ứng dụng. Khi form ứng dụng hiển thị, hãy nhập thử chuỗi Unicode miêu tả đường dẫn nhận dạng 1 file playlist nào đó cần chơi (thí dụ c:\Danh sách các bài nhạc tôi ưa thích nhất.asx) rồi ấn button Start để chơi file này. WMP sẽ chơi lần lượt từng bài nhạc được đặc tả trong file từ trên xuống, bạn có thể click chuột vào button Next, Previous,... trên đối tượng WMP để yêu cầu chuyển sang bài nhạc kế sau/kế trước...
    Lưu ý là ta chỉ lập trình những chức năng nào mà điều khiển WMP không thể tương tác trực tiếp với người dùng, còn những chức năng nào mà điều khiển WMP có thể giao tiếp trực tiếp với người dùng thì hãy để nó tự làm việc (thí dụ như chức năng Next/Previous).

    Q: Tôi muốn dùng VB 6.0 để tìm văn bản. Ví dụ khi gõ tên của văn bản và nhấn nút tìm kiếm thì nó sẽ hiện lên nội dung của văn bản đó.

    A: Tùy thuộc vào mức độ tìm kiếm văn bản mà thuật giải giải quyết sẽ khác nhau. Nếu chỉ ở mức độ đơn giản như yêu cầu của bạn thì việc giải quyết cũng rất đơn giản: giả sử tất cả các văn bản đều có định dạng *.doc của Word, mỗi văn bản được lưu lên file Word riêng biệt với tên nhận dạng dễ nhớ và dễ truy xuất sau này (thí dụ tên là mã số tài liệu theo qui định của bạn), các file tài liệu đều được đặt chung trong 1 thư mục (thí dụ c:\MyDocument) thì qui trình điển hình để xây dựng ứng dụng tìm và hiển thị văn bản theo yêu cầu của bạn bằng VB 6.0 như sau:

    1. Chạy VB 6.0, tạo Project loại "Standard EXE". Khi Form trống hiển thị, thiết kế form gồm 3 đối tượng cần dùng: 1 label, 1 textbox nhập tên tài liệu và 1 button hiển thị nội dung.

    2. Thiết lập thuộc tính (Name) cho textbox là txtTenTL, thuộc tính (Name) cho button là btnDisp.

    3. Chọn menu Project.Reference để hiển thị cửa sổ "Reference", duyệt tìm trong danh sách và chọn mục "Microsoft Word x.0 Object Library" rồi chọn button Ok để "add" các đối tượng "Word Automation" vào Project ứng dụng.

    4. Nhấn đúp chuột vào button để tạo thủ tục xử lý Click chuột trên button và viết đoạn code VB 6.0 sau đây:

    Option Explicit
    'khai báo hằng miêu tả đường dẫn thư mục chứa các tài liệu
    Const DOCDIR = "c:\MyDocument\"
    'thủ tục xử lý click chuột trên button
    Private Sub btnDisp_Click()
    'khai báo các biến cần dùng
    Dim oWordApp As Word.Application
    Dim oMydoc As Word.Document
    Dim pname As String
    'tạo ứng dụng Word
    Set oWordApp = New Word.Application
    'xây dựng đường dẫn file tài liệu cần hiển thị
    pname = DOCDIR & txtTenTL.Text & ".doc"
    'mở file tài liệu
    Set oMydoc = oWordApp.Documents.Open(pname)
    'hiển thị cửa sổ Word
    oWordApp.Visible = True
    End Sub

    5. Chọn menu Run.Start để chạy ứng dụng, nhập thử tên 1 tài liệu rồi ấn button "Hien thi" và bạn sẽ thấy cửa sổ Word hiển thị tài liệu Word cần xem/xử lý. Bạn làm việc với cửa sổ Word với mọi khả năng của Word đến khi tạo/in/lưu được tài liệu thì bạn có thể đóng cửa sổ Word lại và tiếp tục ứng dụng của bạn.

    Q: Xin hướng dẫn lập trình phần mềm nghe nhạc bằng Visual Basic 6.0.

    A: Hiện có rất nhiều định dạng file nhạc (hay âm thanh tổng quát) khác nhau như mp3, wav,... Thời gian tìm hiểu và nắm vững 1 định dạng file nhạc của 1 người không chuyên như bạn thường khá lớn nên việc viết phần mềm nghe nhạc "tự lập tự cường" thông qua việc đọc và xử lý trực tiếp file nhạc theo định dạng riêng của nó là rất tốn nhiều công sức, thời gian. Hiện nay có nhiều hãng khác nhau đã xây dựng linh kiện (đối tượng) phần mềm để chơi nhạc, thí dụ như đối tượng "Windows Media Player" của Microsoft có thể chơi file multimedia thuộc hầu hết các định dạng phổ biến. Hay đối tượng "Shockware Flash" của hãng Adobe có thể chơi các file Flash theo định dạng *.swf. Cách viết phần mềm nghe nhạc dễ nhất, nhanh nhất, an toàn và ổn định nhất là dùng lại các đối tượng chơi nhạc đã có theo ý tưởng: thêm đối tượng chơi nhạc vào chương trình, chương trình mà bạn viết chỉ đóng vai trò "cò" giao tiếp với người dùng, mỗi lần người dùng ra lệnh chơi 1 file nhạc nào đó, chương trình sẽ nhờ đối tượng chơi nhạc chơi dùm.

    Sau đây là qui trình điển hình để xây dựng 1 ứng dụng VB 6.0 nhỏ demo việc chọn file multimedia để chơi bằng đối tượng Windows Media Player:

    1. chạy VB 6.0, khi cửa sổ "New project" hiển thị, chọn icon "Standard EXE" rồi button Open để tạo mới Project chứa Form đơn giản.

    2. chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm và chọn 2 thư viện có tên là "Microsoft Forms 2 Object Library" và "Windows Media Player" rồi OK để thêm các điều khiển trong 2 thư viện này vào ToolBox của Project hiện hành.

    3. Chọn Form để hiển thị cửa sổ Properties của nó lên, duyệt tìm trong danh sách mục Font, thay đổi tên font thành "Tahoma" hay tên 1 font nào đó mà bạn chắc chắn hỗ trợ tốt tiếng Việt Unicode.

    4. vẽ Form có 1 TextBox (của Form2) tên là txtFileName, 1 button tên là btnStart, và 1 điều khiển Windows Media Player có tên là WMP1 như sau:

    5. Nhấn đúp chuột vào button Start để tạo thủ tục xử lý Click chuột trên button và viết code như sau:

    Private Sub btnStart_Click()
    WMP1.URL = txtFileName.Text
    End Sub

    6. Chọn menu Run.Start để chạy thử ứng dụng. Khi form ứng dụng hiển thị, hãy nhập thử chuỗi Unicode miêu tả đường dẫn nhận dạng 1 file multimedia nào đó cần chơi (thí dụ c:\Tệp bài hát Tiếng đàn Sinh viên.mp3) rồi ấn button Start để chơi file này.

    Q: Tôi muốn xây dựng một công cụ để đo phần mềm. Ví dụ phần mềm viết bằng .Net thì phải đọc được file Assembly của nó xem có bao nhiêu lớp, quan hệ giữa các lớp, thuộc tính, phương thức,... Xin hướng dẫn.

    A: Công cụ mà bạn muốn xây dựng được gọi là phần mềm dịch ngược (reverse engineering). Việc dịch ngược gặp nhiều khó khăn và đòi hỏi nhiều kiến thức hơn là dịch xuôi từ mã nguồn sang mã máy. Về nguyên tắc, để viết được chương trình dịch ngược, ta cần nắm vững định dạng file mã máy, từ định dạng file mã máy này ta mới xác định được các thông tin nào có lưu trong file, dựa vào các thông tin có được ta mới dịch ngược về mã nguồn hay rút trích các thông tin ngữ nghĩa cần thiết như file chứa báo nhiêu class, tên của chúng là gì, quan hệ nội bộ cụ thể giữa các class, quan hệ giữa các class trong file và các class khác nằm trên các file khác, thuộc tính và tác vụ của từng class... 

    Hiện nay file đối tượng được dịch từ mã nguồn Java hay ngôn ngữ .Net thường chứa khá đầy đủ các thông tin mã nguồn nền việc dịch ngược thường cho kết quả rất giống với mã nguồn gốc do người lập trình viết.

    Lưu ý rằng các file mã đối tượng của môi trường run-time khác nhau rất khác nhau, thí dụ file đối tượng của Java rất khác với file đối tượng của ngôn ngữ .Net. Để đọc hiểu định dạng file đối tượng và viết được chương trình dịch ngược cho file đối tượng, bạn cần trang bị nhiều kiến thức chuyên về chương trình dịch.

    Q: Để tạo các nút lệnh ứng dụng trong Form thì phải làm sao? Các câu lệnh cửa sổ?

    A: Nội dung câu hỏi của bạn chưa rõ ràng nên chúng tôi chỉ trả lời tổng quát. Đa số các chương trình ứng dụng trên Windows hiện nay đều có khả năng tương tác trực tiếp với người dùng. Chương trình sẽ dùng nhiều Form, mỗi form chứa nhiều đối tượng giao diện như Button, TextBox, ListBox, Checkbox,… Mỗi loại đối tượng giao diện phục vụ cho 1 khả năng giao diện cụ thể, thí dụ Button cho phép người dùng ra lệnh để thực hiện 1 chức năng nào đó, người lập trình sẽ viết đoạn lệnh thực hiện chức năng trong 1 thủ tục (hay hàm) và kết hợp thủ tục này với Button tương ứng, do đó người ta gọi thủ tục này là thủ tục xử lý sự kiện.

    Hiện nay, hầu hết môi trường lập trình được dùng phổ biến đều là môi trường lập trình trực quan như VB, VC++, JBuilder, NetBean, VC#,… Môi trường lập trình trực quan cho phép ta xây dựng Form giao diện chứa nhiều đối tượng giao diện rất dễ dàng và nhanh chóng, ta chỉ cần đóng vai trò "họa sĩ", chọn từng phần tử giao diện được cung cấp sẵn, vẽ nó ở vị trí và kích thước thích hợp rồi khai báo thủ tục xử lý sự kiện kết hợp với từng sự kiện muốn xử lý trên đối tượng liên quan (thí dụ sự kiện ấn chuột, sự kiện ấn phím, sự kiện dời chuột,…). Tóm lại, nếu bạn dùng môi trường lập trình trực quan để xây dựng ứng dụng thì việc tạo form giao diện chứa nhiều đối tượng giao diện là công việc rất dễ dàng cho dù form cần xây dựng có chứa rất nhiều đối tượng giao diện.

    Theo chúng tôi biết, không có thuật ngữ "câu lệnh cửa sổ", chỉ có thuật ngữ "hàm xử lý sự kiện của cửa sổ". Như trên đã nói, 1 chương trình sẽ dùng từ 1 tới nhiều form giao diện, mỗi form chứa nhiều đối tượng giao diện. Ở cấp độ hệ thống Windows, tất cả mọi phần tử giao diện (dù là form hay là button, textbox, listbox,…) đều là cửa sổ (window). Trong khi cửa sổ hiển thị và làm việc với người dùng, người dùng cũng như những phần tử khác trên máy có thể tạo từng sự kiện nào đó ở thời điểm thích hợp để ra lệnh chương trình đáp ứng. Số lượng và chủng loại các sự kiện mà 1 cửa sổ phải nhận và xử lý là lớn và đa dạng. Để giúp người lập trình tự do đặc tả cách giải quyết cụ thể ứng với từng sự kiện, Windows giới thiệu khái niệm "hàm xử lý cửa sổ". Thật vậy, mỗi cửa sổ, dù lớn hay nhỏ, đều có 1 hàm xử lý sự kiện cho riêng mình. Người lập trình sẽ viết code cho hàm này để đặc tả cách thức xử lý sự kiện trên cửa sổ tương ứng. Thường code cho hàm xử lý cửa sổ chỉ xử lý một số ít sự kiện quan tâm, còn phớt lờ các sự kiện khác (thường rất nhiều).

    Q: Xin hỏi có cách nào để bắt người dùng phải thao tác trên 1 Form đang mở, không thể di chuyển (kích hoạt) sang Form khác?

    A: Tùy thuộc vào mối quan hệ giữa các Form liên quan mà cách giải quyết yêu cầu của bạn sẽ rất khác nhau:

    1. Nếu các Form mà bạn muốn kiểm soát thuộc cùng 1 ứng dụng của bạn thì vấn đề sẽ rất đơn giản. Thật vậy, mỗi Form khi được hiển thị sẽ làm việc ở 1 trong 2 chế độ: Modal hay Modeless. Chế độ làm việc mặc định là Modeless, ở chế độ này, Form cho phép người dùng tự do chuyển sang các Form khác để làm việc trong khi Form Modeless hiển thị và tương tác với người dùng. Còn ở chế độ Modal, Form sẽ bắt người dùng phải làm việc với nó cho đến khi nó bị đóng lại. Trong thời gian Form "Modal" hiển thị, nó sẽ không cho phép người dùng làm việc với các Form khác của ứng dụng liên quan. Tuy nhiên người dùng có thể chuyển sang các Form hay cửa sổ của các ứng dụng khác để làm việc bình thường.

    Nếu lập trình bằng VB 6.0, bạn có thể hiển thị Form ở chế độ "Modal" như sau:
    Form2.Show vbModal

    Còn nếu dùng lệnh:
    Form2.Show 'hay Form2.Show vbModeless

    thì Form2 sẽ làm việc ở chế độ Modeless. 

    2. Nếu các Form mà bạn muốn kiểm soát thuộc các ứng dụng khác nhau thì việc giải quyết yêu cầu của bạn sẽ khá phức tạp. Bạn cần can thiệp vào Windows, thí dụ chặn các sự kiện về chuột để loại bỏ các sự kiện dời chuột ra khỏi Form. Bạn nên đọc bài "Win32 Hooks" trong CD MSDN của Microsoft để biết chi tiết và cụ thể thông tin về lập trình chặn các sự kiện chuột trong Windows.

    Q: Tôi sử dụng Visual Basic để viết các hàm tự tạo trong Excel. Kết quả chạy rất tốt. Nhược điểm là hàm tự tạo này rất dễ bị virus phá hoại hoặc bị các phần mềm quét virus xoá. Xin hỏi cách khắc phục.

    A: Đúng như bạn nói, virus macro nằm trong các tài liệu Office chẳng qua là một hay nhiều macro, mỗi macro là 1 thủ tục chức năng được viết bằng ngôn ngữ VBA (thường bắt đầu từ thủ tục có tên là AutoOpen). Do đó các phần mềm tìm và diệt virus thường xem tất cả macro là virus và xử lý đồng nhất chúng. Để khắc phục nhược điểm này, bạn có thể chuyển các hàm chức năng của mình từ dạng macro sang dạng COM add-ins (được dịch ra file khả thi *.dll). Bạn có thể dùng bất kỳ ngôn ngữ nào (VB, VC++,...) để viết COM add-ins. Qui trình viết COM add-ins và dịch ra file *.dll được trình bày chi tiết và cụ thể trong MSDN của Microsoft.

    ID: A1008_139