Xem bai viet bang font Unicode


   

PCWorld VN

Hái: Trong Pascal cã c¸ch nµo sö dông bé nhí më réng ®­îc kh«ng?

Tr¶ lêi: Trong ch­¬ng tr×nh ®­îc viÕt b»ng bÊt kú ng«n ng÷ nµo, b¹n còng cã thÓ sö dông bé nhí bµnh tr­íng EMS (Expanded Memory Specification) vµ/hoÆc bé nhí më réng XMS (Extented Memory Specification) b»ng c¸ch gäi c¸c chøc n¨ng cña nã th«ng qua ®iÓm nhËp int qui ®Þnh s½n. B¹n nªn dïng bé nhí XMS v× nã hiÖu qu¶ h¬n EMS, ®iÓm nhËp truy xuÊt dÞch vô XMS lµ int 2f. B¹n cã thÓ tham kh¶o bµi "Bé nhí më réng vµ c¸ch truy cËp bé nhí më réng b»ng Turbo Pascal" trªn ThÕ Giíi Vi TÝnh sè th¸ng 6/97, trang 72 ®Ó biÕt thªm chi tiÕt vÒ c¸ch dïng bé nhí XMS.

Hái: Trong phÇn mÒm VietRes 2.5 cã mét ch­¬ng tr×nh viÕt b»ng Pascal dïng ®Ó n¹p vµ bá font VietSea cho m¸y tÝnh. VËy quÝ b¸o cã thÓ viÕt l¹i dïm em ch­¬ng tr×nh trªn b»ng ng«n ng÷ C cã ®­îc kh«ng.

    Em ®ang häc Pascal. Em cã thÓ viÕt mét sè ch­¬ng tr×nh ®¬n gi¶n mµ khi ch¹y cã thÓ hiÓn thÞ c¸c c©u th«ng b¸o b»ng tiÕng ViÖt lªn mµn h×nh (ChØ sö dông ®­îc khi ®· ch¹y VietRes tr­íc). Lµm thÕ nµo cã thÓ hiÓn thÞ ch÷ tiÕng ViÖt lªn mµn h×nh mµ kh«ng cÇn ch¹y VietRes. ThÝ dô nh­ dÞch sang tËp tin ch¹y ®­îc *.exe. Tõ dÊu nh¾c hÖ ®iÒu hµnh ®¸nh tªn ch­¬ng tr×nh th× ch¹y vµ hiÖn tiÕng ViÖt.

Tr¶ lêi: §Ó ch­¬ng tr×nh cña b¹n hiÓn thÞ ®­îc tiÕng ViÖt mµ kh«ng cÇn ph¶i cã tr×nh VietRes (hay mét tr×nh qu¶n lý tiÕng ViÖt kh¸c), b¹n cÇn so¹n font tiÕng ViÖt theo b¶ng m· cña b¹n, råi trong ch­¬ng tr×nh Pascal, tr­íc khi hiÓn thÞ v¨n b¶n, b¹n n¹p b¶n m· cña b¹n vµo hÖ thèng. L­u ý khi dõng ch­¬ng tr×nh, b¹n nªn n¹p l¹i font chuÈn cña m¸y. Sau ®©y lµ mét ch­¬ng tr×nh nhá minh häa ý t­ëng trªn:

Program thu_napfont;

Uses Crt, Dos;

Const vcode: Array[1..4096] of Byte = ($00,....); { baãn maä tiïëng Viïåt cuãa baån }

Var vmode : Boolean;

{ Thu tuc khoi dong bang ma tieng Viet }

Procedure VietInit;

Var R: Registers;

Begin

if (vmode) then exit;

{ Cai bang ma tieng Viet }

R.ax := $1100;

R.bx := $1000;

R.cx := $0100;

R.dx := 00;

R.es := Seg (vcode);

R.bp := Ofs (vcode);

intr($10,R);

vmode := TRUE;

End;

{ Thu tuc phuc hoi bang ma goc}

Procedure VietClose;

Var R : Registers;

Begin

if (NOT vmode) then exit;

{ Phuc hoi bang ma chuan }

R.ax := 3;

intr($10,R);

vmode := FALSE;

End;

Begin

clrscr;

VietInit;

write (‘Thö hiÓn thÞ tiÕng ViÖt’); readln;

VietClose;

write (‘Thö xem cßn hiÓn thÞ tiÕng ViÖt kh«ng?’); readln;

End.

    NÕu b¹n cÇn font cho mét b¶ng m· tiÕng ViÖt nµo ®ã, b¹n cã thÓ liªn hÖ víi chóng t«i ë ®Þa chØ : NguyÔn V¨n HiÖp, Khoa CNTT §H Kü ThuËt TP.HCM, §T : (8) 865 8689 Ext.500 ®Ó sao chÐp.

Hái: C¸ch dïng Pascal 7.0 ®Ó lËp tr×nh cho 2 phÇn lµm viÖc song song nhau? VÝ dô nh­ ta cã thÓ lµm viÖc kh¸c ngay khi mét vßng trßn ®ang di chuyÓn ch¼ng h¹n. Mong quý b¸o gi¶i thÝch vµ cho vÝ dô cô thÓ.

Tr¶ lêi: §Ó lËp tr×nh song song, b¹n cÇn cã th­ viÖn hç trî. Th­ viÖn lµ module phÇn mÒm chøa nhiÒu thñ tôc ®Ó phôc vô mét dÞch vô nµo ®ã, thÝ dô th­ viÖn ®å häa, th­ viÖn gäi thñ tôc tõ xa RPC, th­ viÖn multimedia, th­ viÖn qu¶n lý process vµ thread,... Trªn nh÷ng H§H ®¬n ch­¬ng (nh­ MS-DOS), th­ viÖn hç trî nµy ph¶i ®­îc viÕt trong kh«ng gian cña ch­¬ng tr×nh øng dông (nh­ th­ viÖn ®å häa cña Borland, ...), cßn trªn c¸c H§H ®a ch­¬ng th× th­ viÖn nµy ®­îc tÝch hîp trong H§H (nh­ Windows, Unix,...). Tãm l¹i ®Ó lËp tr×nh song song, b¹n nªn lËp tr×nh trªn H§H ®a ch­¬ng, trong ®ã Win9x vµ Win NT lµ c¸c ®¹i biÓu v× chóng lµ c¸c H§H multi-process, multi-thread.

    L­u ý lµ b»ng gi¶i thuËt tuÇn tù ta cã thÓ t¹o ra c¸c ¶o gi¸c ®ång thêi cho ng­êi dïng, thÝ dô ta cã thÓ lËp tr×nh tuÇn tù ®Ó t¹o ra c¸c chuyÓn ®éng cña nhiÒu phÇn tö ®ång thêi trong mét trß ch¬i nµo ®ã.

Hái: Lµm thÕ nµo ®Ó hiÓn thÞ chuét trong 256 mµu chÕ ®é ph©n gi¶i cao (640 x 480, 800 x 600). HiÓn thÞ chuét ®å häa mhiÒu mµu nh­ trß ch¬i Warcraft II.

    Xin t¹p chÝ h­íng dÉn cho t«i c¸ch viÕt ®o¹n ch­¬ng tr×nh ®iÒu khiÓn mouse. §o¹n ch­¬ng tr×nh dïng ®Ó hiÖn täa ®éÈ cét & dßng cña mouse, khi mouse di chuyÓn trªn mµn h×nh ®å häa, vµ täa ®é nµy thay ®æi mçi khi mouse di chuyÓn (gièng nh­ c¸c phÇn mÒm xö lý ¶nh ch¹y trong Win). HiÖn t¹i t«i ®ang lËp tr×nh b»ng ng«n ng÷ C. T«i ®· sö dông ng¾t (0x33) vµ thanh ghi Ax = 3, gi¸ trÞ tr¶ vÒ dx, cx chØ sè dßng, sè cét cña mouse, nh­ng khi dïng lÖnh cout << dx <<"\t" << cx th× trªn mµn h×nh chØ xuÊt ra gi¸ trÞ kh«ng ®óng víi täa ®é mouse vµ khi mouse di chuyÓn th× täa ®é ®ã kh«ng thay ®æi.

Tr¶ lêi: §Ó dïng mouse trong chÕ ®é ®å häa nµo ®ã trªn MSDOS, b¹n ph¶i khëi ®éng l¹i c¸c th«ng sè ®óng vÒ ®é ph©n gi¶i mµn h×nh cho driver mouse, sau ®ã dïng chøc n¨ng ah=3 cña int 33 míi tr¶ vÒ vÞ trÝ ®óng cña mouse. B¹n ph¶i lu«n gi¸m s¸t tr¹ng th¸i di chuyÓn mouse ®Ó kÞp thêi hiÓn thÞ täa ®é ®óng cña nã. B¹n nªn tham kh¶o ch­¬ng tr×nh thÝ dô vÒ ®iÒu khiÓn mouse ë PC World VN sè 09/98 trang 115, ®Ó biÕt râ qui tr×nh c¬ b¶n vÒ ®iÒu khiÓn mouse. B¹n còng cã thÓ thiÕt kÕ l¹i h×nh d¹ng vµ mµu s¾c cña cursor chuét trong chÕ ®é ®å häa.

Hái: C¸ch lËp tr×nh xãa tÊt c¶ c¸c file cã tªn: *.pas, *.cpp... b»ng c¸ch sö dông ng¾t Bios (kh«ng sö dông ng¾t cña DOS). (T«i ®ang sö dông C ch¹y trong DOS).

Tr¶ lêi: Khi lËp tr×nh, nÕu b¹n dïng c¸c dÞch vô cµng thÊp th× cµng khã kh¨n, phøc t¹p vµ ch­¬ng tr×nh cµng khã "portable". Do ®ã ®Ó ch­¬ng tr×nh cã thÓ ch¹y trªn nhiÒu version MSDOS kh¸c nhau vµ trªn nhiÒu m¸y kh¸c nhau, b¹n chØ nªn dïng c¸c dÞch vô tõ MSDOS (Int 21h) trë lªn, thÝ dô nh­ c¸c hµm trong th­ viÖn lËp tr×nh cña c¸c ng«n ng÷ lËp tr×nh. Víi nh÷ng m¸y tÝnh cã tèc ®é rÊt cao nh­ hiÖn nay, vÊn ®Ò tèc ®é thi hµnh ch­¬ng tr×nh (nhÊt lµ trªn nÒn MSDOS) hÇu nh­ kh«ng cßn cÇn ph¶i quan t©m n÷a.

    §Ó xãa tÊt c¶ c¸c file thuéc 'pattern' nµo ®ã mét c¸ch ®Ö qui, b¹n cÇn ph¶i cã mét gi¶i thuËt duyÖt c©y ®Ö qui ®Ó mçi lÇn gÆp mét file b¹n sÏ thùc hiÖn thao t¸c t­¬ng øng. Sau ®©y lµ mét ch­¬ng tr×nh nhá ®­îc viÕt b»ng C cã chøc n¨ng xãa ®Ö qui nh­ yªu cÇu cña b¹n :

