• Thứ Năm, 11/03/2004 16:58 (GMT+7)

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

    Trong tháng này TS. Nguyễn Văn Hiệp giải đáp thắc mắc của các bạn: kim phung tran; Huu Giang; tran hoi; vanphuoc chau; loc ngo; hai pham; Trung; dafvp [dafvp@netcenter-vn.net]; khpt [khpt@hcm.vnn.vn]; tom riddle [tom_riddlevn@yahoo.com]; Hoang Ke Thu [kethu@yahoo.com]; Sau Ho [sauhohuynh@yahoo.com]; Tri Am [triamnew@yahoo.com]; Doly [doly@yahoo.com].

    Ứng dụng Văn phòng

    • Hỏi: Xin chỉ cách thay đổi chữ 'YOUR TEXT HERE' khi vào trình WordArt của Word 2000.

    Đáp: Trong Microsoft Word, mỗi khi bạn chọn menu Insert.Picture.WordArt để tạo 1 đối tượng WordArt thì cửa sổ nhập liệu luôn có sẵn chuỗi 'Your Text Here' để thông báo cho bạn nhập chuỗi mong muốn vào vị trí đó. Thường thì chuỗi này nằm trong file chương trình khả thi WordArt (hay trong thư viện khả thi tùy theo version) nên bạn sẽ không dễ dàng hiệu chỉnh nội dung chuỗi này (trừ phi bạn có source code, hiệu chỉnh source code rồi dịch lại). Hơn nữa, nhu cầu thay đổi nội dung chuỗi này là cá biệt và không cần thiết vì dù sao bạn cũng phải nhập mới chuỗi dữ liệu khác cho mỗi lần tạo 1 đối tượng WordArt mới.

    • Hỏi: Xin chỉ cách để chuyển từ file Word sang file Excel với qui định phân tách cột nếu cách 2 khoảng trắng trở lên.

    Ví dụ:  'Nguyễn Văn A   8644859   8 đường Lữ Gia, P15, Q11, TP.HCM'

    được chuyển thành 3 cột sau:

    Nguyễn Văn A 8644859          8 đường Lữ Gia, P15 Q11 TP.HCM

    Đáp: Excel có thể đọc được nhiều dạng file khác nhau, trong đó có dạng file text-only (văn bản thô). Khi bạn chọn menu File.Open để mở 1 file text-only thì Excel sẽ hiển thị tuần tự 3 cửa sổ yêu cầu bạn khai báo kiểu dữ liệu (bạn chọn checkbox 'Delimited'), dấu ngăn cách các field dữ liệu (bạn có thể chọn dấu tab, dấu phẩy, dấu chấm phẩy, khoảng trống hay nhập vào ký tự dấu ngăn nào bạn muốn). Nếu bạn khai báo dấu ngăn phù hợp với ký tự mà bạn dùng để ngăn cách các field dữ liệu trong file văn bản của mình thì Excel sẽ đọc và chứa vào các cột đúng theo ý muốn.

    Tóm lại nếu bạn muốn chuyển dữ liệu từ Word sang Excel và muốn giữ đúng các cột dữ liệu, bạn hãy ngăn các cột dữ liệu bằng 1 ký tự đặc biệt nào đó sao cho không tranh chấp và nhầm lẫn với dữ liệu (ký tự tab là phù hợp nhất trong đại đa số trường hợp). Nếu đã lỡ dùng 2 khoảng trắng để ngăn cách các cột dữ liệu, bạn có thể thay thế chúng bằng ký tự dấu ngăn phù hợp hơn (bằng cách chọn menu Edit.Replace, nhập 2 khoảng trắng vào mục 'Find what' và ký tự dấu ngăn vào mục 'Replace with' rồi ấn button 'Replace All').

    Lưu ý rằng nếu chọn dấu ngăn là ký tự điều khiển (thí dụ ký tự tab), bạn không nhập trực tiếp được ký tự điều khiển này mà phải chọn button More.Special.Tab Character. Sau khi đã chuẩn bị đúng format cần thiết cho Excel, bạn dùng chức năng File.Save As để lưu kết quả lên file (chọn kiểu file lưu là 'Plain text (*.txt)'. Sau đó chạy Excel, dùng menu File.Open để đọc file, lúc này Excel sẽ hiển thị tuần tự 3 cửa sổ yêu cầu bạn khai báo tính chất của file để nó xử lý đúng.

    Trong trường hợp bạn muốn copy dữ liệu dạng nhiều cột từ Word rồi dán trực tiếp vào bảng tính Excel, bạn phải dùng dấu ngăn là tab vì Excel coi tab là dấu ngăn cách mặc định.

    • Hỏi: Bảng tính Excel có 2 cột: 1cột English, 1 cột Vietnamese. Làm sao để khi sắp xếp cột English theo thứ tự từ A đến Z thì cột Vietnamese cũng được sắp tự động theo A đến Z?

    Mỗi cột có comment, làm sao để cột này tự động lấy giá trị là comment của cột kia?

    Đáp: Máy tính cũng như các phần mềm máy tính (trong trường hợp của bạn là Excel) là những phần tử thừa hành, chúng không tự động thực hiện việc gì cả, muốn chúng làm giúp công việc gì, người dùng bắt buộc phải ra lệnh cho chúng một cách cụ thể và chi tiết.

    Với ý tưởng như trên, Excel không thể sắp xếp tự động dùm bạn cột dữ liệu tiếng Việt khi bạn chỉ ra lệnh cho nó sắp xếp cột dữ liệu chứa tiếng Anh. Nếu việc sắp xếp xãy ra nhiều lần, bạn có thể ghi lại qui trình thao tác mà bạn thực hiện để sắp xếp 1 cột dữ liệu thành 1 macro, sau đó hiệu chỉnh lại macro đó để nó thực hiện nhiều lần trên những cột dữ liệu khác, nhờ đó khi cần sắp xếp lại các cột dữ liệu, bạn chỉ cần ra lệnh chạy macro tương ứng. Để hiệu chỉnh được macro, bạn cần biết ngôn ngữ VBA (Visual Basic for Application), ngôn ngữ được dùng để viết macro trong các ứng dụng Microsoft Office.

    Tương tự muốn các cell của 1 cột nào đó nhận chuỗi chú thích (comment) của cell tương ứng ở cột khác, bạn buộc phải ra lệnh tường minh cho Excel thực hiện. Nếu thấy thao tác thủ công thực hiện công việc này là phiền hà, bạn có thể tự động hóa bằng cách viết 1 hàm VBA như sau: (từ Excel, chọn menu Tools.Macro.Visual Basic Editor)

    Function Comment(src As Range)

    ' hàm đọc chuỗi chú thích của cell src

       Comment = src.Comment.Text

    End Function

    Sau khi đã viết hàm này thì từ trong WorkSheet, nếu bạn muốn cell nào đó (td. cell B1) nhận chuỗi chú thích của cell nào đó (td. cell A1), bạn chỉ cần nhập công thức sau vào cell B1:

    =Comment(A1)

    Nếu muốn từng cell của cột B chứa chuỗi chú thích của cell tương ứng của cột A, bạn chỉ cần copy nội dung của cell B1 rồi 'paste' nó vào các cell còn lại trong cột B, Excel sẽ tự động hiệu chỉnh tham số của hàm Comment trong công thức thành A2, A3, ... vì tham số đó ở dạng tham khảo tương đối.

    • Hỏi: Hằng ngày tôi phải gửi thư cho từng khách hàng, công việc giống như xử lý mail merge trong Word. Tôi muốn soạn phần nội dung chẳng hạn: 'xx yy zz tt' và gởi di cho các khách hàng trong address book theo dạng thư như sau:

    ' Dear Mr(Mrs/Ms) tên_khách_hàng

    xx yy zz tt

    Good bye Mr(Mrs/Ms) tên_khách_hàng

    '

    trong dó 'tên_khách_hàng' sẽ được lấy từ address book của Outlook Express. Xin hướng dẫn.

    Đáp: Chúng tôi chưa thấy ứng dụng nào phục vụ chính xác yêu cầu của bạn, do đó nếu muốn, bạn phải tự viết hay nhờ người khác viết lấy. Tùy thuộc vào mức độ tùy biến trong nội dung bức thư (chèn tự do các thông tin tùy biến vào bất kỳ vị trí nào) mà độ phức tạp của ứng dụng sẽ cao hay thấp. Trong thời gian chưa viết được hay chưa tìm được ứng dụng phục vụ chính xác yêu cầu của mình, tạm thời bạn có thể dùng chức năng Mail Merge của Word. Hiện Word chỉ có thể 'mail merge' với danh sách 'address book' của trình Outlook, chứ chưa thể làm việc trực tiếp với Outlook Express. Do đó bạn có thể chọn 1 trong 2 cách giải quyết sau nếu muốn dùng Mail Merge của Word:

    o chuyển sang dùng Outlook, tạo address book trên Outlook, lúc này chức năng Mail merge của Word sẽ cho phép bạn chọn trực tiếp Address book của Outlook như là 'data source' của hoạt động Mail Merge.

    o vẫn tiếp tục dùng Outlook Express, chọn menu File.Export.Address Book, trong cửa sổ 'Address Book Export Tool' chọn mục 'Text File (Comma Separated Values)' rồi chọn button 'Export' để lưu address book lên file text. Chức năng Mail merge của Word sẽ cho phép bạn chọn trực tiếp file text vừa lưu được như là 'data source' của hoạt động Mail merge.

    Font - Tiếng việt

    • Hỏi: Xin hướng dẫn cách viết chương trình dùng font Tahoma để hiển thị tiếng Việt.

    Đáp: Bất kỳ ứng dụng nào cũng có quyền thiết lập font chữ, co chữ, màu chữ,... cho từng chuỗi văn bản mà chương trình đó hiển thị lên màn hình. Tùy thuộc vào phần tử cần hiển thị và tuỳ thuộc vào môi trường lập trình mà qui trình thiết lập các thông số font chữ, co chữ,.. cho nó sẽ khác nhau.

    Font Tahoma của Windows, version từ 98SE trở lên có hỗ trợ mã tiếng Việt Unicode. Đây là 1 trong số rất ít font được cài đặt sẵn theo Windows có hỗ trợ mã Unicode tiếng Việt. Để dùng font Tahoma cho ứng dụng của mình, bạn có thể chọn 1 trong 2 cách giải quyết:

    o lập trình ứng dụng chạy ở chế độ Unicode. Các môi trường VB .Net, VC# .Net, JBuilder 9.0,... đều cho phép lập trình ứng dụng chạy ở chế độ Unicode. Tuy nhiên VB .Net và VC# .Net chỉ chạy trên Win2000, WinXP, chứ không thể chạy trên Win9x hay WinMe. Còn các môi trường lập trình phổ biến hơn như VB 6.0 trở xuống hay VC++ thì chỉ hỗ trợ Unicode ở mức độ rất thấp nên việc lập trình ứng dụng dùng mã Unicode trên các môi trường này sẽ rất khó khăn (mặc dù cũng được), nó đòi hỏi bạn phải nắm vững giao tiếp lập trình API của Windows, chứ không thể thiết kế trực quan các đối tượng giao diện dùng mã Unicode được.

    o hiệu chỉnh lại font Tahoma (sắp xếp lại các vị trí tiếng Việt) để nó hỗ trợ bảng mã tiếng Việt đang dùng của bạn (VNI, ABC, Bach Khoa,...) rồi dùng nó thay cho font VK Sans Serif mà bạn chê xấu. Tuy nhiên việc hiệu chỉnh lại font mà vẫn giữ được chất lượng gốc là việc của các chuyên gia về font chữ, người bình thường khó lòng thực hiện được.

    Mạng - CSDL

    • Hỏi: Tôi có trang Web sau, khi chạy cứ báo là chưa khai báo username?

    <html>

    <form>

    <input  type='text' name='username'><br><br>

    <input type=SUBMIT value='send' >

    </form>

    your name:

    <?

    echo ($username);

    ?>

    </html>

    Môi trường server Win2000 Professonal, IIS và PHP 4.3.1.

    Đáp: Cũng giống như ASP, Perl,... PHP là ngôn ngữ kịch bản (script) được xử lý ở máy server, rất thích hợp để hiện thực phần tử 'bussiness logic layer' trong 1 ứng dụng Web dùng mô hình 3-tier. Để 1 trang Web bình thường (User Interface Layer của mô hình 3-tier) có thể gọi được 1 trang PHP ở server, thường người ta dùng đối tượng form trong trang Web để kích khởi trang PHP tương ứng. Trang Web của bạn có thể được viết lại thành 2 file: file Web và file PHP như sau.

    Nội dung file Web (web.htm) với chức năng giao tiếp với người dùng, chờ nhập liệu rồi gởi về server xử lý tiếp:

    <html>

    <body>

    <form action=phpfile.php method=POST>

    <input  type='text' name='username'><br><br>

    <input type=SUBMIT value='send' >

    </form>

    </body>

    </html>

    Nội dung file php chạy ở máy server (phpfile.php) với nhiệm vụ nhận các giá trị nhập vào của người dùng bên máy client và xử lý (trong trường hợp đơn giản của bạn, nó chỉ hiển thị giá trị nhập vào lên màn hình):

    <html>

    <body>

    your name:

    <?

    echo ($username);

    ?>

    </body>

    </html>

    Về nguyên tắc, trang Web chứa form giao diện có thể được tích hợp vào trang PHP, trong trường hợp này tham số 'action=' của form sẽ chứa tên của chính trang PHP chứa form giao diện và lần đầu tiên được truy xuất bởi người dùng thì phần hiển thị kết quả nhập vào sẽ là Null (không có gì) chứ không phải bị báo sai như bạn miêu tả.

    • Hỏi: Xin hướng dẫn cách tạo 1 hộp thư có các chức năng sau:

    o khi 1 người nào đó gởi mail đến hộp thư này thì nó tự động gởi đến những người có tên trong address book.

    o chỉ nhận mail của những người có tên trong address book gửi đến, còn những người không có tên trong address book thì từ chối và tự động gởi trả lại cho người gởi.

    • Hỏi: Có thể dùng ngôn ngữ nào để viết code cho hộp thư này (java, html,...)?

    Đáp: Hệ thống E-mail chuẩn của mạng Internet không hỗ trợ hộp thư có những tính chất mà bạn yêu cầu vì đó là những yêu cầu đặc biệt của cá nhân bạn (chứ không phải yêu cầu phổ biến của nhiều người). Tuy nhiên bạn có thể sử dụng hệ thống e-mail chuẩn để tạo ra hộp thư với tính chất đó, sau đây là ý tưởng mà chúng tôi đề nghị:

    1. bạn tạo 1 hộp thư bình thường với địa chỉ nào đó (tùy theo bạn tạo hộp thư trên Mail server nào), ai biết địa chỉ hộp thư này đều có quyền gởi e-mail đến nó.

    2. phần tử xử lý hộp thư này không phải là người mà là 1 phần mềm đặc biệt do bạn viết (hay nhờ người khác viết). Phần mềm này sẽ chạy liên tục 24/24 giờ, với 2 nhiệm vụ chính:

    o cho phép người quản trị tạo danh sách address book chứa các địa chỉ e-mail của những thành viên trong nhóm, cho phép thêm/bớt từng thành viên khi cần thiết.

    o dò xem hộp thư Inbox có e-mail nào đến chưa. Nếu có thì kiểm tra xem do ai gởi, nếu không phải là thành viên trong address book thì reply về người gởi báo sai. Nếu là thành viên trong nhóm gởi, phần mềm sẽ nhân bản e-mail rồi gởi về từng địa chỉ e-mail trong danh sách address book.

    Về nguyên tắc, bạn có thể dùng bất kỳ ngôn ngữ lập trình nào để viết phần mềm trên, các ngôn ngữ thích hợp là VB, VC++, Java, C#...

    Lập trình

    • Hỏi: Làm cách nào để gọi Word xuất hiện trong MDI form với VB6?

    Đáp: Các ứng dụng thuộc bộ MS Office đều được viết theo công nghệ 'OLE Automation', ta gọi mỗi ứng dụng này là một 'Automation server'. Nhờ công nghệ 'OLE Automation' mà ta có thể viết ứng dụng khác (controller hay client) để điều khiển hoạt động của một hay nhiều 'Automation server'. Tóm lại công nghệ 'OLE Automation' của Microsoft cho phép ta viết những ứng dụng có giao diện người dùng đặc thù theo yêu cầu riêng của mình nhưng sẽ dùng và điều khiển 1 hay nhiều 'Automation server' thực hiện các hành động xử lý bên trong. Thí dụ như câu hỏi của bạn, ta có thể thiết kế giao diện (skin) cho 1 ứng dụng xử lý văn bản theo ý riêng (thí dụ có giao diện toàn tiếng Việt) rồi điều khiển WinWord thực hiện các tác vụ mà người dùng thao tác, như vậy đối với góc nhìn người dùng, ta có 1 trình xử lý văn bản mới với những tính năng không khác gì WinWord (có thể có nhiều chức năng mới mà Word chưa có). Qui trình xây dựng 1 ứng dụng như vậy được trình bày chi tiết như dưới đây, chú ý là ứng dụng cần viết dùng giao diện SDI và ta chỉ hiện thực 3 chức năng cơ bản là File.New để tạo văn bản mới, File.Open để mở file đã có và File.Save để lưu trữ nội dung lên file.

    1. Chạy VB 6.0, khi cửa sổ New project hiển thị, chọn icon 'VB Application Wizard' rồi ấn vào button Open để tạo một project VB mới.

    2. Khi cửa sổ Wizard đầu tiên ('Introduction') hiển thị, ấn button Next để đến bước kế tiếp.

    3. Khi cửa sổ Wizard thứ hai ('Interface Type') hiển thị, chọn checkbox 'Single Document Interface (SDI)', hiệu chỉnh tên chương trình nếu muốn (tên mặc định là Project1), ấn button Finish để kết thúc qui trình Wizard với các thông số mặc định còn lại.

    4. Sau khi cửa sổ giao diện ban đầu của ứng dụng hiển thị, ta thấy form ban đầu có 1 menu bar mặc định, 1 cửa sổ Toolbar mặc định, 1 đối tượng ImageList chứa hình ảnh của các icon trong Toolbar, 1 đối tượng CommonDialog để cho phép tạo các cửa sổ mở/save file, in ấn kết quả... Ta giữ nguyên tất cả các phần tử này mặc dù chỉ hiện thực 3 option File.New, File.Open, File.Save.

    5. Hãy chọn menu Project.References để hiển thị cửa sổ 'References', duyệt danh sách các điều khiển và chọn checkbox 'Microsoft Word x.0 Object Library' (trong đó x=8 | 9 | 10 tùy version của bộ Office được cài đặt vào máy bạn). Cuối cùng ấn button OK để đóng cửa sổ 'References' lại.

    6. Chọn icon 'OLE' rồi vẽ 1 đối tượng OLE vào form của ứng dụng ở vị trí nào đó với kích thước nào đó (khi ứng dụng chạy, ta sẽ hiển thị lại đối tượng OLE này sao cho nó chiếm toàn bộ vùng làm việc của cửa sổ ứng dụng). Khi cửa sổ 'Insert Object' hiển thị, hãy ấn button Cancel để khỏi phải khai báo tĩnh đối tượng được chứa trong OLE.

    7. Chọn menu View.Code để hiển thị cửa sổ soạn code, rồi viết code cho 3 thủ tục xử lý sự kiện cho 3 option File.New, File.Open và File.Save như sau (lưu ý 3 thủ tục này đã được VB tạo sẵn với thân rỗng ban đầu) :

    ' Thủ tục xử lý sự kiện File.New

    Private Sub mnuFileNew_Click()

       ' tạo tài liệu Word mới

       OLE1.CreateEmbed '', 'Word.Document'

       ' hiển thị scrollbar cho OLE và cho nó làm việc

       DisplayScrollBar

    End Sub

     

    ' Thủ tục xử lý sự kiện File.Open

    Private Sub mnuFileOpen_Click()

       On Error GoTo ErrHandler

       ' Hiển thị cửa sổ duyệt file để người dùng chọn

       With dlgCommonDialog

          .CancelError = T rue

          .Filter = 'All Files (*.*)|*.*'

          .ShowOpen

          ' mở file và hiển thị nội dung lên OLE

          OLE1.CreateEmbed .FileName

       End With

       DisplayScrollBar

    ErrHandler:

        Exit Sub

    End Sub

     

    ' Thủ tục xử lý sự kiện File.Save

    Private Sub mnuFileSave_Click()

       On Error GoTo ErrHandler

       With dlgCommonDialog

          .CancelError = True

          .Filter = 'All Files (*.*)|*.*'

          .ShowSave

          ' ghi file

          OLE1.object.SaveAs .FileName

        End With

    ErrHandler:

        Exit Sub

    End Sub

     

    ' Thủ tục hiển thị scrollbar cho container chứa tài liệu Word

    Private Sub DisplayScrollBar()

    OLE1.DoVerb vbOLEShow

     '  OLE1.DoVerb vbOLEUIActivate

       OLE1.SizeMode = 1

       With OLE1.object

          .ActiveWindow.DisplayVerticalScrollBar = True

          .ActiveWindow.DisplayHorizontalScrollBar = True

       End With

    End Sub

    8. Hiệu chỉnh lại thân của thủ tục Form_Load() như sau:

    Private Sub Form_Load()

       Me.ScaleMode = vbTwips

       Me.Left = GetSetting(App.Title, 'Settings', 'MainLeft', 1000)

       Me.Top = GetSetting(App.Title, 'Settings', 'MainTop', 1000)

       Me.Width = GetSetting(App.Title, 'Settings', 'MainWidth', 6500)

       Me.Height = GetSetting(App.Title, 'Settings', 'MainHeight', 6500)

       Me.ScaleMode = vbPixels

       ' Hiệu chỉnh kích thước & vị trí của OLE chứa tài liệu Word

       OLE1.Move 25, 45, Me.ScaleWidth - 30, Me.ScaleHeight - 70

    End Sub

    9. Tạo thủ tục xử lý sự kiện thay đổi kích thước của Form Form_Resize(), rồi viết code cho nó như sau:

    Private Sub Form_Resize()

       ' Hiệu chỉnh kích thước & vị trí của OLE chứa tài liệu Word

       OLE1.Move 25, 45, Me.ScaleWidth - 25, Me.ScaleHeight - 65

    End Sub

    10. Hiệu chỉnh đoạn code xử lý icon New trong thủ tục xử lý Toolbar  tbToolBar_ButtonClick() như sau:

    Private Sub tbToolBar_ButtonClick(ByVal Button As MSComCtlLib.Button)

       On Error Resume Next

       Select Case Button.Key

          Case 'New'

             mnuFileNew_Click ' gọi thủ tục tạo tài liệu Word mới

          Case 'Open'

             mnuFileOpen_Click

          ...

    11. Chọn menu Run.Start để chạy thử ứng dụng vừa viết, thử phóng to cửa sổ ứng dụng ra hết màn hình rồi quan sát kích thước đối tượng OLE chứa tài liệu Word, thử chọn menu File.New để tạo file mới hay chọn menu File.Open để mở file *.doc có sẵn, thử hiệu chỉnh lại nội dung hay chỉnh dạng hình thức tài liệu như đã từng làm với Word, cuối cùng thử chọn menu File.Save để lưu kết quả lên file.

    Nếu lập trình bằng VC++, bạn có thể tham khảo project AutoClik (trong CD MSDN của Microsoft) để hiểu cách xây dựng 1 trình automation server và trình automation client.

    • Hỏi: Dùng VB.NET để viết chương trình quản lý hồ sơ theo mô hình client/server, tôi không biết làm cách nào client mở được file *.doc hay file *.pdf và upload lên server.

    Đáp: Vấn đề của bạn không nằm ở ngôn ngữ VB .Net mà nằm ở cách quản lý cơ sở dữ liệu. Bạn có thể tạo database trên các hệ cơ sở dữ liệu có hỗ trợ field 'binary' như Access, SQL Server, Oracle,... Khi định nghĩa cấu trúc record cho database, bạn hãy định nghĩa các field chứa file đính kèm có kiểu Image (Binary), các field này của từng record sẽ chứa trực tiếp nội dung của file. Với cách này, bạn chỉ cần viết 2 thủ tục truy xuất 1 field Binary: 1 thủ tục đọc nội dung rồi lưu lên file tạm ở máy cục bộ trước khi nhờ ứng dụng tương ứng xử lý (hiển thị), 1 thủ tục khác cho phép ghi nội dung của file tạm (hay file gốc) ở máy cục bộ lên field tương ứng của record trên database server trong mạng.

    Về việc nhờ ứng dụng xử lý file (hiển thị, cập nhật nội dung,...), bạn cần cài đặt trước các ứng dụng cần sử dụng (như Word, Acrobat Reader,...). Lưu ý rằng Word và Acrobat Reader đều được viết theo công nghệ OLE Automation, nhờ đó bất kỳ ứng dụng nào cũng có quyền điều khiển đầy đủ Word và Acrobat Reader hầu nhờ chúng hiển thị file tương ứng trong cửa sổ riêng của ứng dụng đó.

    Để truy xuất database dễ dàng, bạn có thể dùng các đối tượng ADO của Microsoft. Để biết thêm về việc lập trình dùng các đối tượng ADO, bạn có thể đọc các bài báo liên quan trong CD MSDN của Microsoft.

    • Hỏi: Xin hỏi có cách nào hiển thị được Unicode trong Access2000 chạy trên Win98 không?

    Đáp: Hiện nay, chuẩn tiếng Việt TCVN 6609 của nước ta qui định dùng mã Unicode để biểu diễn văn bản tiếng Việt, do đó nhu cầu lập trình ứng dụng xử lý và hiển thị được chuỗi văn bản Unicode là rất phổ biến. Tuy nhiên, hầu hết các người lập trình đều gặp khó khăn trong việc hiện thực các ứng dụng hỗ trợ mã Unicode. Do đó sẵn câu hỏi của bạn, chúng tôi sẽ trình bày hiện trạng lập trình xử lý mã Unicode trong VB.

    Trước hết bạn nên phân biệt 2 khái niệm: một là ngôn ngữ lập trình VB và hai là môi trường lập trình trực quan VB. Bản thân ngôn ngữ VB từ version 5.0 trở về sau hỗ trợ rất tốt chuỗi ký tự Unicode, thật vậy các chuỗi ký tự trong chương trình khả thi được dịch từ source code VB đều được miêu tả dưới dạng Unicode UCS-2. Tuy nhiên, chỉ có môi trường lập trình VB .Net mới hỗ trợ nhập chuỗi Unicode UCS-2 trực tiếp cho các phần tử giao diện cũng như trong cửa sổ viết source code, còn các môi trường lập trình VB 6.0 trở về trước thì không cho phép nhập chuỗi Unicode UCS-2 trực tiếp cho các phần tử giao diện cũng như trong cửa sổ viết source code. Do đó nếu muốn viết các ứng dụng hiển thị chuỗi Unicode một cách trực quan dễ dàng, bạn nên dùng môi trường lập trình VB .Net. Còn nếu bạn vẫn muốn tiếp tục dùng VB 6.0 trở về trước chạy trên Win9x và WinMe, bạn vẫn có thể viết các ứng dụng hiển thị chuỗi Unicode trong các phần tử giao diện với 1 số lưu ý sau đây:

    1. Vì môi trường VB 6.0 trở về trước không cho phép nhập chuỗi Unicode UCS-2 trực tiếp vào các phần tử giao diện cũng như trong source code của ứng dụng nên bạn buộc phải nhập chuỗi Unicode dưới dạng UTF-8 (vì dạng UTF-8 tương thích tốt với chuỗi ASCII truyền thống).

    2. Khi chương trình chạy, bạn cần đổi các chuỗi UTF-8 thành dạng Unicode UCS-2 bên trong để được xử lý và hiển thị tốt. Windows có cung cấp 1 hàm API để phục vụ việc chuyển đổi này, đó là hàm MultiByteToWideChar(). Thông thường để gọi hàm API trong module VB, bạn cần khai báo đặc tả hàm API cần gọi bằng lệnh Declare, thí dụ đối với hàm MultiByteToWideChar(), bạn cần khai báo nó như sau :

    Private Declare Function MultiByteToWideChar Lib 'kernel32' Alias 'MultiByteToWideChar' (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

    Tuy nhiên do cơ chế gởi/nhận các tham số thuộc kiểu String của VB khá đặc biệt: luôn đổi chuỗi ký tự VB từ Unicode sang dạng ANSI để gởi cho hàm API và luôn xem chuỗi trả lại có dạng ANSI nên VB tự động chuyển chuỗi trả về sang Unicode trước khi dùng. Cơ chế chuyển đổi chuỗi tự động như trên sẽ làm chuỗi trả về (theo tham số lpWideCharStr) bởi hàm MultiByteToWideChar() sẽ bị hư vì bản thân nó đã là chuỗi Unicode, nhưng VB cứ xem nó như chuỗi ANSI và đổi thêm lần nữa sang Unicode. Cách khắc phục vấn đề trên là không được dùng lệnh Declare để khai báo hàm  MultiByteToWideChar() như trên mà phải dùng thư viện kiểu (TypeLib) để khai báo hàm MultiByteToWideChar(). Qui trình tạo thư viện kiểu chứa hàm MultiByteToWideChar() gồm các bước sau :

    o viết đặc tả thư viện TypeLib chứa hàm MultiByteToWideChar() bằng ngôn ngữ ODL như sau (dùng trình soạn thảo văn bản bất kỳ, cất nội dung lên file uniutil.odl) :

    [

       uuid(13C9AF40-856A-101B-B9C2-04021C007002),

       helpstring('WIDE Windows API Type Library')

    ]

    library WideWin32API

    {

       [

          helpstring('KERNEL API Calls'),

          dllname('KERNEL32')

       ]

       module KernelAPI

       {

          [

             helpstring('Convert a UTF8 string to a UCS-2 string.'),

             entry('MultiByteToWideChar')

          ]

          long _stdcall MultiByteToWideChar

          (

             [in]  long CodePage,

             [in]  long dwFlags,

             [in]  BSTR lpMultiByteStr,

             [in]  long cchMultiByte,

             [in]  BSTR lpWideCharStr,

             [in]  long cchWideChar

          );

       };

       };

    o dịch file ODL ở trên thành file thư viện kiểu uniutil.tlb bằng tiện ích mktyplib.exe. Để có tiện ích này, bạn có thể cài bộ Visual Studio 6.0, nếu cài ở chế độ Typical, bộ VS sẽ được cài vào thư mục 'c:\Program Files\Microsoft Visual Studio'. Nếu vậy, để dịch file uniutil.odl ở trên, bạn hãy tạo 1 cửa sổ DOS Prompt, dùng lệnh cd để chuyển về thư mục chứa file uniutil.odl, rồi nhập tuần tự 2 lệnh sau để dịch nó:

    c:\progra~1\micros~3\vc98\bin\vcvars32.bat

    mktyplib /I c:\progra~1\micros~3\vc98\include /win32 /tlb uniutil.idl uniutil.odl

    Giả sử tên ngắn của thư mục 'Program Files' là 'progra~1', của thư mục 'Microsoft Visual Studio' là 'micros~3'. Để gọi hàm trong thư viện kiểu uniutil.tlb từ project VB, bạn hãy chọn menu Project.References... để hiển thị cửa sổ References, ấn button Browse rồi duyệt hệ thống file để chọn file uniutil.tlb. Sau khi đã 'add' thư viện kiểu uniutil.tlb, bạn có thể gọi bất kỳ hàm nào trong thư viện đó mà không cần phải dùng lệnh Declare nữa.

    3. các phần tử CommandButton, Label, TextBox,... chuẩn của VB không thể hiển thị được chuỗi Unicode, do đó bạn phải dùng các phần tử giao diện tương ứng trong Control 'Microsoft Forms 2.0 Object Library'. Để dùng được các phần tử giao diện mới này trong 1 Project VB, bạn hãy ấn chuột phải vào chỗ trống trong cửa sổ ToolBox, chọn mục 'Components...' để hiển thị cửa sổ 'Components', ấn button Controls, duyệt đến mục 'Microsoft Forms 2.0 Object Library' và chọn nó để thêm các phần tử giao diện trong thư viện này vào Toolbox của Project VB hầu có thể dùng nó trong các form giao diện.

    Để cho bạn thấy rõ hơn việc hiển thị tiếng Việt Unicode trong các phần tử giao diện của VB, chúng tôi sẽ trình bày qui trình viết 1 ứng dụng VB nhỏ gồm 1 form, form này chứa 4 phần tử: 1 CommandButton có caption là 'Bắt đầu', 1 Label có caption 'Hãy nhập tên của bạn vào TextBox ngay dưới đây :' , 1 textbox để nhập chuỗi Unicode, 1 textbox khác để demo việc copy chuỗi Unicode từ textnox này sang textbox kia.

    o trước hết hãy tạo file thư viện kiểu uniutil.tlb như đã trình bày ở trên.

    o chạy VB, tạo mới 1 Project 'Standard EXE'.

    o ấn chuột phải vào chỗ trống trong cửa sổ ToolBox, chọn mục 'Components...' để hiển thị cửa sổ 'Components', ấn button Controls, duyệt đến mục 'Microsoft Forms 2.0 Object Library' và chọn nó để thêm các phần tử giao diện trong thư viện này vào Toolbox của Project VB.

    o chọn menu Project.References... để hiển thị cửa sổ References, ấn button Browse rồi duyệt hệ thống file để chọn file uniutil.tlb để thêm nó vào Project.

    o vẽ lần lượt từng phần tử: Label với caption 'Hãy nhập tên của bạn vào TextBox ngay dưới đây :' và tên mặc định là Label1, 1 TextBox với tên mặc định là TextBox1, CommandButton với caption 'Bắt đầu' và tên mặc định là CommandButton1, 1 TextBox nữa với tên mặc định là TextBox2. Lưu ý rằng bạn phải dùng trình hỗ trợ tiếng Việt có khả năng tạo mã UTF-8 (VietKey 2000, GVSBK 2.2,...) và chọn mã này trong việc nhập các chuỗi tiếng Việt trong lúc thiết kế Form. Cũng lưu ý rằng các phần tử cần vẽ là các phần tử của thư viện 'Microsoft Forms 2.0 Object Library', chứ không phải là các phần tử VB chuẩn (thường chúng nằm phía dưới cùng trong cửa sổ ToolBox). Sau khi thiết kế xong, Form sẽ có dạng sau (chú ý các chuỗi UTF-8 rất khó đọc) :
     

    o tạo thủ tục xử lý sự kiện Click chuột cho phần tử CommandButton1 rồi vào cửa sổ viết code của Form để nhập đoạn chương trình sau:

    Option Explicit

    ' Thủ tục khởi động Form

    Private Sub Form_Load()

    Dim s As String

    Dim x() As Byte

    Dim ret As Integer

       ' Chuyển caption của CommandButton1 về Unicode

       x = StrConv(CommandButton1.Caption, vbFromUnicode)

       ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)

       s = Space(ret)

       ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)

       CommandButton1.Caption = s

       ' Chuyển caption của Label1 về Unicode

       x = StrConv(Label1.Caption, vbFromUnicode)

       ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)

       s = Space(ret)

       ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)

       Label1.Caption = s

    End Sub

     

    ' Thủ tục xử lý sự kiện Click CommandButton1

    Private Sub CommandButton1_Click()

        ' thử copy nội dung từ TextBox1 sang TextBox2

        TextBox2.Text = TextBox1.Text

        ' thử copy nội dung từ TextBox1 sang Title của Form

        Form1.Caption = TextBox1.Text

    End Sub

     

    Khi chạy Form được hiển thị như sau (các chuỗi Unicode đều hiển thị đúng) :

    Khi bạn nhập tên mình hay 1 chuỗi Unicode bất kỳ (nhớ thiết lập trình hỗ trợ tiếng Việt về chế độ tạo mã Unicode dựng sẵn), rồi ấn button thì dữ liệu ở TextBox1 sẽ được copy sang TextBox2, cửa sổ của Form sẽ như sau (nếu bạn nhập 'Nguyễn Văn Hiệp').
     

    Lưu ý rằng chỉ có TextBox2 (đối tượng của thư viện Form 2.0) mới hiển thị đúng tiếng Việt Unicode, còn title của Form thì không vì Form chuẩn VB không hỗ trợ mã Unicode (các ký tự Unicode có mã >=256 đều bị đổi thành dấu ?).

     

    Tiện ích

    Hỏi: Chương trình ứng dụng viết bằng Foxpro for DOS, dùng vrd.exe (phần mềm VietRes) để gõ và hiển thị tiếng Việt, in với máy in HP LaserJet 1200 không thể hiện đúng tiếng Việt nhưng với máy in Epson LQ-2180 thì thể hiện rất tốt. Xin chỉ cách khắc phục.

    Đáp: Phần mềm VietRes chạy trên DOS hỗ trợ in trên 2 loại máy in phổ biến: máy in kim Epson và máy in laser HP. Driver quản lý máy in HP laser dùng ngôn ngữ PCL để giao tiếp với máy in, đây là ngôn ngữ của hãng HP mà bất kỳ máy in laser nào cũng hỗ trợ. Nếu bạn có đầy đủ phần mềm VietRes for DOS, bạn có thể vào phần cấu hình của nó để thiết lập in với máy in laser HP.

     

    ID: A0402_103