• Thứ Sáu, 15/07/2011 07:16 (GMT+7)

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

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

    Câu hỏi
    Hướng dẫn cách viết code C++ xác định những tiến trình đang kết nối với USB.

    Trả lời
    Windows XP và các phiên bản mới hơn đều có độ an toàn, bảo mật rất cao trong truy xuất các tài nguyên. Chỉ có device driver và hệ điều hành (HĐH) mới có quyền truy xuất trực tiếp các tài nguyên cấp thấp (thí dụ các thiết bị USB). Các chương trình ứng dụng (process ứng dụng) không có quyền truy xuất trực tiếp thiết bị USB mà chỉ có thể truy xuất gián tiếp thông qua các hàm API của Windows hay các hàm thư viện rồi các hàm thư viện này truy xuất các thiết bị ngoại vi tương ứng.

    Tóm lại, không có process ứng dụng nào có thể kết nối trực tiếp với thiết bị USB, chúng chỉ có thể gọi một số hàm chức năng nào đó của HĐH để HĐH kết nối và truy xuất thiết bị USB.

    Câu hỏi
    Cách viết chương trình sử dụng card Decklink để xuất tín hiệu từ máy tính sang màn hình tivi.

    Trả lời
    Card Decklink của hãng BlackMagic có chức năng làm kỹ xảo video. Khi mua card này (hay bất kỳ thiết bị I/O nào khác), bạn được cung cấp CD chứa device driver và tiện ích để sử dụng hiệu quả các chức năng của card. Bạn chỉ cần nối cáp tín hiệu từ card tới tivi hay monitor rồi chạy tiện ích xem/xử lý video kèm theo thì sẽ xem được kết quả trên tivi. Bạn không cần viết chương trình riêng để xuất tín hiệu ra tivi làm gì, hơn nữa việc viết chương trình xuất tín hiệu ra card là công việc của người chuyên môn về lập trình và về card Decklink.

    Câu hỏi
    Tôi ghi đĩa CD bằng Nero Burning Rom (Nero 8.3.6), cả Nero Express nữa. Tinh chỉnh để ghi đĩa multisession: đầu tiên là start multisession, ghi lần sau là Continue multisession.

    Tùy chỉnh xong và burn, sau đó cho đĩa vào ổ thì phát hiện đĩa đã bị đóng multisession, không ghi tiếp được, đã thử ghi 4 CD trắng đều bị như vậy. Không biết lỗi do nguyên nhân nào?

    Trả lời
    Chúng tôi nghĩ rằng hiện tượng lỗi mà bạn gặp thường là do thao tác sai. Vì version Nero 8.3.6 đã cũ nên khó tìm, chúng tôi đã tìm version mới nhất là Nero 10, cài đặt vào Windows 7 rồi kiểm tra khả năng ghi CD multisession thì nó hoạt động tốt, đĩa CD có thể ghi nhiều lần bình thường. Chúng tôi chọn chế độ mặc định: Data mode = Mode 1, File System = ISO 9660 + Joliet, Filename length = 8.3 (Level 1), Character set = ISO 9660. Lần đầu chọn chế độ "Start multisession", thiết lập các thư mục và file cần ghi rồi "Burn" CD. Các lần sau thì chọn chế độ "Continue multisession", chọn track cuối cùng cần ghi tiếp, thiết lập các thư mục và file cần ghi rồi "Burn" CD.

    Lưu ý rằng, nếu không có yêu cầu ghi CD đặc biệt, bạn có thể dùng khả năng sẵn có của tiện ích quản lý tập tin "Windows Explorer" của Windows 7 để ghi CD. Tiện ích này cũng hỗ trợ chế độ multisession, hơn nữa thao tác khá tiện dụng và dễ dàng, bạn xử lý ổ CD y như ổ đĩa cứng.

    Câu hỏi
    Lệnh Javascript mở cửa sổ mới (new window) thay vì mở tab mới khi duyệt web bằng Firefox.

    Trả lời
    Bạn có thể dùng tag lệnh HTML chuẩn <a href> có chứa mệnh đề target="_blank" để tạo cửa sổ mới nhằm hiển thị nội dung của 1 trang web xác định. Thí dụ lệnh HTML sau đây sẽ mở cửa sổ mới và hiển thị trang web tìm kiếm của Google:

    <a href="http://www.google.com.vn" mce_href="example.html" target="_blank">Google site</a>
    Nếu muốn kiểm soát thêm nhiều chế độ làm việc của cửa sổ mới, bạn có thể viết đoạn lệnh javascript để gửi thông điệp open đến đối tượng window. Thí dụ lệnh javascript sau đây sẽ mở cửa sổ mới với kích thước 800*600 và hiển thị trang web tìm kiếm của Google:

    window.open('http://www.google.com.vn','mywindow','width=800,height=600');

    Sau đây là nội dung trang web nhỏ demo việc tạo cửa sổ mới bằng 2 phương pháp vừa nêu trên, nó chứa 1 button để mở cửa sổ mới bằng javascript và 1 mối siêu liên kết để mở cửa sổ mới bằng tag lệnh HTML <a href>:
    <html>
    <FORM>
    <INPUT type="button" value="Google site" onClick="window.open('http://www.google.com.vn','mywindow','width=800,height=600')">
    </FORM>
    <a href="http://www.google.com.vn" mce_href="www.google.com.vn" target="_blank">Google site</a>
    </html>

    Câu hỏi
    Tôi có chương trình xem phim viết bằng VB6, sử dụng Component Windows Media, nay tôi muốn thêm chức năng export đoạn phim khi đang tạm dừng (pause), lưu thành file hình jpg. Xin hướng dẫn.

    Trả Lời
    Cả ứng dụng Windows Media Player (WMP) lẫn điều khiển Windows Media Player đều không cung cấp chức năng để người dùng có thể “capture” và lưu frame ảnh khi nó đang chiếu phim hay khi nó đang “pause”. Do đó để lập trình thực hiện việc “capture” và lưu frame ảnh của ứng dụng WMP hay của điều khiển WMP hoặc của 1 ứng dụng bất kỳ, cách tổng quát nhất là nhấn phím “Print Screen” để hệ điều hành copy ảnh bitmap của toàn màn hình vào clipboard, rồi viết đoạn code lấy ảnh từ clipboard và lưu lên file theo yêu cầu. Sau đây là qui trình minh họa để viết 1 ứng dụng đơn giản bằng ngôn ngữ VB .Net (version mới hơn VB 6.0) có chức năng lưu ảnh trong clipboard lên file:

    1. Chạy chương trình Visual Studio 2005 (hay version mới hơn), chọn menu File.New Project.

    2. Khi cửa sổ "New Project" hiển thị, chọn "Project Types" là Visual Basic.Windows, chọn Templates là "Windows Application", nhập tên Project là "WMPCapture" rồi chọn button Ok để tạo Project mới theo các thông tin đã xác định.

    3. Chọn menu View.Code để hiển thị cửa sổ soạn code cho form ứng dụng, viết code sau đây:
    'đặc tả class form ứng dụng

    Public Class Form1

    'định nghĩa thủ tục khởi động cho form

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    'định nghĩa các biến cần dùng

    Dim Capture As System.Drawing.Bitmap

    Dim SaveFileDialog1 As New SaveFileDialog

    'đọc ảnh trong Clipboard vào biến Capture

    Capture = CType(Clipboard.GetData(System.Windows.Forms.DataFormats.Bitmap), Bitmap)

    'hiển thị cửa sổ chọn file cần lưu

    SaveFileDialog1.DefaultExt = "*.bmp"

    SaveFileDialog1.Filter = "Bmp Files|*.bmp"

    SaveFileDialog1.ShowDialog()

    'cố gắng lưu ảnh lên file

    Try

    Capture.Save(saveFileDialog1.FileName)

    Catch ex As Exception

    'nếu có lỗi thì báo lỗi

    MessageBox.Show("An error has occured while saving", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

    End Sub

    End Class

    4. Chọn menu Build.Rebuild WMPCapture để dịch ứng dụng ra file khả thi.

    5. Chạy ứng dụng WMP (hay bất kỳ ứng dụng chơi multimedia nào), mở file phim và trình chiếu. Để copy được frame ảnh rõ nhất, bạn nên chạy tiện ích chiếu phim ở chế độ "full screen". Dời marker của thanh Progressbar về vị trí chứa frame ảnh cần lưu, khi thấy frame ảnh cần lưu hiển thị thì "pause" lại, nhấn phím "Print Screen" để HĐH copy màn hình vào clipboard.

    6. Chạy ứng dụng WMPCapture vừa viết, nó sẽ hỏi file cần lưu và lưu ảnh bitmap trong clipboard lên file (dạng *.bmp).

    7. Nếu muốn chuyển về định dạng khác (thí dụ *.jpg), bạn có thể dùng bất kỳ trình soạn ảnh nào (Photoshop, CorelDraw, Paint...).

    Lưu ý nếu bạn dùng ứng dụng hay điều khiển WMP để chiếu phim thì chức năng Print Screen thường không thể "capture" frame ảnh do WMP hiển thị (do đặc điểm hiển thị động của WMP), do đó tốt nhất là dùng ứng dụng chiếu phim của hãng khác như KMP.

    Câu hỏi
    Tôi muốn xếp thứ tự từ cao xuống thấp trong bảng đã điền sẵn số liệu và họ tên thì làm như thế nào?

    Trả lời
    Nếu bạn chứa bảng số liệu vào 1 bảng tính Excel thì việc sắp xếp thứ tự các hàng của bảng theo thứ tự dựa vào nội dung của các cột dữ liệu xác định là rất dễ dàng. Bạn có thể thao tác trực tiếp hoặc lập trình để sắp xếp thứ tự:

    1. Thao tác trực tiếp: thí dụ bảng dữ liệu của bạn nằm trong vùng cell từ A2:F100. Bạn chọn vùng cell làm việc từ A2:F100, sau đó chọn menu Data.Sort để hiển thị cửa sổ Sort, cửa sổ này cung cấp 3 tiêu chuẩn sắp xếp với độ ưu tiên từ cao xuống thấp. Tùy theo bảng dữ liệu của bạn có hàng tiêu đề hay không mà bạn đánh dấu chọn vào checkbox "Header row" hay "No header row". Ứng với từng tiêu chuẩn, bạn đánh dấu chọn vào checkbox "Descending" (xếp từ cao xuống thấp), chọn cột chứa nội dung sắp xếp. Sau khi hoàn thành các thao tác khai báo thông tin, bạn click chuột vào nút OK để máy sắp xếp bảng dữ liệu theo yêu cầu của bạn.

    2. Lập trình thực hiện tự động việc sắp xếp: thí dụ bảng dữ liệu của bạn nằm trong vùng cell từ A2:F100, tiêu chuẩn sắp xếp lần lượt nằm ở cột D, E và F:

    'đoạn lệnh VBA sắp xếp bảng dữ liệu có hàng tiêu đề

    Range("A2:F100").Select

    Selection.SortKey1:=Range("D2"),Order1:=xlDescending,Key2:=Range(_"E2"),Order2:=xlDescending,Key3:=Range("F2"),Order3:=xlDescending,_Header:=xlGuess,OrderCustom:=1,MatchCase:=False,Orientation:=_xlTopToBottom,DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _DataOption3:=xlSortNormal

    'đoạn lệnh VBA sắp xếp bảng dữ liệu không có hàng tiêu đề

    Range("A2:F100").Select

    Selection.SortKey1:=Range("D2"),Order1:=xlDescending,Key2:=Range(_"E2"),Order2:=xlDescending,Key3:=Range("F2"),Order3:=xlDescending,_Header:=xlNo,OrderCustom:=1, MatchCase:=False, Orientation:= _xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _DataOption3:=xlSortNormal

    ID: A1106_107