/*————————————————*/

/* Chuong trinh duyet cay de qui de thuc hien mot tac vu */

/* Nguoi viet : NGUYEN VAN HIEP, TTDT DHBK Tp.HCM */

/* Ngay viet: 10 - 09 - 1991*/

/* Ngon ngu: Borland C++ */

/*—————————————————*/

#include <dos.h>

#include <io.h>

#include <dir.h>

#include <ctype.h>

#include <stdio.h>

typedef void (*PPROC)(char*, char*, struct ffblk);

void xoaphantu(char* drive, char* directory, struct ffblk pblock);

void duyetcay (char *patern, PPROC action);

int fcount = 0; /* so file bi xoa */

int dcount = 0; /* so directory bi xoa */

// Chuong trinh chinh

void main(int argc, char* argv[])

{

int i;

if (argc < 2) {

printf("Hay danh lenh : xoadq <pattern1> ... <patternn> <Enter>\n");

exit(1);

}

for (i = 1; i <argc; i++) duyetcay(argv[i], xoaphantu);

printf("\t\t\tCo %d thu muc va %d file bi xoa.\n",dcount,fcount);

}

/*—————————————————*/

/* Kiem tra file filename co thuoc pattern patname qui dinh khong ? */

/* Tra ve 1 neu thuoc ve, 0 trong truong hop nguoc lai */

/*————————————————*/

thuocve (char *filename, char *fext, char *patname, char *patext)

{

while (*patname && *filename) { // xet tung ky tu trong phan ten

if (*patname == ‘*’) goto kiemtraext; // ten thuoc ve

if (*patname == ‘?’ || (toupper(*patname)==toupper(*filename)))

{ patname++; filename++; continue; }

return 0; // ten khong thuoc ve

}

if (*filename == 0 && *patname == ‘*’) goto kiemtraext;

if (*patname || *filename) return 0;

kiemtraext:

if (*fext == 0 && patext[0] == ‘.’ && patext[1] == ‘*’) return 1;

while (*patext && *fext) { // xet tung ky tu trong phan noi rong

if (*patext == ‘*’) return 1;

if (*patext == ‘?’ || (toupper(*patext)==toupper(*fext)))

{ patext++; fext++; continue; }

return 0;

}

if (*fext == 0 && *patext == ‘*’) return 1;

if (*patext || *fext) return 0;

return 1;

}

/*————————————————*/

/* Duyet cay thu muc va thuc hien chuc nang qui dinh */

/*————————————————*/

void duyetcay (char *patern, PPROC action)

{

char drive[4], directory[100], patname[9], patext[5];

char buff[128], filename[9], file_ext[5];

struct ffblk pblock;

int result;

// tach patern ra ca thanh phan

fnsplit(patern, drive, directory, patname, patext);

// xay dung lai patern can duyet

sprintf(buff,"%s%s*.*",drive, directory);

// tim phan tu dau tien thoa man patern

result = findfirst(buff,&pblock, 0xFF);

while (!result) { // con phan tu

// khong xu ly label, thu muc hien tai va cha cua no

if (pblock.ff_name[0] == ‘.’ || (pblock.ff_attrib & FA_LABEL))

{ result = findnext(&pblock); continue; }

fnsplit(pblock.ff_name, buff, buff, filename, file_ext);

if(pblock.ff_attrib &FA_DIREC) // thu muc

if(thuocve(filename, file_ext, patname, patext))

{

// xoa tat ca phan tu con cua thu muc

sprintf(buff,"%s%s%s\\*.*",drive, directory,pblock.ff_name);

duyetcay(buff,action);

// thuc hien action tren phan tu nay

action(drive,directory,pblock);

}

else

{ // chi xoa cac phan tu con thoa patern

sprintf(buff,"%s%s%s\\%s%s", drive,directory,

pblock.ff_name,patname, patext); duyetcay(buff,action);

}

else // xu ly file binh thuong

if(thuocve(filename, file_ext, patname, patext))

{

// thuc hien action tren phan tu nay

action(drive,directory,pblock);

}

result = findnext(&pblock);

}

}

/*—————————————————*/

/* Xoa phan tu theo yeu cau.*/

/* Phan tu co the la file hay thu muc trong*/

/*——————————————*/

void xoaphantu(char* drive, char* directory, struct ffblk pblock)

{

char buff[128];

sprintf(buff,"%s%s%s",drive, directory,pblock.ff_name);

if (pblock.ff_attrib & FA_RDONLY)

{ // xoa bit readonly

struct REGPACK rreg;

rreg.r_ax = 0x4301; rreg.r_cx = 0;

rreg.r_ds = FP_SEG(buff); rreg.r_dx = FP_OFF(buff);

intr(0x21, &rreg);

}

if (pblock.ff_attrib & FA_DIREC)

{ // neu la thu muc thi xoa thu muc

printf("rdir %s\n",buff);

rmdir(buff); dcount++;

}

else

{ // neu la file thi xoa file

printf("del %s\n",buff);

remove(buff); // neu khong co dung unlink()

fcount++;

}

}

    B¹n cã thÓ cÊt ch­¬ng tr×nh trªn vµo file xoadq.c, dïng ch­¬ng tr×nh dÞch C++, thÝ dô :

bcc -ml xoadq.c ®Ó t¹o ra file xoadq.exe. NÕu b¹n muèn xãa tÊt c¶ c¸c file *.pas vµ *.cpp ë æ cøng c: vµ d:, b¹n h·y nhËp lÖnh :

xoadq c:\*.pas c:\*.cpp d:\*.pas d:\*.cpp

    L­u ý lµ søc c«ng ph¸ cña ch­¬ng tr×nh trªn rÊt ¸c liÖt, b¹n ph¶i rÊt cÈn thËn trong viÖc nhËp th«ng sè v× nÕu kh«ng tai häa sÏ khã l­êng (thÝ dô nÕu b¹n nhËp lÖnh xoadq c:\*.* th× toµn bé ®Üa c: sÏ bÞ xãa tr¾ng).

Hái: C¸c ch­¬ng tr×nh ®­îc lËp tr×nh vµ dÞch b»ng nh÷ng ng«n ng÷ lËp tr×nh ch¹y trong Windows (for Windows) th× ch¹y ®­îc trong Windows ph¶i kh«ng?

- Nh÷ng ng«n ng÷ lËp tr×nh trong Windows (for Windows) nµo cã chÕ ®é ®å häa phong phó ®Ó cã thÓ t¹o ra c¸c ch­¬ng tr×nh cã mµu ®å häa phong phó?

-Trong th­ môc C:\Windows\ System em thÊy cã rÊt nhiÒu file cã phÇn ®u«i lµ .dll. Xin hái ®ã lµ nh÷ng file g×, t¸c dông, ®­îc t¹o ra nh­ thÕ nµo?

Tr¶ lêi: §a sè c¸c m«i tr­êng lËp tr×nh trong Windows ®Òu t¹o ra ch­¬ng tr×nh ®Ó ch¹y trong Windows, tuy nhiªn còng cã mét sè ngo¹i lÖ: c¸c m«i tr­êng lËp tr×nh cò cña h·ng Borland cho phÐp t¹o ch­¬ng tr×nh ch¹y trªn MS-DOS hay trªn Windows tïy thuéc vµo th«ng sè lóc dÞch.

    C¸c chøc n¨ng ®å häa th­êng ®­îc hç trî bëi Windows vµ c¸c th­ viÖn lËp tr×nh, chø kh«ng phô thuéc vµo ng«n ng÷ lËp tr×nh. B¹n cã thÓ dïng bÊt kú ng«n ng÷ nµo trong Windows ®Ó t¹o ra ®å häa cã mµu s¾c phong phó nÕu chÕ ®é ®å häa cña Windows hiÖn t¹i trªn m¸y b¹n tõ 256 mµu trë lªn.

    C¸c file *.dll lµ c¸c th­ viÖn liªn kÕt ®éng, mçi file *.dll th­êng chøa nhiÒu thñ tôc gi¶i quyÕt mét sè vÊn ®Ò nµo ®ã mµ sÏ ®­îc dïng bëi c¸c phÇn mÒm kh¸c. VÒ nguyªn t¾c, tõ ch­¬ng tr×nh cña b¹n, b¹n cã thÓ gäi bÊt kú thñ tôc nµo trong mét file *.dll nÕu b¹n biÕt tªn thñ tôc vµ danh s¸ch ®èi sè cña thñ tôc ®ã.

    Tr×nh tù ®Ó t¹o ra mét file *.dll còng gièng nh­ tr×nh tù t¹o file ch­¬ng tr×nh: viÕt source code c¸c thñ tôc, dÞch source code ®Ó t¹o ra file *.dll. Tr­íc khi dÞch b¹n cÇn khai b¸o th«ng sè cho ch­¬ng tr×nh dÞch biÕt kÕt qu¶ dÞch lµ t¹o ra ch­¬ng tr×nh hay file *.dll.

Hái: §Ò nghÞ tßa so¹n cho 1 vÝ dô cô thÓ vÒ lÖnh Exec cña Pascal, gäi ch­¬ng tr×nh Vrd.exe cña VietRes.

Tr¶ lêi: §Ó ch¹y tr×nh vrd.exe tõ ch­¬ng tr×nh Pascal, b¹n dïng lÖnh Exec nh­ sau:

Exec(‘c:\vietres\vrd.exe’,’’);

    vµ nÕu muèn dõng tr×nh vrd.exe, b¹n dïng lÖnh Exec(‘c:\vietres\vrd .exe’,’/u’);

    Trong thÝ dô trªn, gi¶ sö file vrd.exe n»m ë th­ môc vietres trªn ®Üa c:\. B¹n nªn thªm vµo macro khai b¸o dung l­îng bé nhí heap nhá l¹i ®Ó ch­¬ng tr×nh vrd.exe ch¹y ®­îc, thÝ dô b¹n thªm macro sau vµo ®Çu ch­¬ng tr×nh Pascal cña b¹n:

{$M $4000,0,0} {16K stack, no heap}

Hái: Trong qu¸ tr×nh lËp tr×nh trªn mét sè ng«n ng÷ nh­ Pascal, C, C++, cã mét sè ®o¹n ch­¬ng tr×nh chøa 3, 4 hoÆc cã nhiÒu hµm hay thñ tôc. §o¹n ch­¬ng tr×nh nµy ®­îc øng dông vµo nhiÒu ch­¬ng tr×nh kh¸c nhau.

    Lµm thÕ nµo ®Ó sö dông ®o¹n ch­¬ng tr×nh nµy vµo nh÷ng ch­¬ng tr×nh kh¸c nhau mµ kh«ng ph¶i tèn c«ng viÕt ®o¹n ch­¬ng tr×nh nµy l¹i.

