• Thứ Bảy, 04/06/2005 08:59 (GMT+7)

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

    Lượt xem 4019
    Đánh giá

    Hệ Thống

    Hỏi: Mỗi khi em chơi cờ tướng (có hình ông già) được vài ván thì chương trình lại thoát ra và thông báo "Lỗi 7: Block điều khiển bị hỏng". Mặc dù em đã xóa chương trình đi và cài lại nhưng vẫn không được. Mong tạp chí giải đáp giúp em.

    Trả lời: Chương trình cờ tướng mà bạn nói chạy trên môi trường DOS, hơn nữa chúng tôi không chuyên về cờ tướng nên rất khó có thể chơi nhiều ván để kiểm tra lỗi mà bạn phát hiện. Tuy nhiên với những gì bạn trình bày, chúng tôi có thể kết luận là lỗi mà bạn miêu tả là lỗi phần mềm, có thể tác giả trò chơi lúc viết nó chưa để ý quản lý cẩn thận không gian dữ liệu của chương trình nên khi chương trình chơi nhiều ván thì gây lỗi.

    Hỏi: Xin chỉ giúp cách phục hồi dung lượng partition vì khi format partition này  em vô tình đặt tên partition trùng với partition khác đã có trên đĩa, kết quả là partition này có kích thước bằng với kích thước partition trước.

    Trả lời: Về nguyên tắc, khi format luận lý 1 partition, bạn có quyền đặt tên volume bất kỳ cho nó, ngay cả trùng tên với partition đã có mà không gây ra trở ngại nào ngoài việc làm cho user dễ lẫn lộn khi truy xuất. Tóm lại việc đặt trùng tên cho nhiều partition không làm hư hỏng partition, nhưng bản thân việc format partition sẽ xóa dữ liệu của partition đó, việc khôi phục dữ liệu hầu như không thể được, chỉ có những chuyên viên về phục hồi dữ liệu họa may mới có thể làm. Nếu bạn muốn thay đổi dung lượng partition, bạn có thể dùng các tiện ích quản lý đĩa như Partition magic,... Các tiện ích này cho phép bạn thay đổi kích thước partition mà không làm mất dữ liệu đang có trên nó.

    Hỏi: Em có đọc sách nói về giới hạn 1024 cylinder của BIOS. Vậy có phải là mỗi partition (Primary hay Extended) phải có số cylinder nhỏ hơn hay bằng 1024 cylinder? Giả sử là nếu Primary partition chiếm 100 cylinder đầu tiên thì Extended partition phải bắt đầu từ cylinder thứ 101 đến cylinder thứ 1024. Vậy nếu theo giới hạn 1024 cylinder của BIOS thì không tận dụng hết dung lượng đĩa cứng vì phần dung lượng trên 1024 cylinder không thể sử dụng được. Xin cho biết có cách nào khắc phục được tình trạng này?

    Trả lời: Tùy thuộc vào mainboard và phiên bản BIOS trên mainboard đó mà giới hạn về kích thước đĩa cứng là bao nhiêu. Hầu hết các mainboard từ 486 trở lên đều có thể quản lý các đĩa cứng có dung lượng lớn, nhất là các mainboard đời mới như hiện nay thì chúng có thể nhận dạng hầu hết các đĩa cứng đang bán trên thị trường (30 hay 40GB). Nếu mainboard của bạn không có khả năng quản lý đĩa cứng với dung lượng lớn thì về lý thuyết, bạn có thể dùng 1 trong các cách khắc phục sau:

    - Thay mainboard mới,

    - Dùng module quản lý đĩa của trình Disk Manager được phát kèm khi mua đĩa cứng.

    - Thay phiên bản BIOS trên mainboard bằng cách download BIOS phiên bản mới nhất từ hãng sản xuất mainboard hay hãng sản xuất BIOS rồi ghi lại ROM BIOS của mainboard, nếu máy dùng ‘flash ROM’ thì chỉ cần dùng tiện ích ghi ROM của hãng ghi trực tiếp trên máy, nếu máy dùng EPROM thường thì phải đem EPROM đến dịch vụ để nhờ họ ghi dùm.

    Hỏi: Tôi mua thanh RAM 64MB được 2 tháng. Gần gây khi dùng chương trình nào đó lâu (khoảng 3-4 tiếng liên tục) thì máy tự động thoát khỏi chương trình. Có phải là do hết tài nguyên hệ thống hay là do RAM bị lỗi, chủ yếu xảy ra khi chơi trò chơi Sudden strike hoặc Heros III. Có chương trình nào kiểm tra RAM không?

    Trả lời: Việc xác định nguyên nhân lỗi như bạn trình bày là rất khó khăn vì sau khi máy chạy 3-4 tiếng mới xuất hiện. Bạn không nói rõ trước khi gắn RAM mới thì máy có gây ra cùng lỗi này trong cùng điều kiện làm việc (chạy trò chơi Sudden strike hay Hero III liên tục 3-4 tiếng). Nếu trước đó chạy tốt thì có thể kết luận là do thanh RAM mới. Bạn cũng không nói rõ sau khi trò chơi tự thoát thì bạn còn tiếp tục chạy các ứng ụng khác bình thường không, nếu các ứng dụng khác chạy bình thường thì nguyên nhân lỗi là do trò chơi chiếm dụng ngày càng nhiều tài nguyên cho đến hết thì không chạy tiếp được nữa. Lưu ý rằng bản thân Windows không có khả năng thu hồi tài nguyên tự động. Nếu ứng dụng không quản lý tốt việc sử dụng và giải phòng tài nguyên thì dễ gây lỗi sau 1 thời gian dài hoạt động.

    Hỏi: Format mới ổ C, cài đặt Windows Me, Office 2000, Norton Systemworks 2001, System Mechanic 3.6b, Black ICE 2.1cn, iNTERNET Turbo 99... không gặp vấn đề gì. Tuy nhiên khi sử dụng lại bị thông báo lỗi, có khi thì báo KERNEL.DLL error, còn khi đang chạy Speeddisk thì báo COMCTL32.DLL error... Đã cài đặt lại toàn bộ lần nữa nhưng vẫn bị lỗi. Xin chỉ cách giải quyết.

    Trả lời: Có thể phần cứng máy bạn không ổn định nên mới gây ra các lỗi bất thường trên. Cách xác định nguyên nhân lỗi thông thường là cài mới lại Windows xem có chạy ổn định không? Nếu không ổn định thì phần cứng có lỗi, nếu ổn định thì cài tuần tự từng ứng dụng rồi dùng thử 1 thời gian xem có ổn định không để từ đó xác định chính xác nguyên nhân lỗi là do phần mềm nào gây ra.

    Hầu hết các card I/O được bán hiện nay đều có đĩa CD chứa driver cho Win9x lẫn Win2000. Bạn hãy kiểm tra kỹ lại xem, trong trường hợp card XWave3000 không có driver cho Win2000, bạn có thể truy xuất Website của hãng Yamaha để biết thông tin cụ thể và download driver. Nếu bạn không có Internet, bạn có thể copy driver ở tòa soạn báo PCWorld.

    Hỏi: Máy AMD K6-400 , 64 MB RAM, CD-ROM ASUS 36x. Xin hỏi cấu hình máy có tương thích để cài LinuxVN và các ứng dụng không?

    Trả lời: Cấu hình máy bạn hoàn toàn có thể chạy được LinuxVN, tuy nhiên trước khi dùng Linux, bạn cần xác định rõ yêu cầu dùng nó để làm gì, liệu Linux có đáp ứng cho bạn không? Hiện Linux chỉ thích hợp cho các máy server, không thích hợp cho những người dùng cá nhân vì hiện có rất ít ứng dụng cá nhân trên Linux, và nếu có thì khả năng của chúng cũng không thể so sánh được với các ứng dụng tương ứng trên Windows.

    Lập Trình

    Hỏi: Xin hướng dẫn cách thức lập trình trong Visual Basic để khi di chuyển chuột gần các button hay nhấn vào đó thì chúng đổi màu và thu nhỏ lại, giống như trong phần mềm NeoPlanet.

    Trả lời: Tất cả mọi điều khiển đều là các phần tử đồ họa có hàm xử lý biến cố kèm theo. Để lập trình giao diện dễ dàng và nhanh chóng, ta thường dùng các điều khiển chuẩn do hệ thống cung cấp, các điều khiển này có hình dạng rất cổ điển và đơn giản (dạng hình chữ nhật). Nếu bạn muốn những điều khiển có hình dạng và màu sắc đặc biệt, bạn phải tạo và quản lý riêng chúng thông qua các hàm vẽ cơ bản như Lineto, Polygon, Circle,... và xử lý biến cố di chuyển hay click chuột trên các vùng vẽ của các phần tử này. Dĩ nhiên cách tạo và quản lý điều khiển dạng này rất phức tạp, đòi hỏi nhiều kỹ năng lập trình.

    Hỏi: Đang học lập trình, muốn tìm hiểu chương trình chuyển đổi file *.jpg thành file *.bmp bằng ngôn ngữ Pascal.

    Trả lời: Dù dùng ngôn ngữ lập trình nào đi nữa, để chuyển một file đồ họa từ dạng *.jpg sang dạng *.bmp, vấn đề cốt lõi là nắm vững format cụ thể của 2 dạng file đồ họa này. Dạng file *.bmp khá đơn giản nhưng dạng file *.jpg thì khá phức tạp, chương trình chuyển file từ *.jpg sang *.bmp khá phức tạp và dài nên chúng tôi không thể liệt kê source code ra đây. Nếu bạn cần, bạn có thể liên hệ với PCWorld để copy 1 chương trình mẫu thực hiện việc chuyển đổi này. Lưu ý rằng nếu chỉ vì mục đích học lập trình, bạn nên chọn viết những chương trình đơn giản hơn, cách tốt nhất là tham khảo source code của các chương trình mẫu đơn giản trong bộ CD tài liệu MSDN của Microsoft. Còn nếu có nhu cầu chuyển đổi dạng file thì nên dùng các ứng dụng mạnh có sẵn như PhotoShop, Corel Draw,...

    Hỏi: Tôi có vấn đề trong lập trình C++ với Word. Giả sử Application của tôi có được handle của MS Word, tôi thử gửi messages (phỏng theo cách nhấn bàn phím Ctrl+A, Ctrl+C) đến cửa sổ của Word, nhưng các lệnh này hoàn toàn không được thực hiện và chỉ thấy trong cửa sổ của Word có thêm hai ký tự A, C, phím Ctrl không có tác dụng gì.

    Trả lời: Bạn không liệt kê đoạn code cụ thể mà bạn đã viết nên chúng tôi không thể chỉ ra lỗi cụ thể. Về nguyên tắc, bạn có thể lập trình giả lập các phím nhấn để copy dữ liệu của ứng dụng Word (hay bất kỳ ứng dụng nào khác). Sau đây là đoạn code VC++ cho phép copy toàn bộ cửa sổ văn bản Word về ứng dụng của mình thông qua việc giả lập các trình tự phím tắt là Ctrl-A để chọn toàn bộ văn bản và Ctrl-C để copy vùng chọn vào clipboard :

    // giả sử handle của Word nằm trong biến hWnd

    // gởi thông báo để mở cửa sổ Word nếu Word đang ở dạng icon

    SendMessage(hWnd, WM_COMMAND, SC_MAXIMIZE, 0);

    //xóa clipboard của Word

      OpenClipboard(hWnd);           

      EmptyClipboard();

      CloseClipboard();

      // delay 150ms để chờ thi hành lệnh xóa clipboard

      SleepEx(150,FALSE);

    // gởi Ctrl-A để”Select All” document Word

    keybd_event (VK_CONTROL, 0, 0, 0);

      keybd_event (‘A’, 0, 0, 0);

      keybd_event (‘A’, 0, KEYEVENTF_KEYUP, 0);

    keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

    // gởi Ctrl-C để copy vùng chọn vào clipboard

    keybd_event (VK_CONTROL, 0, 0, 0);

    keybd_event (‘C’, 0, 0, 0);

      keybd_event (‘C’, 0, KEYEVENTF_KEYUP, 0);

    keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

    // delay 500ms để chờ thi hành lệnh copy

      SleepEx(500,FALSE);

    //đọc nội dung văn bản clipboard

      CString DataClip;      

      OpenClipboard(NULL);

      if(IsClipboardFormatAvailable(CF_TEXT)) {

              HANDLE hData = GetClipboardData(CF_TEXT);

              LPSTR lpData = (LPSTR)GlobalLock(hData);

              DataClip=lpData;

              GlobalUnlock(hData);                            

      }

      CloseClipboard();

    if(Data.GetLength() !=0 ) { // có data

              // truy xuất dữ liệu từ chuỗi DataClip;

      }

    Hỏi: Có hàm API nào trong Visual Basic cho phép/cấm từng user truy xuất file không ?

    Trả lời: Vấn đề quản lý user là của hệ điều hành (HĐH) chứ không phải của ngôn ngữ lập trình. Tùy thuộc vào HĐH mà khả năng quản lý việc truy xuất file của user ở mức độ nào. Nếu dùng Win9x, bạn không có khả năng cấm/cho phép các user khác nhau truy xuất file. Nhưng nếu dùng WinNT, Win2000 hay Unix thì bạn có khả năng này. Thí dụ nếu bạn đang chạy WinNT hay Win2000, bạn hãy đọc bài (index) “Access Control” và các bài kèm theo trong CDROM MSDN để biết chi tiết nguyên lý quản lý user và các hàm API cụ thể phục vụ cho việc quản lý này. Do khuôn khổ hạn hẹp của phần trả lời này, chúng tôi không thể trình bày chi tiết việc quản lý user trong truy xuất các tài nguyên trên Win2000.

    Hỏi: Trong Visual Basic 6.0 làm sao để form luôn luôn nổi trên màn hình Windows cho dù form có focus hay lost focus. Nếu có thể xin cho đoạn mã minh họa.

    Trả lời: Để hiển thị 1 form luôn nổi trên màn hình, bạn có thể dùng hàm API SetWindowPos(). Đoạn code VB cụ thể như sau :

    ‘Khai báo hàm API SetWindowsPos

    Private 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

    ‘Khai báo hằng

    Const HWND_TOPMOST = -1

    ‘ Hàm xử lý biến cố Load Form

    Private Sub Form_Load()

    ‘Các lệnh khởi động khác

    ‘ Hiển thị form nổi trên màn hình

    retval = SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 500, 400, SWP_NOSIZE Or SWP_NOMOVE)

    End Sub

    Hỏi: Xin cho biết cách lấy tên Account User đang login mạng tại máy người sử dụng bằng Visual Basic. Ví dụ login vô mạng với tên là “trunglt”, làm sao có thể lấy thông tin “trunglt” trong chương trình Visual Basic?

    Trả lời: Bạn có thể gọi hàm API GetUserString() của Windows để lấy tên user đang làm việc trên máy. Đoạn code VB cụ thể như sau :

    ‘ Khai báo hàm API GetUsername

    Private Declare Function GetUserName Lib “advapi32.dll” Alias “GetUserNameA” (ByVal lpBuffer As String, nSize As Long) As Long

    ‘Hàm lấy tên user và hiển thị

    Private Sub UserName_Click()

    Dim username As String

    namelen = 256

    username = String(namelen, Chr$(0))

    retval = GetUserName(username, namelen)

    ‘ Hiển thị tên user trong 1 thông báo

    MsgBox (username)

    End Sub

    Hỏi: Làm thế nào để nhận biết 1 file là dạng Image, Text hoặc Audio... trong Visual Basic hoặc API.

    Trả lời: Để nhận biết chính xác dạng file của 1 file nào đó, bạn cần có đặc tả chi tiết về các dạng file cần nhận dạng, thường mỗi dạng file có 1 vùng (từ 1 đến 4 byte) miêu tả dạng file đó. Phương pháp dựa vào phần đuôi của tên file (.doc, .xls,...) để kết luận dạng file chỉ đúng tương đối vì về nguyên tắc bất kỳ file nào cũng có thể ‘rename’ để có bất kỳ đuôi nào.

    Hỏi: Xin hướng dẫn cách thay đổi số Serial Number của đĩa cứng. Nếu có chương trình nguồn càng tốt.

    Trả lời: Thông số serial number của đĩa nằm trong boot sector của đĩa đó. Có nhiều cách truy xuất thông tin này, ở đây chúng tôi xin đề nghị cách dùng giao tiếp của DOS, cụ thể là hàm ah=69h của int21h cho phép đọc/ghi thông tin serial number của đĩa). Chương trình C nhỏ sau đây cho phép hiển thị số serial number của đĩa và cho phép thay đổi thành giá trị mới :

    #include

    #include

    #include

    // Định nghĩa kiểu dữ liệu

    typedef struct {

       unsigned short level_info;

       unsigned long serial_num;

       char vol_name[11];

       char fat_type[8];

    } T_DiskInfo;

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

    T_DiskInfo diskinfo;

    char pline[256];

    char drive;

    // chương trình chính

    void main(void) {

    struct REGPACK reg;

    unsigned int whigh, wlow;

    printf (“Nhap ten o dia can truy xuat : “);

    scanf(“%c”,&drive);

    // Thiết lập các thanh ghi

    reg.r_ax = 0x6900; // đọc thông tin

    reg.r_bx = drive-’a’+1;   // mã ổ đĩa

    reg.r_dx = FP_OFF(&diskinfo);

    reg.r_ds = FP_SEG(&diskinfo);

    intr(0x21, ®);

    // Hiển thị kết quả

      whigh = diskinfo.serial_num/0x10000l;

      wlow = diskinfo.serial_num%0x10000l;

      printf (“Volume serial number : %x-%x\n”,whigh,wlow);

      strncpy(pline,diskinfo.vol_name,11);

      pline[11] = 0;

      printf(“Volume name : %s\n”,pline);

      strncpy(pline,diskinfo.fat_type,8);

      pline[8] = 0;

      printf(“Fat type : %s\n”,pline);

      // Nhập số serial mới

    printf(“Nhap sn moi whigh = “);

    scanf (“%x”,&whigh);

    printf(“Nhap sn moi wlow = “);

    scanf (“%x”,&wlow);

    diskinfo.serial_num = (whigh*0x10000l)+wlow;

    // ghi lại

      reg.r_ax = 0x6901;    

    // ghi thông tin

      reg.r_bx = drive-’a’+1;

      reg.r_dx = FP_OFF(&diskinfo);

      reg.r_ds = FP_SEG(&diskinfo);           intr(0x21, ®);

    }

    Hỏi: 1. Có cách nào để format ổ đĩa A:\ mà không dùng hàm API ?

    2. Xin chỉ giúp cách format ổ đĩa cứng trong VB6.0.

    Trả lời: Nếu muốn format đĩa từ trong ứng dụng của mình, bạn bắt buộc phải gọi hàm của hệ thống, trong Windows ta gọi các hàm này là “API functions”. Thí dụ dưới đây là đoạn code viết  bằng Visual Basic format đĩa A:\ bằng cách gọi tiện ích format.com đã có sẵn của MSDOS (đây là cách dễ dàng nhất để format đĩa trong chương trình) :

    ‘ Khai báo các hàm API cần dùng

    Declare Function WinExec Lib “Kernel” (ByVal lpCmdLine As String, ByVal nCmdShow

       As Integer) As Integer

    Declare Function GetNumTasks Lib “Kernel” () As Integer

    ‘ Khai báo hằng cần dùng

    Const Resp_File = “c:\response.tmp”

    Const SW_HIDE = &H0

    Dim ActiveApps As Integer

    ‘ Hàm format đĩa a:

    Sub Command1_Click()

        ‘ Tạo file chứa các phím đáp ứng cho lệnh format

        Cmd = Chr(13) & Chr(10) & Chr(13) & Chr(10) & “N” & Chr(13) & Chr(10)

        FileNum = FreeFile

        Open Resp_File For Output As #FileNum

        Print #FileNum, Cmd

        Close #FileNum 

        ‘ Số task hiện hành 

        ActiveApps = GetNumTasks()

        ‘ Gọi tiện ích format.com

        X = WinExec(“dosprmpt.pif /c c:\dos\format a: < span="">

        ‘ Chờ format xong   

        Do While GetNumTasks() <> ActiveApps

            X = DoEvents()

        Loop   

        Kill Resp_File

    End Sub

    Hỏi: Xin hướng dẫn các thức hiển thị một applet của Control Panel trong Windows (Sounds, Multimedia...) với Visual Basic?

    Trả lời: Các applet trong Control Panel được chứa trong các file thư viện đặc biệt có đuôi là *.cpl. Mỗi file có thể chứa nhiều applet khác nhau, mỗi applet được đánh số từ 0 trở lên. Bạn có thể hiển thị 1 applet bất kỳ nếu bạn biết chỉ số của nó và file *.cpl chứa nó bằng cách gọi hàm API WinExec() với đối số hàng lệnh như sau :

    WinExec(“rundll32.exe shell32.dll,Control_RunDLL mycontrol.cpl,@i)

    trong đó ‘mycontrol’ là tên file *.cpl chứa applet cần chạy và ‘i’ là chỉ số của applet, nếu thông số ‘@i’ không được miêu tả thì applet đầu tiên (chỉ số 0) sẽ được hiển thị.

    Thí dụ đoạn code VB sau sẽ hiển thị applet “Sounds and Multimedia” :

    ‘ Khai báo hàm API cần gọi

    Private Declare Function WinExec Lib “kernel32” (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long

    ‘ Khai báo hằng cần dùng

    Const SW_SHOWNA = 8

    ‘Hàm hiển thị applet “Sounds and Multimedia”

    Private Sub Command1_Click()

       WinExec “rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl”, SW_SHOWNA

    End Sub

    Lưu ý thông số “Control_RunDLL” phải đi ngay sau dấu ‘,’ không có khoảng trống ở giữa và phải tuân thủ từng ký tự thường hay hoa.

    Hỏi: Tôi viết 1 chương trình xem ảnh bằng Visual Basic nhưng không biết làm cách nào để mỗi khi nhấn đúp vào 1 file ảnh trên Windows Explorer thì chạy chương trình của tôi và hiện luôn file ảnh giống trong ACDSee.

    Trả lời: Để giải quyết vấn đề mà bạn yêu cầu, bạn hãy tiến hành các bước sau :

    1. Viết ứng dụng có khả năng xử lý hàng lệnh, giả sử file chương trình được để ở c:\prog\app.exe và sẽ xử lý các file thông tin có đuôi là *.abc.

    2. Chạy tiện ích regedit.exe của Windows (bằng cách chọn menu Start.Run rồi nhập lệnh regedit).

    3. Vào key My Computer. HKEY_CLASSES_ROOT, nhấn phải chuột trên key này và chọn mục New.Key rồi nhập tên key mới là “.abc”. Như vậy bạn đã tạo được 1 key mới tên là My Computer.HKEY_CLASSES_ROOT..abc. Tiếp tục vào Key ‘.abc’ rồi tạo key con là ‘shell’, vào key ‘shell’ và tạo key con là ‘open’, vào key ‘open’ và tạo key con là ‘command’, vào key ‘command’ và nhấn phải chuột trên option ‘default’ của key command rồi chọn mục ‘Modify’ để thay đổi giá trị của option ‘default’ thành “c:\prog\app.exe %1”. Thoát khỏi tiện ích regedit.exe.

    Từ đây trở đi, khi bạn dùng Windows Explorer duyệt các file, mỗi lần bạn nhấn đúp chuột vào file *.abc thì chương trình của bạn sẽ được chạy, và khi chạy nó sẽ biết HĐH gởi cho nó tên file nào để xử lý.

    Nếu chương trình của bạn còn có thể xử lý các file có đuôi khác nữa thì bạn tiếp tục lặp lại quá trình tạo key cho các file có đuôi đó.

    Hỏi: Tôi lập trình bằng Access 97 và muốn hiển thị văn bản độ dài từ hai trang trở lên. Có cách nào gọi một file văn bản bên ngoài, ví dụ 1 file nào đó đang nằm tại my document?

    Trả lời: Bạn có thể dùng kiểu (type) ‘OLE Object’ cho 1 field trong bảng Access để liên kết với các file dữ liệu của các ứng dụng khác. Để liên kết 1 field OLE với file nào đó, bạn mở table Access tương ứng, nhấn chuột phải trên cell tương ứng rồi chọn mục “Insert Object”. Khi cửa sổ “Insert Object” hiện lên, bạn chọn checkbox “Create from file”, nhấn chuột vào nút “Browse” để chỉ định file cần liên kết. Sau khi đã liên kết với file, nếu muốn xem thông tin file này từ bảng Access, bạn chỉ cần nhấn kép chuột trên cell tương ứng.

    Mạng - Truyền Thông

    Hỏi: Khi viết trên ASP (Active Server Pages) có thể dùng câu lệnh WHERE trong SQL để truy cập hệ cơ sở dữ liệu dưới dạng biến chứ không phải là hằng số được không? Cho ví dụ minh họa.

    Trả lời: Dĩ nhiên là được và rất dễ dàng vì đây chính là điểm mạnh của ASP. Thật vậy, bạn có thể dùng môi trường lập trình InterDev của Microsoft để xây dựng các trang ASP truy xuất dữ liệu dùng giao tiếp ADO thông qua 2 điều khiển có sẵn ‘RecordSet’ và ‘Grid’. Để nhúng 1 điều khiển vào trang Web (hay ASP), bạn chỉ cần dùng cơ chế ‘drag mouse’ để kéo icon của nó từ cửa sổ Toolbox vào trang ASP, sau đó nhấn phải chuột trên RecordSet vừa tạo và chọn mục ‘Properties’ để hiển thị cửa sổ thuộc tính của RecordSet. Ở đây bạn sẽ khai báo 3 thuộc tính cơ bản nhất là ‘Name’ (tên nhận dạng RecordSet), ‘Connection’ (tên data source chứa database cần duyệt) và chọn checkbox ‘SQL Statement’. Tuy nhiên lúc này ta chỉ có thể nhập phát biểu SQL tìm kiếm ở dạng tĩnh. Để hiệu chỉnh lại phát biểu SQL ở dạng động, bạn có thể ‘override’ method ‘onbeforeopen’, đây là method sẽ được chạy mỗi khi RecordSet được mở. Để override method onbeforeopen của RecordSet, nhấn phải chuột trên phần tử RecordSet rồi chọn mục ‘Edit script’ để hiển thị cửa sổ ‘Script Outline’, mở mục ‘Server Objects & Events để tìm tên RecordSet, mở mục RecordSet và tìm hàm onbeforeopen(), nhấn đúp vào hàm để đi đến đoạn code của hàm và soạn thảo code theo mẫu sau:

    Sub

    KetquaTraDienThoai_onbeforeopen()

    ‘ Xây dựng lại phát biểu SQL mới trong biến newSQL

    ....

    ‘ Thiết lập lệnh SQL mới cho RecordSet

    KetquaTraDienThoai.setSQLText(newSQL)

    End Sub

    Hỏi: Muốn dùng chương trình Personal Web Server (PWS) của Microsoft trên máy đơn để chạy các trang ASP. Đã copy các file ASP này vào folder do PWS thiết lập mặc nhiên. Nhưng khi chạy các trang ASP này thì không thấy các phần tử xử lý trên server (trong trang ASP này) hoạt động. Xin hướng dẫn cách sử dụng chương trình PWS này.

    Trả lời: InterDev là môi trường lập trình Web trực quan của Microsoft, nó có giao diện thân thiện và rất dễ dùng. Có 2 vấn đề chính trong việc thiết kế Web dùng InterDev:

    - Soạn thảo, hiệu chỉnh nội dung và chỉnh dạng hình thức trang Web. Công việc này được thực hiện theo cách như Word làm, do đó nếu  bạn đã quen dùng Word thì bạn sẽ nhanh chóng thích nghi với InterDev.

    - Lập trình trong trang Web, công việc này được thực hiện khá giống với môi trường Visual Basic, nếu bạn đã quen lập trình VB, bạn sẽ không gặp khó khăn nào.

    Bộ CD-ROM tài liệu MSDN kèm theo đĩa Visual Studio chứa rất nhiều tài liệu hướng dẫn sử dụng InterDev cũng như các chương trình Web mẫu thí dụ.

    Trình PWS (Personal Web Server, phiên bản 4.0) là phiên bản tối thiểu của IIS chạy trên nền Win 9x, nó hỗ trợ ASP khá tốt. Để trang ASP hoạt động tốt, bạn phải truy xuất chúng thông qua PWS (chứ không được truy xuất chúng cục bộ dùng đường dẫn file bình thường). Để truy xuất các trang ASP thông qua PWS, bạn để chúng trong 1 thư mục, vào cửa sổ Properties của PWS để đăng ký thư mục cục bộ thành địa chỉ Website luận lý và từ đây bạn phải dùng địa chỉ dạng URL toàn cục để truy xuất các trang ASP (dạng http://địachỉ Webserver/pathname miêu tả trang ASP). Thường các trang ASP được truy xuất thông qua form, tuy nhiên bạn có quyền truy xuất chúng trực tiếp thông qua việc nhập URL vào thanh “Address” của IE hay thông qua lệnh liên kết siêu văn bản trong trang Web (tag ).

    Hỏi: Xin chỉ giúp cách tạo ASP truy cập CSDL bằng Access, tôi đã cài thử PWS nhưng không thể nào chạy được.

    Trả lời: Môi trường InterDev của Microsoft sẽ cho phép bạn dễ dàng tạo được các trang ASP (hay HTML) truy xuất dữ liệu thông qua giao tiếp cao cấp ADO (của bất kỳ database server nào chứ không riêng vì Access). Qui trình tiến  hành gồm có các bước chính sau đây:

    1. Tạo datasource name cho file database cần truy xuất bằng cách vào Control Panel.ODBC Data source. Ý tưởng của bước này là cho phép bạn kếp hợp tên gợi nhớ với file database và driver truy xuất nó để từ đây bạn dùng tên gợi nhớ để truy xuất database mà không cần biết vị trí cụ thể của file database cũng như nó được quản lý bởi database server nào.

    2. Chạy InterDev, tạo mới hay mở lại project miêu tả Website của bạn.

    3. Trong project Web, dùng lệnh “Add Data Connection” để khai báo từng “data source” mà các trang ASP trong project sẽ truy xuất.

    4. Trong project Web, bạn dùng lệnh “Add.Active Server Page” để tạo mới 1 trang ASP. Trong trang ASP có thể có nhiều phần tử, riêng để truy xuất database, bạn chỉ cần thêm vào trang ASP 2 điều khiển (control) là RecordSet và Grid. Cách thêm phần tử vào trang ASP rất dễ dàng: chọn nó ở cửa sổ Toolbox rồi kéo vào vị trí mong muốn trong trang ASP.

    5. Vào cửa sổ Properties của phần tử RecordSet và khai báo các thuộc tính kèm theo như Name, Connection, lệnh SQL xác định các record cần truy xuất. Lưu ý rằng lệnh SQL được xác định trong bước này chỉ xác định tĩnh các record cần truy xuất, bạn sẽ hiệu chỉnh lại trong hàm xử lý biến cố onbeforeopen() của RecordSet.

    6. Vào cửa sổ Properties của phần tử Grid và khai báo các thuộc tính kèm theo như Name, RecordSet kết hợp, các lệnh format hình thức phần tử Grid.

    7. Viết code cho hàm xử lý biến cố onbeforeopen() của RecordSet để xác định lại lệnh SQL theo các thông số mà người dùng yêu cầu.

    8. Chạy thử rồi sửa lỗi nếu có cho đến khi ăn ý.

    Riêng về PWS, đúng là nó hơi khó cài đặt. Bạn đọc phần trả lời về PWS của câu trên.

    Tiện Ích

    Hỏi: Làm thế nào để tìm được file EXE2BIN.EXE có thể dùng với MASM 6.11 trong WINDOWS 98. Nếu có thể, mong tòa báo gửi cho em file đó?

    Trả lời: Tiện ích exe2bin.exe của Microsoft có công dụng dịch các file chương trình dạng *.exe sang dạng *.com. Để có thể dịch sang dạng *.com, file *.exe cần thỏa nhiều điều kiện như không vượt quá 64KB, không có tham khảo đến các phần tử bên ngoài file, không chứa nhiều segment, nhất là stack segment,... Từ phiên bản DOS 3.3 trở lên, Microsoft không còn để tiện ích này chung với HĐH nữa. Hiện nay có nhiều tiện ích freeware có chức năng tương tự như trình exe2com.exe của Chris Dunford,... Nếu bạn cần tiện ích này cùng source code viết bằng C của nó, hãy liên hệ PCWorld. Lưu ý rằng tiện ích exe2bin hay exe2com có thể dịch file *.exe của nhiều chương trình dịch khác nhau chứ không riêng gì của MASM 6.11, còn các ứng dụng trong Windows thường quá lớn và chứa nhiều segment nên không thể đổi sang dạng *.com, chỉ có những chương trình nhỏ trên DOS dùng model 'tiny' mới có thể dịch được sang *.com.

    Hỏi: Xin cho biết chương trình nào có thể tạo được các file *.ani, *.cur dành cho các loại chuột trên hệ thống Windows.

    Trả lời: Tiện ích “Resource editor” được tích hợp trong Visual C++ là một trong nhiều phần mềm cho phép soạn các ảnh cursor tĩnh. Còn chương trình Aniedit.exe (Animated cursor editor) là một trong nhiều phần mềm cho phép bạn tạo cursor động bằng cách khai báo danh sách các file cursor tĩnh cấu thành cursor động đó. Tuỳ theo độ mịn trong chuyển động của cursor mà bạn phải vẽ bao nhiêu ảnh tĩnh, nhưng thường khoảng từ 4 ảnh trở lên là đủ. Bạn có thể tìm và copy trình Aniedit.exe trong CDROM MSDN kèm theo bộ Visual Studio.

    Windows

    Hỏi:  Khi nhấn Ctrl+Alt+Del xuất hiện danh sách các chương trình, các chương trình này có tác dụng như thế nào? Nếu thiếu những chương trình nào thì máy sẽ không hoạt động? Những chương trình nào không cần thiết? cách tắt những chương trình không cần thiết này  (ví dụ: dibkgnd, cgmmenu, cg16eh, csinject, zm32, nprotect, systray, osa, uknt,ctnotify, mediadet, newsupd, ypager,sm56hlpr,rnaapp, wkcal-rem...)?

    Trả lời: Khi bạn nhấn trình tự phím Ctrl+Alt+Del, máy sẽ hiển thị danh sách các chương trình đang chạy trên Windows để bạn có thể kiểm tra và nếu cần xóa bớt chúng. Tùy vào yêu cầu dùng máy cụ thể của bạn mà chương trình nào sẽ cần thiết cho bạn. Trong trường hợp tối thiểu, ở đó chỉ còn lại trình “Explorer” trong danh sách, Windows vẫn hoạt động bình thường và bạn vẫn tiếp tục dùng Windows để chạy ứng dụng. Để xóa 1 chương trình trong danh sách, bạn chỉ cần chọn nó rồi nhấn vào nút “End task”.

    Hỏi: Máy tính không có kết nối máy in nhưng cần in một file hình. Định dạng in xuất ra file. Chép tập tin kết quả sang máy tính có kết nối máy in và sử dụng lệnh “type tentaptin.prn> prn” để in nhưng lại nhận được không phải là hình ảnh muốn in.

    Trả lời: Hầu hết các ứng dụng trên Windows đều có khả năng in dữ liệu của mình bằng máy in được quản lý bởi Windows. Trong trường hợp này, bạn chỉ cần cài driver máy in (mà bạn dự định sẽ in ở dịch vụ) vào máy mình, vào cửa sổ thuộc tính của icon máy in tương ứng, chọn trang “Details”, chọn mục “File:” trong combobox “Print to the following port:” để hướng kết quả in ra file. Từ đây hoạt động in của mọi ứng dụng đều sẽ được cất lên file với tên do hệ thống yêu cầu bạn nhập vào. Bạn chỉ cần copy file này sang đĩa mềm, CD-ROM (hay thông qua mạng), đem nó đến máy tính có nối kết máy in rồi thực hiện lệnh copy file ra máy in như sau “copy file.prn prn /B”. Lưu ý vì file *.prn là file nhị phân nên lệnh ‘type’ mà bạn dùng có thể không hoạt động đúng.

    Hỏi: Sau khi mở ra nhiều ứng dụng (như Word, Excel, Photoshop...), sử dụng xong và đóng lại. Sau đó chơi game Tomb Raider thì thấy game đi rất chậm và bị giật. Khởi động lại máy thì game đi rất tốt. Rõ ràng là các ứng dụng trên đã không trả hết bộ nhớ lại cho máy sau khi thoát ra mà vẫn còn giữ lại ở đâu đó. Vậy làm cách nào để có lại đầy đủ bộ nhớ sau khi thoát khỏi một ứng dụng?

    Trả lời: Đúng là việc giải phóng tài nguyên cho các ứng dụng phải do chính ứng dụng đó thực hiện. Nếu ứng dụng không giải phóng hết tài nguyên mà mình đã dùng thì các tài nguyên này sẽ trở thành “rác” vì Windows không có khả năng giải phóng dùm. Hiện chưa có tiện ích nào tìm và giải phóng rác trong Windows triệt để và hiệu quả bằng cách khởi động lại Windows.

    Virus

    Hỏi: Tôi đang dùng OS WinMe. Thỉnh thoảng tôi không thấy ổ CD-ROM. Tôi đã thử quét virus bằng BKAV345 thì được báo máy bị nhiễm virus WX97 Macro.N. Tôi đã diệt bằng đĩa mềm sạch từ DOS, nhưng lại không thể nào vào Win được nữa mà chỉ vào được chế độ Safe mode. Xin cho hỏi tại sao ổ CD-ROM hay bị biến mất? Khi bị mất ổ CD-ROM tôi phải làm thế nào để nó có trở lại?  Virus macro trên lây lan như thế nào và có tác hại gì?

    Trả lời: Virus WX97 Macro.N là 1 loại virus macro, nó chỉ gắn vào các file *.dot hay *.doc của WinWord. Lần đầu tiên mở file *.doc bị nhiểm trên máy sạch, Word sẽ hiển thị cửa sổ cảnh báo bạn, nếu bạn chọn nút "Enable" thì nó mới được chạy và từ đây nó sẽ lây lan. Cơ chế lây lan của các virus macro thường là gắn vào file template chuẩn normal.dot của Word để từ đây mỗi lần bạn mở file *.doc khác, nó sẽ chích qua file đó. Do virus macro được viết chủ yếu bằng Visual Basic nên nó cũng có thể làm bất cứ điều gì mà 1 chương trình có thể làm.

    Nếu máy bạn có virus macro và bạn đã chạy 1 trình diệt virus thì hầu như chúng đã bị xóa sạch khỏi các file trên đĩa, hiện tượng mất ổ CD-ROM trong Windows có thể là do bạn copy thêm 8 file *.vxd. Bạn nên đọc thêm bài "Quan điểm mới: WinME có thiếu VxD hay không ?" ở trang 87, số báo tháng 8/2001 để biết thêm chi tiết. Đa số các ổ CD-ROM hiện nay đều là dạng Plug-and-Play, do đó nếu bị mất ổ CD, bạn hãy vào Control Panel.System.Device Manager, xóa mục CD-ROM rồi boot máy lại để nó tự nhận dạng lại ổ CD-ROM. Tuy nhiên nếu Windows đã bị trục trặc (thí dụ do các file Vxd mới copy vào làm nó chạy không bình thường) thì việc tự nhận dạng lại có thể không thành công.

    In Ấn

    Hỏi: Khi in văn bản trong Word thì kết quả bình thường nhưng khi in văn bản từ các trang Web thì các chữ thường bị biến dạng và trên tờ giấy in để lại rất nhiều vết mực ngắn, đậm (kể cả khi đã chọn chế độ in là chỉ in vùng văn bản). Đang sử dụng máy in kim LQ300.

    Trả lời: Chúng tôi không có máy in LQ300 để thử trường hợp in từ Web như bạn trình bày. Hiện tượng này nếu xảy ra cũng là chuyện thường, nguyên nhân là trình Web Browser không tương thích với driver máy in của bạn. Cách khắc phục đơn giản nhất là “Select all’ dữ liệu trong trang Web, copy nó vào clipboard, dán vào cửa sổ Word rồi từ Word chỉnh dạng lại (nếu cần) và in ra giấy. Lưu ý rằng Word là chương trình tương thích tốt với hầu hết các driver máy in hiện có.

    Hỏi: Tôi dùng máy in laser Canon LBP-800. Trong Windows thì in tốt, nhưng ngoài DOS, ví dụ như ở chế độ "Restart in MS DOS" hoặc khi khởi động nhấn F8 để vào DOS luôn thì hầu như không thấy máy in. Tôi dùng NC 5.0 (đang chạy ở DOS hoặc trong Windows) để in các file có dạng text (*.txt) bằng cách bấm Ctrl-F9 thì máy lại dừng lại do không tìm được máy in. Tôi cũng dùng chương trình edit.com của DOS nhưng cũng không in được. Hiện nay trong file autoexec.bat và config.sys không có dòng lệnh nào. Vậy tôi xin quý báo có thể giải thích và hướng dẫn cách khắc phục.

    Trả lời: DOS tự hiểu máy in được nối ở port LPT1 (cổng song song), khi 1 ứng dụng trên DOS xuất dữ liệu ra máy in thì DOS sẽ xuất dữ liệu ra cổng LPT1, nếu máy in đã được nối vào cổng này thì nó sẽ nhận được dữ liệu, nếu dữ liệu là text thô thì hầu hết các máy in đều in được đúng chúng. Tóm lại việc in ấn trên DOS rất đơn giản và khó lòng bị trục trặc, do đó DOS là môi trường lý tưởng để kiểm tra máy in có còn hoạt động không, qui trình cụ thể như sau:  gắn máy in vào cổng LPT1, cấp nguồn và giấy in cho máy in, boot DOS, dùng lệnh "copy PRN" để in file "textfile" ra máy in. Nếu máy in in được nội dung của file text này thì có thể kết luận là nó đã được kết nối tốt với máy tính và đang hoạt động tốt. Lưu ý rằng nếu bạn dùng máy in laser thì phải xuất dữ liệu nhiều hơn 1 trang (hay trong dữ liệu có mã điều khiển sang trang, mã 12) thì máy in mới bắt đầu hoạt động in thực sự ra giấy, vì máy in laser dùng cơ chế in toàn trang, khác với cơ chế in từng hàng của máy in kim hay phun mực.

    Cái gì? Ở đâu?

    Hỏi: Xin cho biết ngôn ngữ Python là loại ngôn ngữ gì và có thể tìm sách hướng dẫn hay CD ở đâu.

    Trả lời: Python là ngôn ngữ lập trình hướng đối tượng như C++, Java. Ngôn ngữ này được dùng chủ yếu để lập trình Web. Do chưa được dùng phổ biến nên bạn rất khó tìm tài liệu tiếng Việt, tuy nhiên nếu bạn biết tiếng Anh, bạn có thể truy cập trực tiếp tới Website http://www.python.org để tham khảo thông tin chi tiết về ngôn ngữ này.

    Hỏi: Xin cho biết cách lập trình Visual Basic để gởi e-mail.

    Trả lời: Bạn có thể lập trình trực tiếp trên thư viện winsock và dùng giao thức SMTP (Simple Mail Transfer Protocol) để gởi 1 hay nhiều e-mail đến nhiều đối tác. Chi tiết về giao thức SMTP được trình bày trong RFC821, chi tiết về format 1 e-mail được trình bày trong RFC822, chi tiết về format e-mail nới rộng dùng chuẩn MIME được trình bày trong RFC1341và RFC1521. Bạn có thể liên hệ với PCWorld để chép các RFC này.

    Hỏi: Tôi muốn có chương trình dịch ngược Visual FoxPro 6.0 với mục đích học tập.

    Trả lời: Trình Refox chỉ cho phép dịch ngược các chương trình do FoxPro 2.x trên DOS tạo ra. Hiện chúng tôi chưa tìm thấy chương trình nào có khả năng dịch ngược file của Visual FoxPro 6.0 của Microsoft cả. Nếu mục đích là học lập trình, bạn nên tham khảo các đoạn source code mẫu trong các sách miêu tả các chức năng đơn giản. Còn việc đọc 1 chương trình lớn (dù được dịch ngược lại dạng source code) sẽ rất khó khăn vì bạn không có thuật toán của chương trình. Việc đọc source code để tìm lại thuật toán của nó là công việc phức tạp nên nó không thích hợp cho người mới bắt đầu lập trình.

    Hỏi: Em dự định mua máy in và đang lưỡng lự giữa 2 loại là:  HP 1100 và CANON LBP 800, xin hỏi loại máy in LBP 800 của CANON có tốt không? máy in CANON thì rẻ hơn máy in HP.

    Trả lời: Nếu dựa vào nhiều yếu tố thì bạn nên mua máy in HP. Thực vậy, không riêng gì CANON mà còn nhiều hiệu máy in laser khác rất rẻ và có nhiều thông số cũng khá hấp dẫn, nhưng máy in HP vẫn có những ưu thế mà các máy khác chưa chứng tỏ được:  được dùng đại trà nên việc sửa chữa, mua linh kiện thay thế sẽ dễ dàng, driver cho máy in HP đã được thử thách trong 1 thời gian dài để có thể chạy tốt với hầu hết mọi ứng dụng ở mọi chế độ in, các ứng dụng đặc biệt luôn có driver cho máy in HP, chất lượng sử dụng và tuổi thọ của HP cũng được chứng minh là rất tốt...

    ID: A0201_86
    Ý kiến của bạn? Ý kiến của bạn?
    Tin ngày :

Thuật ngữ