• Thứ Bảy, 14/08/2010 08:31 (GMT+7)

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

    BBT
    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.

    Q: Tôi tạo phím tắt cho một kiểu (style) trong Word, nhưng Style miêu tả chuỗi tiếng Việt viết hoa theo kiểu Unicode, vì thế mỗi khi gọi kiểu style này (ví dụ dùng phím tắt là Alt-H) tôi muốn phím Caps Lock tự động được bật lên để nhập chuỗi chữ hoa dễ dàng, tương tự tôi muốn dùng tổ hợp phím khác (ví dụ phím tắt là Alt-T) để gọi style khác làm phím Caps Lock tự động tắt đi.

    A: Trong Word, Style là phương tiện miêu tả 1 chuỗi các thao tác chỉnh dạng hình thức cho 1 đoạn văn, mỗi style được nhận dạng thông qua 1 tên nhận dạng và có thể được kích hoạt bằng 1 trong 2 cách: hoặc chọn style trong Listbox hoặc chọn style bằng tổ hợp phím tắt (ví dụ là Alt-H). Lưu ý rằng style chỉ chứa các thao tác chỉnh dạng văn bản chứ không chứa thao tác gõ phím dữ liệu/điều khiển, do đó bạn không thể đưa hoạt động gõ phím Capslock vào style được. Để giải quyết yêu cầu của bạn chúng tôi giới thiệu phương pháp sau: 

    - Kết hợp tổ hợp phím nóng (Alt-H) với macro (thí dụ tên là Chuhoa), macro này là 1 thủ tục được viết bằng ngôn ngữ VBA, nó sẽ kiểm tra trạng thái Caps Lock và bật lên nếu cần thiết rồi kích hoạt style cần dùng.

    - Kết hợp tổ hợp phím nóng khác (Alt-T) với macro (thí dụ tên là Chuthuong), macro này là 1 thủ tục được viết bằng ngôn ngữ VBA, nó sẽ kiểm tra trạng thái Caps Lock và tắt đi nếu cần thiết rồi kích hoạt style cần dùng.

    Qui trình định nghĩa 2 macro Chuhoa và Chuthuong như sau:

    1. Chạy Word, mở tài liệu Word cần soạn thảo.

    2. Định nghĩa 2 style theo yêu cầu: style có tên là SChuhoa miêu tả các thao tác chỉnh dạng đoạn văn chữ hoa theo yêu cầu riêng của bạn, style có tên là SChuthuong miêu tả các thao tác chỉnh dạng đoạn văn chữ thường theo yêu cầu riêng của bạn.

    3. Kết hợp tổ hợp phím nóng (Alt-H) với macro Chuhoa: chọn menu Tools.Macro.Record New Macro để hiển thị cửa sổ "New Macro", nhập tên macro là Chuhoa, ấn chuột vào button Keyboard, ấn tổ hợp phím Alt-H vào textbox "new shorcut key" rồi ấn button Assign để gán tổ hợp phím tắt với macro Chuhoa. Cuối cùng ấn button "Stop Record" để tắt hoạt động ghi macro.

    4. kết hợp tổ hợp phím nóng (Alt-T) với macro Chuthuong: chọn menu Tools.Macro.Record New Macro để hiển thị cửa sổ "New Macro", nhập tên macro là Chuthuong, ấn chuột vào button Keyboard, ấn tổ hợp phím Alt-T vào textbox "new shorcut key" rồi ấn button Assign để gán tổ hợp phím tắt với macro Chuthuong. Cuối cùng ấn button "Stop Record" để tắt hoạt động ghi macro.

    5. chọn menu Tools.Macro.Macros để hiển thị cửa sổ Macro, chọn macro Chuhoa trong danh sách, chọn button Edit để hiển thị cửa sổ soạn code cho macro Chuhoa rồi soạn code VBA cho 2 macro như sau:

    'khai báo các hàm API cần dùng
    Private Declare Sub keybd_event Lib "user32" _
    (ByVal bVk As Byte, ByVal bScan As Byte, _
    ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function GetKeyboardState Lib "user32" _
    (pbKeyState As Byte) As Long

    'khai báo các hằng cần dùng
    Const VK_CAPITAL = &H14
    Const KEYEVENTF_EXTENDEDKEY = &H1
    Const KEYEVENTF_KEYUP = &H2

    'khai báo biến cần dùng
    Dim keys(0 To 255) As Byte

    'Macro Chuthuong
    Sub Chuthuong()
    'kích hoạt style SChuthuong
    Selection.Style = ActiveDocument.Styles("SChuthuong")
    'đọc trạng thái các phím vào danh sách
    GetKeyboardState keys(0)
    'xác định trạng thái Capslock
    FCaps = keys(VK_CAPITAL) And 1
    'kiểm tra xem có Caplock ?
    If FCaps = 1 Then 'nếu có thì tắt đi
    'mô phỏng việc ấn phím Capslock
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'mô phỏng việc thả phím Capslock
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
    End Sub

    'Macro Chuhoa
    Sub Chuhoa()
    'kích hoạt style SChuhoa
    Selection.Style = ActiveDocument.Styles("SChuhoa")
    'đọc trạng thái các phím vào danh sách
    GetKeyboardState keys(0)
    'xác định trạng thái Capslock
    FCaps = keys(VK_CAPITAL) And 1
    'kiểm tra xem có Caplock ?
    If FCaps = 0 Then 'nếu không có thì bật lên
    'mô phỏng việc ấn phím Capslock
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'mô phỏng việc thả phím Capslock
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
    End Sub

    6. Sau khi viết xong 2 macro, chọn menu File.Close and Return... để quay về cửa sổ soạn thảo tài liệu Word bình thường. Thử dời chuột về đoạn văn bản cần viết hoa rồi ấn tổ hợp phím tắt Alt-H để kích hoạt style Chuhoa và chuyển về chế độ bật Caps Lock rồi bắt đầu nhập liệu chữ hoa. Tương tự, thử dời chuột về đoạn văn bản cần viết thường rồi ấn tổ hợp phím tắt Alt-T để kích hoạt style Chuthuong và chuyển về chế độ tắt Caps Lock rồi bắt đầu nhập liệu chữ thường.

    Q: Xin hỏi code của lớp "floating point" trên C#, bao gồm đếm hệ số và cộng trừ nhân chia số thực.

    A: C# cung cấp kiểu cơ bản để chứa số thực có độ chính xác đơn có tên là float. Một biến float chiếm 4 byte ô nhớ và có thể chứa bất kỳ số thực nào nằm trong tầm trị qui định với độ chính xác khoảng 7 ký số thập phân. Bạn có thể dùng các toán tử cộng, trừ, nhân, chia trên các biến float.

    Nếu bạn muốn tìm hiểu về việc định nghĩa một class C# mà mỗi đối tượng của nó chứa 1 số thực cùng các tác vụ xử lý theo yêu cầu riêng, bạn có thể xem đoạn code định nghĩa 1 class mới có tên là MyClass miêu tả 1 số thực cùng 1 số toán tử phổ dụng trên số thực là cộng, trừ, nhân, chia như sau:

    public class MyFloat {
    //định nghĩa giá trị
    private float value;
    //định nghĩa các tác vụ khởi tạo
    public MyFloat() {
    value = 0;
    }
    public MyFloat(float newval){
    value = newval;
    }
    //định nghĩa các phép toán phổ biến
    public static MyFloat operator +(MyFloat a,MyFloat b){
    return new MyFloat(a.value + b.value);
    }
    public static MyFloat operator -(MyFloat a, MyFloat b){
    return new MyFloat(a.value - b.value);
    }
    public static MyFloat operator *(MyFloat a,MyFloat b){
    return new MyFloat(a.value * b.value);
    }
    public static MyFloat operator /(MyFloat a, MyFloat b){
    return new MyFloat(a.value / b.value);
    }
    }
    Còn sau đây là đoạn code đơn giản sử dụng class MyFloat:
    //định nghĩa các biến
    MyFloat a = new MyFloat (3.1f);
    MyFloat b = new MyFloat (4.2f);
    MyFloat c = new MyFloat();
    //thử cộng 2 đối tượng a và b và chứa kết quả vào đối tượng c
    c = a + b;
    Lưu ý rằng 3 biến a, b, c trong thí dụ trên không phải là 3 biến số thực đơn giản, chúng là 3 đối tượng, mỗi đối tượng miêu tả 1 số thực.

    Q: Tôi là kỹ sư chuyên ngành cơ điện, thực hiện đề tài "Mô phỏng Bàn điều khiển thiết bị tua bin khí" trên bàn điều khiển có đồng hồ đo các thông số của thiết bị Tua bin khí (kiểu như động cơ máy bay). Đồng hồ này gồm có 3 kim để đo 3 thông số khác nhau, tôi sử dụng 1 Form với thuộc tính BackgroundImage là mặt đồng hồ, Panel 1 cũng có BackgroundImage là kim đồng hồ thứ nhất, PictureBox là kim đồng hồ thứ 2 thì không vấn đề gì nhưng còn kim thứ 3 thì nếu sử dụng tiếp Panel 2 thì khi nạp lên đồng hồ cứ nháy liên tục trông rất xấu, còn sử dụng PictureBox thứ 2 thì PictureBox thứ nhất không nhìn thấy gì mà chỉ thấy Panel 1.
    Xin hỏi cách lập trình tạo 1 đồng hồ có thể điều khiển cả 3 kim quay cùng một lúc?

    A: Cách dễ dàng nhất để hiển thị 3 kim đồng hồ (3 ảnh bitmap độc lập) chồng lên nhau mà vẫn thấy được cả 3 kim là khai thác thuộc tính trong suốt (transparent) của các đối tượng đồ họa. Cụ thể để giải quyết vấn đề hiển thị 3 kim đồng hồ, bạn cần tiến hành các bước sau:

    1. dùng trình soạn thảo ảnh như PhotoShop, ImageReady… để soạn các file ảnh, mỗi file miêu tả ảnh của kim đồng hồ ở vị trí cần hiển thị. Thí dụ, nếu dùng PhotoShop, bạn chọn menu File.New để hiển thị cửa sổ tạo file ảnh mới. Khi cửa sổ New hiển thị, bạn nhập các thông số về ảnh trong đó có thông số "Background Contents" phải được thiết lập về giá trị "Transparent". Sau khi soạn ảnh xong, bạn phải lưu ảnh theo định dạng *.gif và ở chế độ "Transparency".

    2. dùng môi trường hỗ trợ khả năng hiển thị ảnh trong suốt như môi trường web,... Sau đây là mã nguồn của trang web DHTML chứa 3 kim đồng hồ: giờ, phút, giây nằm cùng vị trí trong trang web nhưng trên 3 lớp (layer) khác nhau. Bản thân trang web sẽ có ảnh nền là mặt đồng hồ. Trang web sẽ tạo 1 timer để đếm thời gian, mỗi lần 1 giây, khi timeout sẽ hiệu chỉnh lại từng kim đồng hồ về vị trí thích hợp:
    <html>
    <head>
    <script LANGUAGE=VBScript>
    'Định nghĩa các biến toàn cục
    dim giay
    dim idtimer

    'Thủ tục xử lý timeout
    Sub StatTrans()
    'Hiệu chỉnh giờ/phút/giây
    'để đơn giản, ở đây chỉ hiệu chỉnh giây từ 0->1->0->1...
    giay = (giay+1) mod 2
    'Hiệu chỉnh kim giờ/phút/giây theo giờ mới
    if giay = 0 then
    document.all.Hour.src = "Hour0.gif"
    document.all.Minute.src = "Minute0.gif"
    document.all.Second.src = "Second0.gif"
    else
    document.all.Hour.src = "Hour1.gif"
    document.all.Minute.src = "Minute1.gif"
    document.all.Second.src = "Second1.gif"
    end if
    end sub

    'Thủ tục khởi tạo timer
    Sub StartTimer()
    giay = 0
    'thiết lập thời gian đếm cho timer là 1000ms = 1s
    idtimer = window.setInterval("StatTrans()",1000)
    end sub
    </script>
    </head>
    <body background="bg.jpg" onload=StartTimer>
    <h3>Trang Web demo việc hiển thị 3 kim đồng hồ theo thời gian</h3>
    <img id=Hour style="position:absolute;top:60; left:10; z-index:1" src="Hour0.gif">
    <img id=Minute style="position:absolute;top:60; left:10; z-index:2" src="Minute0.gif">
    <img id=Second style="position:absolute;top:60; left:10; z-index:3" src="Second0.gif">
    </body>
    </html>

    3. Tạo 1 thư mục (website), chứa nội dung code DHTML ở trên thành file clock.htm. Bạn cũng cất các file ảnh *.gif miêu tả mặt đồng hồ và các kim đồng hồ giờ/phút/giây vào cùng thư mục vừa tạo.

    4. Chạy IE, truy xuất trang web clock.htm để xem kết quả.
    Lưu ý rằng thuật giải hiệu chỉnh giờ/phút/giây và hiển thị các kim đồng hồ mà chúng tôi viết trong đoạn code trên đây chỉ có tính demo cho việc hiển thị chúng ở chế độ "transparent". Bạn phải viết lại thuật giải này theo yêu cầu riêng của mình.

    Q: Tôi làm đĩa Boot, nội dung của file config.sys và autoexec.bat như sau:

    1. Nội dung file Config.sys
    [MENU]
    Menuitem=DOS, DOS
    Menuitem=NC, NC HO TRO NTFS
    Menuitem=GHOST, GHOST 11.0
    [DOS]
    [NC]
    [GHOST]

    2. Nội dung file Autoexec.bat
    :NC
    X:\BOOTCD\NC\nc.exe
    Goto DOS
    :GHOST
    x:\BOOTCD\GHOST\Ghost.exe
    GOTO DOS
    : DOS
    X:

    trong đó X: là tên ổ đĩa CD. Sau khi khởi động và đã vào NC hoặc Ghost rồi, tôi muốn bấm chữ "M" để trở về menu chính (menu gốc) giống như đĩa Hiren's Boot thì cần bổ sung lệnh trong autoexec.bat và config.sys như thế nào? và cần những file gì?

    A: Bạn có thể đặc tả hệ thống cây phân cấp chứa các khả năng boot đĩa khác nhau thông qua việc đặc tả section [menu] trong file config.sys. Thật vậy, section [menu] trong file config.sys chứa nhiều phần tử con, mỗi phần tử con có thể là submenu để miêu tả menu con hay Menuitem để miêu tả 1 chức năng chạy cụ thể. Bạn có thể quay về menu gốc từ bất kỳ menu con ở mức nào bằng cách khai báo 1 phần tử submenu trong nó có dạng sau:
    submenu=MENU, Quay về menu gốc

    Trong trường hợp người dùng chọn 1 option để thực hiện chức năng tương ứng (thí dụ chạy NC hay Ghost...) thì đoạn lệnh tương ứng của option này được khai báo trong file autoexec.bat sẽ chạy, sau khi chạy xong đoạn script thì HĐH sẽ hiển thị prompt thông báo và chờ người dùng làm việc với HĐH theo cơ chế nhập từng hàng lệnh khi cần thi hành nó.

    Việc CD Hiren's Boot cho phép ấn phím "M" để hiển thị menu lệnh là chuyện khác. Thật vậy khi bạn ấn phím M khi boot xong đĩa CD Hiren's Boot, máy không hề quay về menu gốc trong file config.sys, nó chỉ chạy 1 tiện ích đặc biệt có tên là pcms.com. Chính tiện ích này hiển thị và xử lý menu thông qua các file cấu hình dạng *.pcm. Nếu bạn để ý kỹ, danh sách menu được hiển thị bởi pcms không giống với menu do config.sys đặc tả.

    Q: Xin hỏi cách sử dụng tiếng Việt trong TC 3.0? Cụ thể: xây dựng từ điển Anh-Việt bằng chương trình TC có giao diện như phần mềm Lạc việt 2002.

    A: Thường TC 3.0 chỉ cho phép viết các chương trình chạy trên môi trường MS-DOS và chỉ xử lý/hiển thị được chuỗi văn bản theo bộ mã ANSI (1 ký tự chiếm 1 byte - 8bit). Chương trình được viết trên TC 3.0 có thể chạy ở 1 trong 2 chế độ hiển thị:

    1. Chế độ hiển thị văn bản và dùng bộ font bitmap được hỗ trợ bởi MS-DOS. Bộ font bitmap mặc định của MSDOS không hỗ trợ tiếng Việt do đó không thể hiển thị chuỗi tiếng Việt đúng theo yêu cầu của ứng dụng. Cách khắc phục cho trường hợp này là soạn 1 bộ font bitmap theo định dạng của MS-DOS (định dạng thô - font như là danh sách gồm nhiều record, mỗi record chứa thông tin bitmap của 1 ký tự có mã từ 0 tới 255) miêu tả được các ký tự tiếng Việt theo bộ mã nào đó (VNI for DOS, Bach Khoa 1 byte, ABC,...). Sau khi có bộ font tiếng Việt hỗ trợ bộ mã cần dùng, bạn "ghi đè" bộ font mới lên bộ font mặc định của MS-DOS để MS-DOS dùng bộ font mới.

    2. Chế độ hiển thị đồ họa và dùng các font bitmap hay vector trong thư viện graphics của TC 3.0. Các bộ font được dùng trong chế độ đồ họa do Borland cung cấp kèm theo môi trường TC 3.0 cũng không hỗ trợ tiếng Việt, do đó không thể hiển thị chuỗi tiếng Việt đúng theo yêu cầu của ứng dụng. Cách khắc phục là soạn lại hay soạn mới 1 hay nhiều font chữ bitmap/vector theo định dạng của Borland và hỗ trợ được bộ mã tiếng Việt rồi dùng các font mới này trong chương trình của mình để hiển thị đúng các chuỗi tiếng Việt do chương trình hiển thị. Hiện trên Internet có nhiều địa chỉ website cho tải tiện ích soạn font bitmap/vector theo định dạng của Borland.

    Lưu ý rằng ý tưởng của 2 cách khắc phục được giới thiệu ở trên khá đơn giản, nhưng khi tiến hành thực sự đều đòi hỏi bạn phải là người lập trình tương đối chuyên nghiệp.

    Q: Tôi cần 1 control (lập trình phần mềm) dùng để nhập văn bản có khả năng định dạng font chữ, lưu trữ hình ảnh, nhập các biểu tượng toán học... xin chỉ giúp.

    A: Không dễ gì tìm được 1 điều khiển (control) với các tính năng phong phú và mạnh mẽ mà bạn cần. Hiện nay, khả thi nhất là dùng các điều khiển như Word Application, Word Document,... trong thư viện "Microsoft Word x.0 Object Library". Điều khiển "Word Application" chính là ứng dụng Microsoft Word nhưng nó được điều khiển (kích hoạt, dừng, thực hiện 1 chức năng xử lý văn bản nào đó) tự động bởi phần mềm của bạn. Như vậy nhờ đối tượng Word Application, bạn có thể mở/tạo file văn bản, soạn thảo/chỉnh dạng tài liệu theo yêu cầu, thêm/bớt các đối tượng đặc biệt như hình ảnh, âm thanh, công thức toán học,... vào tài liệu, lưu tài liệu lên file...

    Sau đây là đoạn code viết bằng ngôn ngữ VB 6.0 demo việc kích hoạt điều khiển "Word Application" chạy để phục vụ người dùng soạn thảo tài liệu:

    Option Explicit
    'thủ tục xử lý click chuột trên button kích hoạt Word chạy
    Private Sub btnStart_Click()
    'khai báo các biến cần dùng
    Dim oWordApp As Word.Application
    'tạo ứng dụng Word
    Set oWordApp = New Word.Application
    'hiển thị cửa sổ Word để người dùng soạn thảo tài liệu Word
    oWordApp.Visible = True
    End Sub

    Q: Xin hỏi các hàm API trong các ngôn ngữ khác nhau thì có khác nhau không? Tôi muốn lập trình API trên C# thì làm thế nào?

    A: Một phần mềm thường được tổ chức như là 1 tập các module chức năng. Khi viết 1 phần mềm, người lập trình cố gắng tối thiểu hóa việc viết mới các module bằng cách cố gắng dùng lại các module đã được viết sẵn (bởi chính mình hay bởi người khác), module có thể ở cấp ứng dụng hay là module chức năng của hệ thống. Mỗi module hệ thống (thí dụ như Kernel32, GDI, User32... trên Windows) cung cấp 1 tập các hàm chức năng, mỗi hàm chức năng của module hệ thống được gọi là hàm API (Application Programming Interface). Tóm lại các hàm API nắm trong hệ thống nên nó độc lập với ngôn ngữ lập trình và độc lập với từng ứng dụng, ứng dụng nào muốn gọi hàm API nào thì tự do gọi. Tuy nhiên trong thực tế, tùy thuộc vào ngôn ngữ lập trình và môi trường lập trình cụ thể mà ta có thể gọi trực tiếp được các hàm API của hệ thống hay không. Thí dụ nếu bạn lập trình bằng ngôn ngữ thuần hướng đối tượng như Java, C#,..., bạn không thể gọi trực tiếp các hàm API hệ thống vì tính chất của ngôn ngữ thuần hướng đối tượng không cho phép cơ chế gọi hàm truyền thống, nó chỉ cho phép cơ chế gởi thông điệp đến 1 đối tượng cụ thể để thực thi tác vụ cụ thể. Để khắc phục vấn đề này, trong C# (và các ngôn ngữ .NET khác), người lập trình có thể định nghĩa 1 tác vụ trong class chức năng của mình và kết hợp tác vụ này với 1 hàm API cần dùng, mỗi lần gởi thông điệp gọi tác vụ trong class tương ứng thì hàm API kết hợp với tác vụ đó sẽ được kích hoạt.

    Thí dụ trong thư viện User32.dll của Windows có 1 hàm API với chức năng phát âm thanh cảnh báo với đặc tả sau:
    BOOL MessageBeep (UINT uType);

    Nếu muốn gọi hàm API trên trong 1 class C# nào đó, bạn sẽ đặc tả hàm API MesssageBeep như sau :

    public class YourClass {
    //định nghĩa tác vụ miêu tả hàm API cần gọi
    [DllImport("User32.dll")]
    static extern Boolean MessageBeep(UInt32 beepType);
    //các lệnh định nghĩa các thuộc tính khác
    //các lệnh định nghĩa các tác vụ khác
    }

    Q: Tôi có một file văn bản với đường dẫn "d:\demo.txt", nội dung chứa 6 chữ số như sau:
    6
    2 4
    3 7
    1 8
    Lập trình hướng đối tượng C++, tôi dùng thư viện #include <fstream.h> để khai báo đối tượng file nhập ifstream fin, rồi đọc nội dung file và sắp xếp các số trong file đó theo thứ tự tăng dần để ghi ra một file khác nhờ đối tượng ofstream fout. Tuy nhiên khi viết lệnh định nghĩa đối tượng fout như sau:

    ofstream fout("d:\demo.txt");
    thì các dữ liệu trong file "d:\demo.txt" đã nhập bị mất hết.

    A: Bạn cần nắm vững ý nghĩa của đối tượng file ofstream trước khi dùng nó. Thật vậy, đối tượng ofstream kết hợp với file để ứng dụng ghi nội dung lên file. Lệnh mà bạn viết có nghĩa là định nghĩa biến đối tượng fout thuộc kiểu ofstream và kết hợp với nó file "d:\demo.txt", hệ thống sẽ khởi tạo biến fout liền, nó kiểm tra xem file d:\demo.txt có rồi chưa? Nếu file này chưa có thì hệ thống sẽ tạo mới để sẵn sàng chứa dữ liệu do ứng dụng ghi ra. Còn nếu file đã có rồi, hệ thống sẽ xóa nó để tạo mới từ đầu (dĩ nhiên chưa có nội dung gì). Tóm lại, bạn không nên kết hợp file đã có sẵn và đang chứa dữ liệu cần dùng với biến thuộc kiểu ofstream, vì file này sẽ bị xóa nội dung ngay. Bạn nên định nghĩa 2 biến đối tượng riêng biệt như sau:

    ifstream fin ("d:\\demo.txt"); 'đối tượng miêu tả file để đọc
    ofstream fout ("d:\\output.txt"); 'đối tượng miêu tả file để ghi

    Sau khi xử lý xong dữ liệu trong file nhập và ghi thành công kết quả ra file xuất, nếu bạn muốn file xuất có cùng tên như file nhập thì bạn hãy xóa file nhập và đổi tên file xuất thành file nhập thông qua đoạn code như sau:

    DeleteFile ("d:\\demo.txt");
    MoveFile ("d:\\output.txt", "d:\\demo.txt");

    Q: Xin hướng dẫn viết chương trình chơi nhạc bằng C# hỗ trợ các định dạng như m4a, ogg và đọc được đầy đủ ID tag trong các định dạng này. Xin hỏi tài liệu chi tiết về cấu trúc định dạng file MP3 (và các định dạng âm thanh khác) và cách xử lý file âm thanh.

    A: Bạn có thể tìm đọc tài liệu về định dạng chi tiết của file MP3 (hay file audio khác) trên Internet. Thí dụ bạn có thể truy cập địa chỉ "http://www.mpgedit.org/mpgedit/mpeg_format/MP3Format.html". Thường file MP3 (và các file audio khác) có định dạng khá phức tạp, đòi hỏi phải có nhiều kiến thức chuyên ngành công nghệ thông tin thì mới hiểu và xử lý tốt được. Do đó, nếu chưa có yêu cầu quá cao, bạn nên lập trình xử lý file MP3 thông qua các linh kiện phần mềm sẵn có, thí dụ ActiveX "Window Media Player" có sẵn trong Microsoft Windows cho phép bạn chơi hầu hết các định dạng file multimedia khác nhau. Nếu định dạng file multimedia nào mà Microsoft không hỗ trợ, bạn hãy tìm linh kiện phần mềm sẵn có của hãng khác thay thế. Về nguyên tắc, để lập trình dùng được linh kiện phần mềm nào đó, bạn phải biết thông tin về giao tiếp lập trình (interface) của linh kiện đó. Website nào cho tải về linh kiện phần mềm thì cũng cung cấp thông tin về giao tiếp lập trình (interface) của linh kiện đó.

    ID: A1007_138