Tr¶ lêi: B¹n cã thÓ ®Þnh nghÜa mét thñ tôc míi chøa ®óng nh÷ng hµng lÖnh ®­îc dïng bëi nhiÒu ch­¬ng tr×nh. B¹n ®Ó thñ tôc nµy (vµ cã thÓ nhiÒu thñ tôc kh¸c) trong mét file riªng. B¹n dÞch file nµy ra d¹ng *.obj cã thÓ dïng ®­îc tõ bÊt kú ch­¬ng tr×nh nµo. C¸ch thøc gäi thñ tôc vµ liªn kÕt file *.obj sÏ h¬i kh¸c nhau trªn c¸c ng«n ng÷ kh¸c nhau. ThÝ dô trong C vµ C++, b¹n chØ cÇn khai b¸o ®Æc t¶ (prototype) cña thñ tôc cÇn gäi tr­íc khi gäi thñ tôc. Trong Pascal, b¹n ph¶i khai b¸o ®Æc t¶ thñ tôc cÇn gäi (dïng tõ khãa External ®i sau lÖnh Procedure hay Function) vµ ph¶i dïng macro ®Ó khai b¸o viÖc kÕt nèi file *.obj vµo ch­¬ng tr×nh ({$L tenfile.obj}).

Hái: Khi x©y dùng mét ch­¬ng tr×nh Pascal cã sö dông ®å häa, chän ra file .exe råi ®em sang m¸y kh¸c ch¹y th× ch­¬ng tr×nh ®ßi hái ph¶i cã c¸c file .BGI vµ TPU. Cã c¸ch nµo ®Ó chØ cÇn mét file *.exe lµ ®ñ hay kh«ng?

Tr¶ lêi: Th­êng khi dïng chÕ ®é ®å häa trong Pascal, tr­íc hÕt b¹n gäi thñ tôc InitGraph ®Ó khëi ®éng chÕ ®é ®å häa, thñ tôc nµy sÏ liªn kÕt ®éng file driver *.bgi t­¬ng øng vµo ch­¬ng tr×nh. Tuy nhiªn trong mét sè tr­êng hîp b¹n muèn liªn kÕt tÜnh file *.bgi vµo trong file ch­¬ng tr×nh cña b¹n (®Ó dÔ sao nã sang m¸y kh¸c,...), Borland cã hç trî vÊn ®Ò nµy b»ng c¸ch cung cÊp unit bgidriv.pas d¹ng source code Pascal trong th­ môc bp7\examples\ dos\bgi, tõ th­ môc nµy b¹n cã thÓ t¹o ra file bgidriv.tpu t­¬ng øng b»ng c¸ch nhËp lÖnh sau tõ DOS: make èfbgidriv. Sau ®ã chÐp file bgidriv.tpu vµo th­ môc units cña Pascal (bp7\units). Sau khi cã ®­îc file bgidriv.tpu, b¹n cã thÓ dïng nã trong ch­¬ng tr×nh b»ng lÖnh 'Use', vµ nh­ vËy khi dÞch ch­¬ng tr×nh, driver ®å häa cÇn dïng sÏ ®­îc liªn kÕt tÜnh vµo ch­¬ng tr×nh *.exe cña b¹n. Sau ®©y lµ c¸c lÖnh chÝnh yÕu trong ch­¬ng tr×nh ®å häa cña b¹n:

Program name;

Use graph, bgidriv, ...;

Var GraphDriver, GraphMode : Integer;

....

Begin { chuong trinh chinh }

{ Dang ky driver do hoa can dung }

if RegisterBGIdriver(@EgaVgaDriverProc) < 0 then begin

writeln(‘Khong the dang ky BGI driver’);

exit

end;

{ Khoi dong che do do hoa }

GraphDriver:=Detect;

initGraph (GraphDriver, GraphMode,’’);

....

END.

Hái: Xin PC World VN h­íng dÉn c¸ch lËp tr×nh trong Turbo Pascal vÒ mét sè h×nh häc chuyÓn ®éng trong kh«ng gian 3 chiÒu. T«i ®· cè thö lµm nhiÒu lÇn nh­ng kh«ng ®­îc.

Tr¶ lêi: §Ó lËp tr×nh c¸c h×nh 3D chuyÓn ®éng, b¹n cÇn trang bÞ nhiÒu kiÕn thøc chuyªn m«n vÒ lÜnh vùc ®å häa (c¸c s¸ch vÒ áComputer Graphicsâ). Trong khu«n khæ h¹n hÑp cña môc tr¶ lêi, chóng t«i kh«ng thÓ m« t¶ cô thÓ c¸c kiÕn thøc chuyªn m«n nµy. Ng«n ng÷ lËp tr×nh chØ lµ c«ng cô m« t¶ gi¶i thuËt cho m¸y tÝnh hiÓu, do ®ã kh«ng ®ãng vai trß quan träng trong viÖc viÕt ch­¬ng tr×nh. B¹n cã thÓ dïng Pascal, C, C++, Visual Basic hay bÊt kú ng«n ng÷ ®a dông nµo còng ®­îc.

Hái: HiÖn em ®ang lËp tr×nh Pascal 7.0. Em cã mét bé font bitmap VGA, muèn n¹p font nµy ra m¸y in ë chÕ ®é v¨n b¶n vµ ®å häa th× lµm c¸ch nµo (vÝ dô b»ng thñ tôc). Xin quý b¸o chØ c¸ch viÕt ch­¬ng tr×nh liªn kÕt mét ¶nh bitmap vµo ch­¬ng tr×nh nh­ c¸c logo cña D2, BKAV...

Tr¶ lêi: B¹n nªn l­u ý r»ng font bitmap cña mµn h×nh VGA kh«ng ph¶i lµ font cña c¸c m¸y in. Mçi lo¹i m¸y in qui ®Þnh riªng format font ch÷ cña m×nh, th­êng th× rÊt kh¸c nhau gi÷a m¸y in kim vµ m¸y in laser. VËy ®Ó download font ra m¸y in, tr­íc hÕt b¹n cÇn so¹n font ®óng format qui ®Þnh cña lo¹i m¸y in ®ã, råi dïng c¸c lÖnh ®iÒu khiÓn n¹p font ra m¸y in. B¹n còng cã thÓ in néi dung ®å häa cña mµn h×nh ®ang chøa v¨n b¶n tiÕng ViÖt ra m¸y in b»ng lÖnh in ®å häa, tuy nhiªn chÊt l­îng th­êng rÊt thÊp.

    B¹n nªn xem phÇn tr¶ lêi ë sè b¸o PC World VN th¸ng 09/97 (trang 129) ®Ó biÕt thªm th«ng tin vÒ viÖc download font ch÷ ra c¸c m¸y in kim Epson vµ HP laser. §Ó ch­¬ng tr×nh hiÓn thÞ ®­îc ®å häa mong muèn (tÜnh hay di ®éng), b¹n ph¶i viÕt code cô thÓ ®Ó ®iÒu khiÓn viÖc hiÓn thÞ nµy. Trong Borland C hay Pascal, 2 thñ tôc ®¬n gi¶n nhÊt ®Ó cÊt/ hiÓn thÞ l¹i mét vïng ®å häa h×nh ch÷ nhËt lµ GetImage vµ PutImage. PutImage cho phÐp b¹n hiÓn thÞ l¹i mét ®å häa h×nh ch÷ nhËt tõ cÊu tróc d÷ liÖu BGI. §Ó cã ®­îc cÊu tróc nµy, b¹n cã thÓ :

- Dïng thñ tôc GetImage ®Ó l­u ®å häa ®ang ®­îc hiÓn thÞ.

- Dïng ch­¬ng tr×nh chuyÓn ®æi format tõ d¹ng kh¸c (vÝ dô: *.bmp) sang d¹ng BGI cña Borland. NÕu m¸y cã nèi m¹ng Internet, b¹n h·y download mét ch­¬ng tr×nh chuyÓn format ®å häa vÒ d¹ng BGI ë ®Þa chØ ftp://ftp.simtel.net/ pub/simtelnet/ msdos/graphics /bmp2bgi1.zip

Hái: Em dïng Pascal 7.0 trong DOS. Trong Pascal cã ph¸t ra tiÕng nãi ®­îc kh«ng. VÝ dô khi ch­¬ng tr×nh bÞ lçi, sÏ cã giäng nãi ph¸t ra "Cã lçi råi". NÕu nh­ Pascal ph¸t ra tiÕng nãi ®­îc th× xin t¹p chÝ viÕt cho em mét ch­¬ng tr×nh cô thÓ hoÆc chØ cho em c¸c hµm thñ tôc lµm c«ng viÖc trªn.

Tr¶ lêi: BÊt cø ch­¬ng tr×nh ®­îc viÕt b»ng ng«n ng÷ nµo vµ trong m«i tr­êng nµo (DOS, Windows, OS/2, Unix,...) ®Òu cã thÓ ®iÒu khiÓn xuÊt ©m thanh ra sound card (hay loa néi bé cña m¸y PC). ViÖc xuÊt ©m thanh ra sound card rÊt dÔ dµng nÕu b¹n lËp tr×nh trong m«i tr­êng Windows v× m«i tr­êng Windows ®· hç trî multimedia, cßn nÕu b¹n lËp tr×nh trªn DOS, b¹n ph¶i viÕt module ®iÒu khiÓn xuÊt tÝn hiÖu ra sound card hay dïng l¹i module sound card cã s½n. B¹n cã thÓ gäi ch­¬ng tr×nh thi hµnh file *.wav tõ trong ch­¬ng tr×nh Pascal cña b¹n, hÇu hÕt c¸c sound card ®­îc b¸n ®Òu cã ®Üa mÒm kÌm theo, trªn ®Üa ®ã lu«n cã mét tr×nh 'play' c¸c file ©m thanh d¹ng *.wav. Gi¶ sö ch­¬ng tr×nh ch¬i nh¹c file *.wav cã có ph¸p sö dông lµ : 'play <tªn file wav cÇn ph¸t>, b¹n cã thÓ ph¸t ra th«ng b¸o ®­îc chøa trong file tbao.wav b»ng lÖnh Pascal sau:

Exec(‘play.exe’,’tbao.wav’);

Hái: C¸c ch­¬ng tr×nh trß ch¬i nh­: Tomb Raider, Doom... viÕt b»ng c¸c ch­¬ng tr×nh nµo, vµ xin cho biÕt chøc n¨ng cña tõng ch­¬ng tr×nh. NÕu trong phèi c¶nh kh«ng gian ba chiÒu t«i ®· vÏ, t«i cã thÓ can thiÖp b»ng keyboard ®Ó luån l¸ch trong ®ã ®­îc kh«ng?

Tr¶ lêi: C¸c trß ch¬i nh­ Tomb Raider, Doom, ... ®­îc viÕt b»ng ng«n ng÷ nµo kh«ng ph¶i lµ ®iÒu quan träng, ®iÒu quan träng lµ chóng ®­îc viÕt theo gi¶i thuËt nµo. VÒ nguyªn t¾c, nÕu b¹n ®· biÕt gi¶i thuËt cña mét øng dông, b¹n cã thÓ hiÖn thùc øng dông ®ã b»ng bÊt kú ng«n ng÷ lËp tr×nh nµo, nÕu cÇn ch¹y tèi ­u mét sè ®o¹n code nµo ®ã, b¹n cã thÓ viÕt c¸c ®o¹n code nµy b»ng ng«n ng÷ Assembly.

    NÕu ch­¬ng tr×nh cña b¹n ®· vÏ ®­îc lªn mµn h×nh phèi c¶nh kh«ng gian 3 chiÒu th× ch­¬ng tr×nh ®ã còng cã thÓ cho phÐp ng­êi dïng luån l¸ch trong phèi c¶nh ®ã (hay tæng qu¸t h¬n lµ xö lý phèi c¶nh) b»ng chuét vµ/hoÆc bµn phÝm.

    Tãm l¹i tuú thuéc chøc n¨ng cña ch­¬ng tr×nh mµ b¹n cã thÓ lµm ®­îc ®iÒu g×, nÕu ch­¬ng tr×nh do chÝnh b¹n thiÕt kÕ vµ hiÖn thùc th× b¹n hoµn toµn tù do trong viÖc qui ®Þnh chøc n¨ng cña nã.

    Trong tr­êng hîp b¹n dïng mét phÇn mÒm xö lý ®å häa nµo ®ã ®Ó vÏ phèi c¶nh th× viÖc luån l¸ch trong phèi c¶nh ®ã b»ng bµn phÝm cã ®­îc kh«ng lµ tïy thuéc vµo chÝnh tr×nh xö lý ®å häa mµ b¹n dïng.

Hái: HiÖn em ®ang lËp tr×nh b»ng ng«n ng÷ C, vµ em muèn cÊp ph¸t bé nhí ®Ó ch¹y ch­¬ng tr×nh víi kÝch th­íc > 1MB, hay nãi c¸ch kh¸c lµ em muèn sö dông bé nhí më réng. Nh­ng em kh«ng biÕt lµm c¸ch nµo ®Ó khai b¸o c¶. Em cã thÓ sö dông hµm farmalloc, nh­ng khi ch¹y biªn dÞch ch­¬ng tr×nh & ch¹y th× cø bÞ treo m¸y. Theo nh­ trong s¸ch ghi lµ sö dông hµm farmalloc th× truy cËp ®­îc bé nhí lín h¬n 64 KB, nh­ng em kh«ng biÕt tèi ®a cña nã lµ bao nhiªu? Xin t¹p chÝ tr¶ lêi b»ng mét vÝ dô minh häa cô thÓ.

Tr¶ lêi: Hµm th­ viÖn áfarmallocâ cña ng«n ng÷ C hay C++ cho phÐp b¹n xin cÊp ph¸t mét khèi nhí liªn tôc víi kÝch th­íc bÊt kú, tèi ®a b»ng sè bé nhí DOS cßn trèng. Dung l­îng bé nhí DOS qu¶n lý ®­îc lµ 640KB, do ®ã hµm farmalloc chØ cã thÓ ph©n phèi khèi nhí cã kÝch th­íc tèi ®a lµ 640KB, hµm nµy chØ dïng bé nhí qui ­íc cña DOS chø ch­a sö dông bé nhí më réng (extended memory). NÕu muèn dïng kh«ng gian trong bé nhí më réng (vèn cã kÝch th­íc rÊt lín trªn c¸c m¸y PC hiÖn nay), b¹n ph¶i gäi c¸c hµm chøc n¨ng cña tr×nh qu¶n lý bé nhí më réng HIMEM.SYS. Chi tiÕt cô thÓ vÒ c¸ch gäi c¸c hµm chøc n¨ng cña tr×nh qu¶n lý himem.sys ®­îc miªu t¶ trong bµi "Bé nhí më réng vµ c¸ch truy cËp bé nhí më réng b»ng Turbo Pascal" ë trang 72, PC World VN th¸ng 6/1997.

Hái: T«i viÕt mét ch­¬ng tr×nh qu¶n lý nh©n sù tiÒn l­¬ng b»ng Foxpro For DOS, ®Ó lµm ®Ñp, t«i dïng hîp ng÷ vÏ l¹i mét sè m· ký tù (ASCII). Nh­ng khi ch¹y l¹i ch­¬ng tr×nh t«i gäi VRD.EXE cña VietRes ®Ó nhËp tiÕng ViÖt th× nh÷ng ký tù cña t«i vÏ l¹i ®· bÞ VietRes biÕn ®æi (mÆc dï trong ch­¬ng tr×nh hîp ng÷ cña t«i ®· chän nh÷ng ký tù mµ VietRes kh«ng t¸c ®éng ®Õn).

    VËy xin quý b¸o chØ giïm lµm c¸ch nµo võa cã thÓ sö dông VRD.EXE ®Ó nhËp liÖu b»ng tiÕng ViÖt võa cã thÓ vÏ l¹i mét sè ký tù trong b¶ng m· ASCII theo ý muèn.

Tr¶ lêi: Mçi khi VietRes ch¹y (vrd.exe), nã sÏ chiÕm quyÒn ®iÒu khiÓn Int 10h vµ hiÖu chØnh l¹i toµn bé font hÖ thèng (256 ký tù), nÕu b¹n thay ®æi font tr­íc khi ch¹y VietRes, sù thay ®æi cña b¹n sÏ bÞ VietRes ph¸ mÊt. VËy b¹n ph¶i thay ®æi font sau khi ®· ch¹y VietRes, tuy nhiªn VietRes kh«ng thi hµnh c¸c chøc n¨ng liªn quan ®Õn viÖc hiÖu chØnh l¹i font ch÷ (®Ó b¶o vÖ b¶ng font cña VietRes). NÕu muèn gäi Int 10h ®Ó thiÕt lËp mét sè ký tù riªng cña m×nh sau khi ®· ch¹y VietRes, b¹n ph¶i biÕt ®­îc ®Þa chØ tr×nh phôc vô ng¾t Int 10h cña hÖ thèng vµ gäi ®óng tr×nh phôc vô nµy. Tr×nh tù c¸c thao t¸c nh­ sau :

- Ghi l¹i vector ng¾t Int 10h cña hÖ thèng vµo mét biÕn pointer cña ch­¬ng tr×nh.

- Ch¹y tr×nh VietRes.

- Ghi l¹i vector ng¾t Int 10h (cña VietRes) vµo mét biÕn pointer kh¸c cña ch­¬ng tr×nh.

- ThiÕt lËp l¹i vector ng¾t Int 10h cò cña hÖ thèng.

- Gäi Int 10h (cò cña hÖ thèng) ®Ó thiÕt lËp mét sè mÉu ký tù ®Æc biÖt cña riªng m×nh (dïng chøc n¨ng ah=1100h).

- ThiÕt lËp l¹i vector ng¾t Int 10h cña VietRes.

- TiÕp tôc ch­¬ng tr×nh cña m×nh, lóc nµy VietRes tiÕp tôc ch¹y nh­ng trong b¶ng m· cña nã cã mét sè ký tù ®­îc hiÓn thÞ theo mÉu cña b¹n.

- Khi kÕt thóc ch­¬ng tr×nh, b¹n nªn gì VietRes ra khái hÖ thèng nÕu kh«ng muèn dïng nã n÷a.

    Trong khung d­íi ®©y lµ mét tr×nh Pascal nhá miªu t¶ qui tr×nh dïng VietRes råi hiÖu chØnh mét vµi ký tù theo ý riªng.

Hái: Em muèn viÕt mét ch­¬ng tr×nh dïng ®Ó xem c¸c h×nh ¶nh *.bmp hay *.pic b»ng Pascal th× ph¶i viÕt nh­ thÕ nµo?

Tr¶ lêi: B¹n cÇn n¾m v÷ng format file ¶nh *.bmp vµ *.pic th× míi cã thÓ viÕt ®­îc ch­¬ng tr×nh hiÓn thÞ c¸c file ¶nh nµy. Sau khi n¾m v÷ng format file ¶nh, b¹n cã thÓ dïng bÊt kú ng«n ng÷ nµo ®Ó viÕt ch­¬ng tr×nh. Mét c¸ch kh¸c, ®¬n gi¶n h¬n, ®Ó hiÓn thÞ c¸c h×nh ¶nh bitmap d¹ng *.bmp hay *.pic lµ dïng tr×nh chuyÓn format ¶nh vÒ d¹ng BGI cña Borland ®Ó nhê thñ tôc PutImage hiÓn thÞ ¶nh ®ã lªn mµn h×nh.

    Víi c¸ch nµy b¹n kh«ng cÇn nghiªn cøu mét format ¶nh nµo hÕt. NÕu m¸y cã nèi m¹ng Internet, b¹n h·y download ch­¬ng tr×nh chuyÓn format ®å häa vÒ d¹ng BGI ë ®Þa chØ ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/bmp2bgi1.zip

Hái: Trong th­ môc Windows, cã mét file ë thuéc tÝnh Èn (hidden) tªn lµ "ttfcache". Xin hái ®ã cã ph¶i lµ file chøa font ®· cµi cho Win kh«ng? Lµm c¸ch nµo dïng mét hµm (function) ®Ó cµi font trong Visual Basic? Hµm ®ã tªn g×? C¸ch sö dông?

Tr¶ lêi: Chóng t«i ch­a râ c«ng dông cña file áttfcacheâ trong th­ môc Windows v× kh«ng ph¶i m¸y nµo còng cã, nh­ng víi tªn vµ néi dung cña nã, ch¾c ch¾n nã chøa th«ng tin vÒ font TrueType, nã ®­îc t¹o vµ¹ sö dông bëi mét ch­¬ng tr×nh nµo ®ã nh­ng kh«ng ph¶i Windows (chóng t«i thö xãa råi khëi ®éng l¹i Windows, sö dông nhiÒu ngµy vÉn kh«ng thÊy t¹o l¹i).

    Trong ch­¬ng tr×nh bÊt kú ®­îc viÕt b»ng ng«n ng÷ nµo, b¹n còng cã thÓ thªm font ch÷ míi (TrueType hay bitmap) vµo Windows theo kiÓu on-the-fly b»ng c¸ch gäi thñ tôc áAddFontResourceâ.

    §©y lµ mét hµm cña Windows, ®Ó gäi ®­îc trong ch­¬ng tr×nh Visual Basic, b¹n ph¶i khai b¸o nã nh­ sau:

Declare Function AddFontResourceA Lib "GDI32" (path As String) As Integer

Lóc nµo cÇn thªm font, b¹n cã thÓ gäi nã, vÝ dô nh­:¸

ketqua = AddFontResourceA ("c:\psfonts\gvgafix.fon")

§èi sè duy nhÊt cña hµm AddFontResourceA lµ ®­êng dÉn m« t¶ file font resource (d¹ng *.fon hay *.fot).¸

Hái: Lµm c¸ch nµo ®Ó biÕt ®­îc mét macro ®ang ch¹y mang tªn g×. VÝ dô mét macro tªn "Word" ®­îc kÝch ho¹t th× b¶n th©n ch­¬ng tr×nh dïng c¸ch g× ®Ó cã thÓ nhËn ®­îc chuçi "Word" tøc lµ tªn cña nã. Tªn macro nµy th­êng xuyªn thay ®æi nªn nã ph¶i tù biÕt ®­îc hiÖn t¹i nã ®ang mang tªn g×. PC World cã thÓ viÕt dïm em ®o¹n ch­¬ng tr×nh tù t×m tªn nµy ®­îc kh«ng?

Tr¶ lêi: VÒ nguyªn t¾c, ®óng lµ cã thÓ viÕt ®­îc mét macro cã kh¶ n¨ng thi hµnh nhiÒu t¸c vô tïy theo tªn gäi. VÝ dô cã 2 macro: macro 1 thi hµnh t¸c vô 1, macro 2 thi hµnh t¸c vô 2. B©y giê ta söa macro 1, macro 2 thµnh mét macro duy nhÊt cã thÓ thi hµnh ®­îc c¶ 2 t¸c vô, nÕu tªn nã lµ macro 1 nã sÏ lu«n thi hµnh t¸c vô 1, cho tíi khi ®æi tªn nã thµnh macro 2 th× nã sÏ thi hµnh t¸c vô 2.

    Trong Word 97, macro lµ mét thñ tôc ®­îc viÕt b»ng ng«n ng÷ VBA (Visual Basic Application). Trong c¸c ng«n ng÷ lËp tr×nh cæ ®iÓn nh­ C, Pascal,... ng­êi ta chØ cung cÊp ph­¬ng tiÖn x¸c ®Þnh tªn ch­¬ng tr×nh ®ang ch¹y (tªn file ch­¬ng tr×nh) chø kh«ng cung cÊp ph­¬ng tiÖn x¸c ®Þnh tªn mét thñ tôc ®ang ch¹y.

    Cã thÓ ng«n ng÷ VBA còng cã cïng kh¶ n¨ng nµy, nghÜa lµ trong c¸c lÖnh cña mét thñ tôc nµo ®ã ng­êi ta kh«ng thÓ biÕt tªn cña thñ tôc ®ang ch¹y. §iÒu nµy kh«ng g©y phiÒn hµ cho ng­êi lËp tr×nh. Theo kinh nghiÖm, chóng t«i ch­a thÊy nhu cÇu nµo dÉn ®Õn viÖc thay ®æi tªn macro th­êng xuyªn trong qu¸ tr×nh ch¹y, h¬n n÷a, nÕu ng­êi dïng macro cña b¹n kh«ng ph¶i lµ b¹n th× lµm sao hä cã thÓ hiÖu chØnh m· nguån ®Ó ®æi tªn c¸c macro? Thay v× viÕt 1 macro cã kh¶ n¨ng thùc hiÖn 2 chøc n¨ng kh¸c nhau tïy theo tªn, b¹n nªn viÕt riªng tõng macro, phÇn viÖc chung ®­îc dïng bëi 2 macro sÏ ®­îc ®Ó trong mét hay nhiÒu thñ tôc kh¸c, code trong macro chØ gäi c¸c thñ tôc nµy ®Ó gi¶i quyÕt vÊn ®Ò riªng cña m×nh, nh­ vËy ch­¬ng tr×nh sÏ trong s¸ng h¬n nhiÒu so víi c¸ch mµ b¹n muèn viÕt.

    Trong tr­êng hîp b¹n ®· viÕt lì macro ®ã råi vµ kh«ng muèn söa l¹i nhiÒu th× c¸ch gi¶i quyÕt nh­ sau: viÕt thªm 2 macro, mçi macro chØ cã mét lÖnh gäi ®Õn thñ tôc cña b¹n, trong lÖnh gäi cã truyÒn tªn cña macro gäi. Code cô thÓ nh­ sau:

‘Code cua macro thi hanh cong viec 1
Sub macro1()
macro_chung("macro1")
End Sub
‘ Code cua macro thi hanh cong viec 2
Sub macro2()
macro_chung("macro2")
End Sub
‘ Code cua macro ma ban da viet
Sub macro_chung(macroname As String)
if macroname = "macro1" then
‘ Doan code thi hanh cong viec 1
Elseif macroname = "macro2" then
‘ Doan code thi hanh cong viec 2
Endif
End Sub

Hái: Bé dÞch C++ 32 bit cò nhÊt, gän nhÑ nhÊt lµ bé nµo?

Tr¶ lêi: Cã thÓ ®ã lµ tr×nh biªn dÞch Borland C++, version 3.0. Borland rÊt næi tiÕng vÒ tÝnh gän nhÑ hiÖu qu¶ cña c¸c tr×nh biªn dÞch cña hä. Tuy nhiªn, hiÖn nay bé áVisual Studio 6.0â cña Microsoft ®· cung cÊp mét m«i tr­êng lËp tr×nh rÊt m¹nh vµ æn ®Þnh trªn Windows 32-bit.

Hái: Cã thÓ in kÕt qu¶ cña mét ch­¬ng tr×nh viÕt b»ng ng«n ng÷ Pascal, C, C++ tõ mµn h×nh ra giÊy ®­îc kh«ng? Lµm b»ng c¸ch nµo?

Tr¶ lêi: §­îc, tïy theo m«i tr­êng thi hµnh ch­¬ng tr×nh vµ cã source code ch­¬ng tr×nh kh«ng? NÕu cã source code cña ch­¬ng tr×nh, b¹n sÏ thªm vµo nh÷ng lÖnh cÇn thiÕt ®Ó sau khi hiÓn thÞ ra mµn h×nh, b¹n xuÊt kÕt qu¶ ra m¸y in.

NÕu kh«ng cã source code, b¹n cã thÓ dïng kü thuËt áscreen captureâ ®Ó sao l¹i kÕt qu¶ ®ang hiÓn thÞ trªn mµn h×nh, cÊt nã vµo mét file nµo ®ã (thÝ dô file cña Paint, cña Word,...) råi in nã ra m¸y in sau ®ã. §a sè c¸c tr×nh screen capture trªn nÒn MS-DOS vµ Windows ®Òu cã kh¶ n¨ng in trùc tiÕp ra m¸y in néi dung mµn h×nh võa bÞ capture.

Hái: Em thö thay thñ tôc WritePixel trong ch­¬ng tr×nh PC BMP (PCW th¸ng 5/1995) b»ng thñ tôc Putpixel cña Unit Graph th× thÊy tèc ®é ®äc ¶nh t¨ng lªn râ rÖt. VËy cã ph¶i thñ tôc Putpixel kh«ng ghi ¶nh b»ng c¸ch thùc hiÖn ng¾t kh«ng? NÕu ®óng nh­ vËy th× thñ tôc nµy ghi ®iÓm ¶nh b»ng c¸ch nµo?

Tr¶ lêi: Trong qu¸ tr×nh lËp tr×nh, chóng ta sÏ gäi rÊt nhiÒu thñ tôc trong nhiÒu th­ viÖn kh¸c nhau. §Ó gäi ®­îc thñ tôc trong mét th­ viÖn nµo ®ã, ta chØ cÇn biÕt ®Æc t¶ (prototype) cña thñ tôc ®ã, bao gåm tªn thñ tôc, sè l­îng ®èi sè, kiÓu cña tõng ®èi sè vµ chøc n¨ng cña thñ tôc ®ã. Ng­êi gäi thñ tôc kh«ng cÇn biÕt chi tiÕt gi¶i thuËt cô thÓ bªn trong thñ tôc ®ã. Thñ tôc Putpixel trong th­ viÖn ®å häa cña Borland ®­îc hiÖn thùc bëi h·ng Borland, chóng ta khã lßng biÕt chi tiÕt bªn trong thñ tôc, nh­ng nh­ trªn ®· nãi, ®iÒu ®ã kh«ng ¶nh h­ëng g× ®Õn viÖc sö dông nã.

Hái: - Trong Pascal 7.0, khi em dïng ®Õn unit CRT th× ch­¬ng tr×nh kh«ng ch¹y ®­îc mÆc dï m¸y b¸o lµ kh«ng cã lçi (khi dÞch). Lóc ®ã hiÖn lªn dßng: "Division by zero" vµ b¾t buéc em ph¶i chän OK (mÆc dï trong ch­¬ng tr×nh em kh«ng hÒ dïng ®Õn c¸c biÓu thøc tÝnh to¸n).

- Khi ch¹y Turbo Pascal 7.0 ®Ó dÞch vµ ch¹y file cã néi dung:

uses crt;

Begin

Writeln;

End

th× bÞ b¸o lçi khi ch¹y ch­¬ng tr×nh lµ lçi sau:

Error 200: runtime at xxxx : 0091

Error 200: Division by zero

    Cßn khi dÞch vÉn b×nh th­êng. §em ®Üa chøa Turbo Pascal 7.0 ®ã ch¹y trªn c¸c m¸y kh¸c vÉn b×nh th­êng. M¸y em cã cÊu h×nh Pentium II 266 MHz, Ram 32MB, ch¹y b×nh th­êng Turbo Pascal 5.5. Víi 7.0 nÕu bá dßng lÖnh uses crt hoÆc thay c¸c unit kh¸c vµ kh«ng dïng c¸c hµm cña unit crt th× ch¹y b×nh th­êng.

Tr¶ lêi: §©y lµ lçi cña Turbo Pascal 7.0: kh«ng t­¬ng thÝch víi CPU Pentium II. B¹n xem bµi: "Kh¾c phôc lçi "Runtime Error 200" trong TP 7 trªn m¸y PC tèc ®é cao" trang 85 trong sè b¸o nµy.

Hái: Lµm thÕ nµo ®Ó ®­a mét biÓu t­îng vµo cöa sæ "system tray"? Xin cho vÝ dô nhá (dïng VBasic 4-43).

Tr¶ lêi: §Ó thªm mét biÓu t­îng ch­¬ng tr×nh vµo cöa sæ áSystem Trayâ cña Windows 9x hay Win NT, b¹n ph¶i gäi hµm API cña Windows Shell_NotifyIcon (®­îc chøa trªn file th­ viÖn shell32.dll). Qui tr×nh sö dông hµm nµy tõ Visual Basic ®Ó thªm mét biÓu t­îng vµo áSystem Trayâ kh¸ dµi nªn kh«ng tiÖn miªu t¶ ë ®©y. Muèn biÕt th«ng tin chi tiÕt vµ cô thÓ vÒ vÊn ®Ò nµy, b¹n cã thÓ ®äc bµi "HOW TO: Use the System Tray Directly from Visual Basic 5.0" trong ®Üa MSDN sè 2 cña bé ®Üa Visual Studio 6.0. NÕu b¹n quan t©m vÒ lËp tr×nh trong m«i tr­êng Windows 32-bit b»ng c¸c ng«n ng÷ cña Microsoft (Visual Basic, C++, J++, Visual FoxProµ), b¹n nªn t×m mua hai ®Üa MSDN nµy.

Hái: Lµm sao ®Ó ng¨n cho ch­¬ng tr×nh trong Windows ch¹y hai lÇn trong Visual Basic? Em ®ang lµm mét ch­¬ng tr×nh cµi font "System Tray" lµ n¬i cã biÓu t­îng loa, m¸y in ...

Tr¶ lêi: Mét ch­¬ng tr×nh Visual Basic bao gåm nhiÒu form, trong ®ã cã mét form chÝnh m« t¶ ch­¬ng tr×nh, ch­¬ng tr×nh b¾t ®Çu ch¹y tõ thñ tôc Form_Load() cña form nµy. NÕu b¹n muèn ch­¬ng tr×nh chØ ®­îc phÐp ch¹y mét b¶n (instance), b¹n cã thÓ kiÓm tra thuéc tÝnh PrevInstance cña ®èi t­îng App m« t¶ ch­¬ng tr×nh, nÕu kh¸c kh«ng th× ch­¬ng tr×nh ®· ch¹y Ýt nhÊt mét b¶n, trong tr­êng hîp nµy b¹n dõng ch­¬ng tr×nh. §o¹n lÖnh cô thÓ nh­ sau:

Private Sub Form_Load()
If App.PrevInstance Then
Unload Me ‘§ãng form miªu t¶ cöa sæ ch­¬ng tr×nh
End ‘ Dõng ch­¬ng tr×nh
End If
C¸c lÖnh khëi ®éng th«ng sè cho ch­¬ng tr×nh
End Sub

Hái: Cã thÓ t¹o mét macro trong Microsoft Word hay mét ch­¬ng tr×nh trong Visual Basic ®Ó lÊy sè serial cña ®Üa mÒm (A:, B:) hay kh«ng? Xin t¹p chÝ viÕt mét macro hay ®o¹n ch­¬ng tr×nh nh­ yªu cÇu. (Em thÊy trong phiªn b¶n lµm viÖc víi Word nÕu më file tõ mét ®Üa mÒm nµo ®Êy nh­ng ch­a ®ãng l¹i, sau ®ã rót ®Üa mÒm Êy ra ®Ó ®­a ®Üa kh¸c vµo th× khi thao t¸c trªn tËp tin ®· më th× Word sÏ b¸o lçi vµ yªu cÇu ta ®ót ®Üa mÒm cã sè serial... vµo, lµm thÕ nµo Word biÕt sè Serial cña ®Üa ®· ®­a vµo æ ?).

Tr¶ lêi: B¹n cã thÓ gäi hµm GetVolumeInformationA trong th­ viÖn cña Windows ®Ó lÊy nhiÒu th«ng tin liªn quan ®Õn mét ®Üa mÒm (hay ®Üa cøng) nµo ®ã, trong ®ã cã sè serial cña nã. V× ®©y lµ mét hµm cña Windows nªn b¹n ph¶i khai b¸o tr­íc khi dïng trong Visual Basic. Sau ®©y lµ mét macro ®¬n gi¶n ®­îc viÕt b»ng Visual Basic ®Ó hiÓn thÞ sè serial cña ®Üa mÒm ®ang ë æ a:

‘Khai bao ham GetVolumeInformationA
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" _
(ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, _
ByVal nVolumeNameSize As Long, _
ByRef lpVolumeSerialNumber As Any, _
ByRef lpMaximumComponentLength As Any, _
ByRef lpFileSystemFlags As Any, _
ByVal lpFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Boolean
‘ Thu tuc mo ta macro can viet
Sub ReadSerieNumber()
Dim Path As String
Dim volname As String
Dim fsn As String
Dim volserial As Long
Dim mcl As Long
Dim flag As Long
Path = "a:\"
kq = GetVolumeInformation(Path, volname, 128, volserial, mcl, _
flag, fsn, 256)
MsgBox ("Serial number cua dia mem tren o A: la " + Hex(volserial))
End Sub

Hái: T«i muèn PCW cung cÊp th«ng tin vÒ:

- Header cña c¸c file *.exe vµ ch­¬ng tr×nh dïng kü thuËt overlay.

- C¸ch x¸c ®Þnh vÞ trÝ, kÝch th­íc cña module ®­îc n¹p ®èi víi nh÷ng ch­¬ng tr×nh thuéc lo¹i nµy.

- Tªn nh÷ng tµi liÖu cã c¸c th«ng tin trªn.

Tr¶ lêi: File overlay lµ tr­êng hîp ®Æc biÖt cña file *.exe. Header cña file *.exe trªn MS-DOS lµ mét record gåm nhiÒu vïng nh»m cung cÊp th«ng tin ®Çy ®ñ vÒ file *.exe. CÊu tróc cô thÓ cña file *.exe ®­îc tr×nh bµy trong b¶ng (phÇn ®Çu lµ header, phÇn sau lµ néi dung cßn l¹i cña file *.exe).

    Microsoft ®· níi réng header trªn ®Ó miªu t¶ c¸c file *.exe vµ *.dll ch¹y trong m«i tr­êng Windows. NÕu muèn biÕt thªm th«ng tin trong phÇn níi réng nµy, b¹n cã thÓ ®äc bµi "Executable-File Format" trong ®Üa MSDN 2 cña bé Visual Studio 6.0.

Hái: Khi cµi Borland C (BC) 4.5 nöa chõng m¸y b¸o: "Need 386 or better to expand file: scrptsrc.pak". §ã lµ th«ng b¸o g×, vµ cÇn ph¶i lµm g×? HiÖn t«i ®ang ch¹y BC 3.0 vµ bé BC 4.5 cµi nöa chõng. Khi viÕt ch­¬ng tr×nh vµ biªn dÞch th× cã th«ng b¸o:

can't open include <io.h>
include <stdio.h>

VËy ®ã lµ c¸c vÊn ®Ò g×, cã ph¶i do bé BC bÞ thiÕu g©y ra?

Tr¶ lêi: CÊu h×nh tèi thiÓu ®Ó cµi vµ sö dông tr×nh biªn dÞch BC 4.5 lµ m¸y 386, 4MB RAM trë lªn. VËy b¹n h·y kiÓm tra l¹i m¸y m×nh xem cã tháa m·n cÊu h×nh tèi thiÓu kh«ng. NÕu m¸y b¹n lµ 386 hay cao h¬n mµ BC 4.5 b¸o lçi nh­ b¹n miªu t¶ th× ®ã lµ chuyÖn bÊt th­êng, ®a sè tr­êng hîp lµ do virus g©y ra. NÕu BC 4.5 cµi ch­a thµnh c«ng th× viÖc sö dông nã bÞ lçi lµ chuyÖn b×nh th­êng v× c¸c th«ng sè cÊu h×nh cho ch­¬ng tr×nh ch­a ®­îc thiÕt lËp ®óng (c¸c th«ng b¸o lçi t×m kh«ng ®­îc c¸c file include cña BC 4.5 nh­ io.h, stdio.h,... lµ mét thÝ dô cô thÓ). Tãm l¹i nÕu m¸y b¹n lµ 386, 4MB Ram hay cao h¬n, b¹n h·y thùc hiÖn tr×nh tù sau ®©y:

- Khëi ®éng l¹i m¸y tõ ®Üa mÒm s¹ch, diÖt virus b»ng c¸c tr×nh diÖt míi nhÊt (D2, BKAV...).
- T¹o cÊu h×nh khëi ®éng ®¬n gi¶n nhÊt b»ng c¸ch hiÖu chØnh l¹i hai file Config.sys vµ Autoexec.bat.
- KiÓm tra l¹i b¶n gèc BC 4.5 nhÊt lµ khi dïng ®Üa mÒm, råi cµi l¹i BC 4.5.

Hái: T«i ®ang sö dông Windows 98. Xin hái lµm c¸ch nµo ®Ó chuyÓn mét ch­¬ng tr×nh viÕt b»ng Pascal sang tËp tin thùc thi .Exe cã thÓ ch¹y trong Windows, Dos (sö dông Turbo Pascal 7.0). Vµ lµm c¸ch nµo ®Ó cã thÓ cµi ®Æt Turbo Pascal (TP) vµo Windows ®Ó khi ch¹y kh«ng cßn dßng th«ng b¸o "Do you want to continue?"

Tr¶ lêi: §Ó cµi ®Æt TP 7.0 vµo m¸y ch¹y Windows 98, tèt nhÊt lµ b¹n tho¸t ra DOS (hay khëi ®éng ë chÕ ®é áCommand Prompt Onlyâ). TP 7.0 cã c¶ hai m«i tr­êng lËp tr×nh: trªn DOS vµ trªn Windows; nã cho phÐp b¹n t¹o ch­¬ng tr×nh ch¹y ë mét trong nhiÒu chÕ ®é kh¸c nhau, trong ®ã hai chÕ ®é chÝnh lµ DOS vµ Windows.

    Cã nhiÒu c¸ch kh¸c nhau ®Ó dÞch ch­¬ng tr×nh nguån ra tËp tin *.exe ch¹y trªn m«i tr­êng DOS, hai c¸ch th«ng th­êng lµ:

- Tõ dÊu nh¾c DOS, b¹n ch¹y tr×nh turbo.exe ®Ó lµm viÖc víi m«i tr­êng lËp tr×nh trªn DOS cña Pascal. Sau khi b¹n ®· më ch­¬ng tr×nh nguån (thÝ dô Myprog.pas), b¹n chän menu Compile, råi chän môc áDestination Memoryâ ®Ó chuyÓn môc nµy thµnh áDestination Diskâ. Sau ®ã b¹n chän menu Compile/Make ®Ó t¹o file Myprog.exe. TËp tin *.exe t¹o ra sÏ ®­îc l­u ë cïng th­ môc chøa ch­¬ng tr×nh nguån nÕu b¹n kh«ng ®Þnh nghÜa t­êng minh th­ môc chøa nã trong menu Options/Directories/EXE Directory.

- Dïng ch­¬ng tr×nh dÞch hµng lÖnh bpc.exe ®Ó t¹o tËp tin *.exe nh­ sau : &laquo;bpc -CD Myprog.pas&raquo;. §Ó biÕt chi tiÕt vÒ c¸c tham sè cña tr×nh bpc.exe, b¹n nhËp lÖnh bpc råi nhÊn Enter, ch­¬ng tr×nh sÏ hiÓn thÞ c¸c tham sè mµ nã hç trî.

    T­¬ng tù, ®Ó t¹o ra tËp tin *.exe ch¹y trong Windows, b¹n còng cã thÓ dïng nhiÒu c¸ch kh¸c nhau, trong ®ã hai c¸ch th«ng th­êng lµ:

- Ch¹y tr×nh BPW.exe ®Ó lµm viÖc víi m«i tr­êng lËp tr×nh cña Pascal trªn Windows. Sau khi më tËp tin nguån (thÝ dô Myprog.pas), b¹n chän menu Compile ®Ó xem môc áTarget..â cã ph¶i lµ áWindowsâ kh«ng (chÕ ®é default), nÕu kh«ng, chän môc áTargetâ ®Ó thay ®æi thµnh áWindowsâ. Sau ®ã b¹n chän menu Compile/Make ®Ó t¹o tËp tin Myprog.exe. TËp tin *.exe ®­îc t¹o ra sÏ l­u ë cïng th­ môc chøa tËp tin nguån nÕu b¹n kh«ng ®Þnh nghÜa t­êng minh th­ môc chøa nã trong menu Options/Directories/EXE Directory.

- Tõ dÊu nh¾c DOS, b¹n dïng ch­¬ng tr×nh dÞch hµng lÖnh Bpc.exe ®Ó t¹o tËp tin *.exe nh­ sau:

bpc -CW myprog.pas

    §Ó biÕt chi tiÕt vÒ c¸c tham sè cña tr×nh Bpc.exe, b¹n nhËp lÖnh bpc råi Enter, ch­¬ng tr×nh sÏ hiÓn thÞ c¸c tham sè mµ nã hç trî.

    L­u ý r»ng ®Ó t¹o mét ch­¬ng tr×nh ch¹y ®­îc trªn Windows, b¹n cÇn ph¶i viÕt ch­¬ng tr×nh theo c¸c qui ®Þnh cña Windows. §Ó lµm quen víi cÊu tróc ch­¬ng tr×nh trªn Windows, b¹n cã thÓ ®äc c¸c ch­¬ng tr×nh mÉu cña TP 7.0

Hái: Em cã mét bµi to¸n gi¶i b»ng Pascal

Tr¨m bß tr¨m cá
Tr©u ®øng ¨n n¨m
Tr©u n»m ¨n ba
Tr©u giµ ba con ¨n mét
T×m sè tr©u mçi lo¹i
(§©y lµ b¶n gèc cña ®Ò, nh­ng thÇy cho lµ "Tr©u giµ ¨n mét")

Em ®· dïng Pascal, cÊu tróc vßng lÆp FOR ®Ó gi¶i nh­ng kh«ng ®­îc. Bµi cña em nh­ sau:

Var a, b, c: integer;
Begin
for a:= 1 to 20 do
for b: = 0 to 35 do
for c: = 0 to 99 do
if (5*a + 3*b + c/3 = 100) and (a+b+c = 100) then writeln (a,b,c);
end.

NÕu viÕt ch­¬ng tr×nh theo ®Ò cña thÇy th× söa dßng if l¹i

If (5*a + 3*b + c= 100) and (a+b+c = 100) then

Em ®· thö nh­ng ch­¬ng tr×nh ch¹y sai. Em dïng While... do, vÉn vËy. Khi em bá ®i ®o¹n "and (a+b+c = 100)" th× ch­¬ng tr×nh ch¹y ®óng nh­ng nã kh«ng nh­ ®Ò bµi n÷a.

Xin tßa so¹n gióp em gi¶i bµi to¸n nµy.

Tr¶ lêi: NÕu bµi to¸n cña b¹n ®­îc ph¸t biÓu râ rµng nh­ sau: "cã 100 con tr©u ¨n 100 bã cá, trong ®ã cã 3 lo¹i tr©u : tr©u ®øng mét con ¨n 5 bã, tr©u n»m mét con ¨n 3 bã, tr©u giµ 3 con ¨n 1 bã. H·y t×m tÊt c¶ c¸c tæ hîp vÒ sè tr©u cña mçi lo¹i tho¶ m·n bµi to¸n" th× ch­¬ng tr×nh Pascal gi¶i bµi to¸n nµy sÏ ®­îc viÕt ®¬n gi¶n nh­ sau:

Program timsotrau;
Var std, stn, stg : Integer;
Begin writeln(‘Cac kha nang co the co la :’);
for std := 0 to 20 do { toi da co 100/5=20 trau dung }
for stn := 0 to 33 do { toi da co 100/3=33 trau nam }
for stg := 0 to 100 do { toi da co 100 trau gia }
if (std*5+stn*3+ stg div 3 = 100) and
(std+stn+stg=100) and (stg mod 3 = 0) then
writeln(‘std=’,std,’ stn=’,stn,’ stg=’,stg);
readln;
end.

    Sau khi dÞch vµ ch¹y ch­¬ng tr×nh ta cã kÕt qu¶ hiÖn lªn mµn h×nh nh­ sau:

Cac kha nang co the co la:
std=0 stn=25 stg=75
std=4 stn=18 stg=78
std=8 stn=11 stg=81
std=12 stn=4 stg=84

    B¹n cã thÓ kiÓm chøng l¹i tõng kh¶ n¨ng. L­u ý lµ ch­¬ng tr×nh trªn ch­a ®­îc tèi ­u vÒ mÆt thêi gian thi hµnh, nh­ng trªn c¸c m¸y tÝnh hiÖn nay th× ch­¬ng tr×nh trªn ch¹y hÇu nh­ tøc thêi nªn cã lÏ còng kh«ng cÇn tèi ­u nã lµm g×.

Hái: Em cã viÕt mét ®o¹n ch­¬ng tr×nh nh­ sau:

Var: I: Integer;
a,b,:Real;
St: String;
f:Text;
Gd,Gm:Integer;
Begin
Gd:=Detect;
Ini Graph(Gd,Gm.’C:\Tp\Bgi’);
If GraphResult <> grOK then
Halt(1);
...
a:=Port[$3F8];
Str(a:10:2,st);
outtextxy(10,10,st);
...
closegraph;
End.

    Ch­¬ng tr×nh nµy ch¹y nh­ng kh«ng thÓ ®iÒu khiÓn nh­ ý muèn ®­îc, kh«ng thÓ ®äc liªn tôc biÕn 'a' vµo tõ cæng COM, chuçi 'St' khi in ra nÕu cã tõ 2 lÇn in th× bÞ ®Ì lªn nhau (hai gi¸ trÞ kh¸c nhau) trong m«i tr­êng ®å häa. Xin ®­îc chØ dÉn.

Tr¶ lêi: B¹n cã thÓ ®äc/ghi mét « nhí theo nhÞp ®iÖu cña b¹n, nh­ng b¹n ph¶i nhËp/xuÊt mét thanh ghi cña card giao tiÕp I/O theo ®Æc ®iÓm vµ tr¹ng th¸i cña card I/O ®ã. Th­êng card I/O cã c¸c lo¹i thanh ghi sau: thanh ghi tr¹ng th¸i, thanh ghi lÖnh, thanh ghi d÷ liÖu xuÊt vµ thanh ghi d÷ liÖu nhËp. SÏ kh«ng cã nghÜa khi b¹n ghi néi dung ra thanh ghi tr¹ng th¸i hay thanh ghi nhËp d÷ liÖu. T­¬ng tù, viÖc ®äc néi dung thanh ghi lÖnh hay thanh ghi xuÊt d÷ liÖu lµ kh«ng cã nghÜa. ViÖc ®äc néi dung cña thanh ghi nhËp liÖu chØ cã nghÜa (vµ cÇn thiÕt) sau khi d÷ liÖu ®­îc göi tõ thiÕt bÞ I/O ®Õn thanh ghi nhËp liÖu cña card giao tiÕp t­¬ng øng. ThÝ dô chØ khi ng­êi dïng Ên mét phÝm, m· scan cña phÝm Êy míi ®­îc göi vÒ m¸y tÝnh vµ ®­îc ®­a vµo thanh ghi nhËp liÖu keyboard ë port 60h. Lóc nµy (nhê tÝn hiÖu ng¾t qu¶ng th«ng b¸o) b¹n míi nªn ®äc néi dung cña thanh ghi nµy ®Ó biÕt ®­îc m· phÝm võa nhÊn. Sau ®ã b¹n ph¶i xuÊt ra thanh ghi ®iÒu khiÓn ë port 61h ®Ó t¹o tÝn hiÖu ph¶n håi (acknowledgement) vÒ cho keyboard ®Ó nã cã thÓ gëi tiÕp m· scan kh¸c khi cã phÝm ®­îc nhÊn kÕ tiÕp.

    Riªng ®èi víi lÖnh OuttextXY trong th­ viÖn ®å häa Pascal trªn nÒn DOS, nã kh«ng xãa d÷ liÖu tr­íc khi hiÓn thÞ néi dung míi, do ®ã sÏ dÉn ®Õn viÖc ghi chång lªn néi dung cò vµ khiÕn ng­êi dïng khã lßng ®äc ®­îc.
§Ó tr¸nh viÖc ghi chång nµy, b¹n cÇn ph¶i xãa néi dung tr­íc ®ã (b»ng lÖnh Bar(...) ch¼ng h¹n) tr­íc khi gäi hµm OuttextXY ®Ó hiÓn thÞ néi dung míi.

Hái: T«i tù häc FoxPro vµ Access. Trong FoxPro, khi tÝnh tiÒn tån quü cña tËp tin TienMat.DBF cã c¸c tr­êng: Ngay, Chung_Tu, Dien_Giai, Thu, Chi, Ton_Quy theo c«ng thøc: Tån quü t¹i thêi ®iÓm Chung_tu(i) = Tån quÜ t¹i thêi ®iÓm Chung_tu(i -1) + Thu(i) - Chi(i). T«i viÕt ch­¬ng tr×nh TienMat.PRG tÝnh Ton_Quy nh­ sau:

Set talk off
Clear
Use TienMat.DBF
tq=ton_quy
do while !eof()
replace ton_quy with tq+thu-chi
tq=tq+thu-chi
skip
enddo
browse
return

    Ch­¬ng tr×nh trªn tÝnh ®­îc Ton_quy theo yªu cÇu. Lµm c¸ch nµo gi¶i quyÕt yªu cÇu nµy b»ng Access?

Tr¶ lêi: NÕu b¹n ®· häc vµ n¾m ®­îc ®Æc tÝnh cña Access th× viÖc dïng Access ®Ó gi¶i quyÕt bµi to¸n cña b¹n sÏ gÇn gièng nh­ FoxPro gi¶i quyÕt:

- Mçi tËp tin c¬ së d÷ liÖu (CSDL) cña Access chøa nhiÒu lo¹i phÇn tö: table, query, form, report, macro vµ module, trong ®ã mçi table (t­¬ng øng víi mét tËp tin CSDL cña FoxPro) gåm nhiÒu mÈu tin (record) víi mét cÊu tróc nµo ®ã theo yªu cÇu.

- Ng«n ng÷ chÝnh ®Ó viÕt ch­¬ng tr×nh øng dông trong Access lµ VBA (Visual Basic for Applications).

    ThÝ dô sau ®©y miªu t¶ mét c¸ch lµm cô thÓ ®Ó gi¶i quyÕt vÊn ®Ò b¹n nªu:

- Ch¹y Access, chän nót Create blank database ®Ó t¹o mét database míi.

- Chän nót Tables, chän New, chän môc Datasheet view. Khi cöa sæ tr×nh bµy mét b¶ng trèng hiÖn lªn, b¹n chän c¸c cét tõ Field1 tíi Field6 råi ®Æt tªn l¹i cho chóng lµ: Ngay, Chung_tu, Thu, Chi, Ton_Quy, Dien_Giai. Sau ®ã, ®Æt tªn cho b¶ng nµy lµ Thuchi.

- NhËp d÷ liÖu theo thø tù tõng record víi tõng field theo yªu cÇu (dïng field Ton_Quy cña record ®Çu ®Ó chøa gi¸ trÞ tån quü ban ®Çu, cã thÓ lµ 0).

- Chän l¹i cöa sæ database, chän nót Forms, chän New, chän môc Design view. Khi xuÊt hiÖn mét form trèng, chän c«ng cô Command Button trong cöa sæ Toolbox ®Ó t¹o mét nót lÖnh trong form. NhÊn chuét ph¶i vµo nót võa t¹o ®Ó lµm hiÓn thÞ thùc ®¬n råi chän Properties, ®Æt l¹i tªn cho nót lÖnh nµy lµ tinhtonquy vµ Caption lµ Tinh ton quy. KÕt hîp biÕn cè (event) OnClick cña nót lÖnh víi thñ tôc sau ®©y ®Ó tÝnh tån quü theo yªu cÇu cña b¹n:

Private Sub tinhtonquy_Click (Cancel As Integer)
Dim Thu As Database
Dim Thuchi As Recordset
Dim tq As Double
Set Thu = CurrentDb
Set Thuchi = Thu.OpenRecordset("Thuchi")
With Thuchi
tq = !tonquy
.MoveNext
Do While Not .EOF
.Edit
!tonquy = tq + !Thu - !Chi
tq = !tonquy
.Update
.MoveNext
Loop
.Close
End With
End Sub

- Sau khi b¹n ®· t¹o ra form ®¬n gi¶n cã mét button lÖnh nh­ trªn, Access sÏ yªu cÇu b¹n ®Æt tªn cho nã ch¼ng h¹n nh­ fmtinhtonquy. Tõ ®©y, b¹n cã thÓ ch¹y form nµy bÊt kú lóc nµo b¹n muèn b»ng c¸ch vµo cöa sæ database, chän nót Forms råi nhÊn ®óp fmtinhtonquy.

Hái: T«i viÕt ch­¬ng tr×nh b»ng AutoLisp cho AutoCAD. C¸c tËp tin ch­¬ng tr×nh nµy ®­îc viÕt d­íi d¹ng v¨n b¶n (text) nªn ng­êi dïng cã thÓ söa ®æi ®­îc ch­¬ng tr×nh. T«i ®­îc biÕt cã mét sè tËp tin LSP cã thÓ ®­îc ®æi sang d¹ng m· m¸y mµ AutoCad cã thÓ ®äc ®­îc (c¸c tËp tin LSP nµy ®­îc Protected). Xin cho biÕt c¸ch hoÆc ch­¬ng tr×nh nµo ®Ó b¶o vÖ c¸c tËp tin Autolisp nµy.

Tr¶ lêi: B×nh th­êng th× c¸c tËp tin ch­¬ng tr×nh AutoLisp ë d¹ng v¨n b¶n nªn bÊt kú ai còng cã thÓ tham kh¶o néi dung. NÕu muèn "che dÊu" néi dung cña nã, b¹n cÇn ®æi nã sang mét d¹ng m· khã ®äc. Tuy nhiªn kh«ng cã tiÖn Ých nµo ®i kÌm theo bé phÇn mÒm AutoCAD cho phÐp b¹n thùc hiÖn viÖc nµy c¶. MÆc dï vËy, cã nhiÒu ng­êi chuyªn dïng AutoCAD ®· viÕt tiÖn Ých nµy, trong ®ã cã c¸c thÇy ë Khoa C¬ KhÝ Tr­êng §H Kü ThuËt Tp. HCM. §Ó biÕt th«ng tin cô thÓ vÒ tiÖn Ých nµy, b¹n cã thÓ liªn hÖ trùc tiÕp víi thÇy Vò TiÕn §¹t theo ®iÖn tho¹i sè 823 2691.

Hái: 1. Em muèn hiÖn mét file .bmp nhanh trªn Turbo Pascal 7.0 th× lµm c¸ch nµo?

2. Mét ch­¬ng tr×nh Pascal (Ver 7.0) cã dïng thñ tôc EXEC cña Unit Dos ®Ó gäi ch­¬ng tr×nh ngoµi (EXEC('C:\VPIC.Exe','C:\Anh.BMP'), v× file Anh.bmp kh¸ lín nªn khi gÆp lÖnh nµy th× ch­¬ng tr×nh dõng l¹i ®Ó ®äc ®Üa, ®iÒu nµy ngoµi ý muèn. VËy cã c¸ch nµo ®Ó ®­a c¶ 2 file: Anh.bmp vµ VPIC.exe (file xem ¶nh) vµo Ram ®Ó khi gÆp lÖnh trªn th× ch­¬ng tr×nh chØ t×m chóng trong Ram ®Ó gi¶m thêi gian truy xuÊt ®Üa (khi kÕt thóc ch­¬ng tr×nh th× c¸c file trªn còng ®­îc gi¶i phãng).

Tr¶ lêi: (1&2). Trªn DOS kh«ng cã c¸ch nµo cho phÐp b¹n n¹p tr­íc ch­¬ng tr×nh vµ d÷ liÖu cña ch­¬ng tr×nh ®ã vµo RAM ®Ó khi cÇn sÏ ch¹y nhanh h¬n. Thùc vËy, khi cÇn thi hµnh ch­¬ng tr×nh, DOS míi t×m file ch­¬ng tr×nh trªn ®Üa vµ n¹p nã vµo RAM. Lóc ch­¬ng tr×nh ch¹y, tïy thuéc vµo gi¶i thuËt, nã sÏ ®äc d÷ liÖu khi cÇn thiÕt. Riªng tr­êng hîp cña b¹n, do ch­¬ng tr×nh b¹n gäi tr×nh vpic.exe ®Ó nhê nã hiÓn thÞ file ¶nh anh.bmp nªn b¹n kh«ng thÓ can thiÖp vµo qu¸ tr×nh hiÓn thÞ ¶nh cña vpic.exe ®­îc. §Ó chñ ®éng trong qu¸ tr×nh n¹p file ¶nh vµo RAM còng nh­ hiÓn thÞ nã lªn mµn h×nh, b¹n nªn xö lý trùc tiÕp file ¶nh. §Ó xö lý trùc tiÕp ®­îc ¶nh *.bmp, b¹n ph¶i:

- HoÆc n¾m v÷ng cÊu tróc file ¶nh *.bmp. Cã rÊt nhiÒu tµi liÖu giíi thiÖu cÊu tróc file *.bmp, b¹n cã thÓ ®äc bµi "Bitmap Storage" vµ c¸c bµi b¸o liªn quan trong CDROM MSDN kÌm theo bé Visual Studio 6.0 cña Microsoft.
- HoÆc dïng tiÖn Ých chuyÓn format file tõ *.bmp sang d¹ng ®å häa BGI cña Borland råi dïng hµm putimage() ®Ó hiÓn thÞ lªn mµn h×nh khi cÇn thiÕt. Mét trong nh÷ng tiÖn Ých chuyÓn format ¶nh tõ *.bmp sang *.bgi lµ tr×nh bmp2bgi.exe, b¹n cã thÓ download nã tõ Internet ë ®Þa chØ ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/bmp2bgi1.zip

Hái: Trong Pascal ë chÕ ®é ®å häa mçi khi thùc hiÖn ch­¬ng tr×nh hµm GraphResult sÏ tr¶ l¹i m· lçi cña ch­¬ng tr×nh ®å häa ®ã. Muèn biÕt ®­îc th«ng b¸o lçi nµy ta dïng hµm GraphErrorMsg. Cßn ë chÕ ®é v¨n b¶n khi thùc hiÖn gäi mét trong c¸c thñ tôc trong Unit Dos hoÆc thùc hiÖn c¸c lêi gäi vµo ra... th× m· lçi l­u trong biÕn Dos Error hoÆc hµm IOResult. Hái cã c¸ch nµo biÕt ®­îc c©u th«ng b¸o lçi mµ hµm IOResult hay biÕn DosError tr¶ l¹i kh«ng.

Tr¶ lêi: BiÕn DosError trong unit Dos hay hµm IOResult chØ tr¶ vÒ m· lçi sai ®Ó b¹n xö lý (d¹ng sè nguyªn), Pascal kh«ng cung cÊp hµm nµo cho phÐp ®æi m· lçi sai thµnh chuçi v¨n b¶n sai t­¬ng øng. NÕu b¹n cÇn yªu cÇu nµy, b¹n cã thÓ t¹o mét d·y n String, String i chøa chuçi lçi t­¬ng øng víi m· lçi i. B¹n cã thÓ vµo phÇn Help cña Pascal, t×m môc "Run-time error messages" ®Ó biÕt tÊt c¶ m· lçi vµ c¸c chuçi lçi t­¬ng øng.


   

PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com