• Thứ Tư, 15/12/2010 08:05 (GMT+7)

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

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

    Q: Tôi lập trình C#, thiết kế form để đổ data từ SQL 2005 ra datagridview trên form nhưng không biết cách để thao tác thêm, sửa, xóa và cập nhật thêm record.

    A: Khi lập trình truy xuất database trong môi trường .Net, cách tốt nhất là dùng các đối tượng ADO .Net, thí dụ đối tượng DataGridView có thể được dùng để xem/hiệu chỉnh dữ liệu từ 1 table dữ liệu trong 1 database. Trong môi trường Visual Studio .Net, khi bạn thiết kế trực quan 1 đối tượng DataGridView để xem/hiệu chỉnh dữ liệu từ 1 table, máy sẽ tạo ra 1 số đối tượng sau:

    DataGridView <--> BindingSource <--> DataSet <--> DataAdapter <--> Database trên Database Server

    Để hiển thị dữ liệu của 1 table (hay kết quả của 1 lệnh truy vấn), máy sẽ thực hiện tác vụ Fill của đối tượng DataAdapter, tác vụ này sẽ load dữ liệu liên quan từ database server về và để tạm trên đối tượng DataSet, nội dung tạm này sẽ được liên kết đến đối tượng DataGridView để nó hiển thị lên màn hình. 

    Khi người dùng hiệu chỉnh/thêm/bớt record trực tiếp trên DataGridView, nội dung được hiệu chỉnh/thêm/bớt chỉ được chứa cục bộ trong DataSet tương ứng, chứ chưa được lưu lên database. Muốn lưu thông tin hiện có trong DataGridView (tức là trong DataSet) lên database, chương trình phải gọi tường minh tác vụ Update của đối tượng DataAdapter.

    Để thấy rõ ràng và cụ thể các ý tưởng nêu trên, chúng tôi giới thiệu qui trình điển hình để xây dựng ứng dụng VC# đơn giản demo việc hiệu chỉnh/thêm/bớt record của bảng dữ liệu trực tiếp bằng DataGridView như sau:

    1. Tạo mới 1 database (thí dụ tên là DBTest) trên SQL Server 2005, tạo 1 table mới (thí dụ là MyTable) trong database, mỗi record có 1 số field data cần thiết, trong đó có ít nhất 1 khóa chính (primary key) rồi tạo mới một số record trong bảng MyTable. Bạn có thể thực hiện công việc của bước 1 này dễ dàng và trực quan thông qua tiện ích "SQL Server Management Studio Express". Bạn có thể download tiện ích này trên Internet và cài vào máy trước khi dùng nó.

    2. Chạy Visual Studio .Net (thí dụ 2005). Tạo Project quản lý ứng dụng bằng cách chọn menu File.New Project, khi cửa sổ New Project hiển thị, chọn mục Visual C# trong cây Project Types, chọn icon "Windows Application", nhập tên Project (thí dụ là DBTest) vào textbox Name rồi nhấn button OK.

    3. Khi cửa sổ thiết kế Form ứng dụng rỗng hiển thị, thay đổi kích thước form theo yêu cầu, dời chuột về Toolbox để hiển thị nó, duyệt tìm và chọn mục DataGridView rồi vẽ nó lên form ở vị trí và kích thước mong muốn. Tương tự, vẽ 1 button ở dưới DataGridView. Kết quả cửa sổ có dạng:

    4. Chọn lại đối tượng button để hiển thị cửa sổ thuộc tính của nó, tìm và hiệu chỉnh thuộc tính (Name) thành btnSave, thuộc tính Text = "Luu ket qua cap nhat". 

    5. Chọn lại đối tượng DataGridView để hiển thị cửa sổ thuộc tính của nó, tìm và hiệu chỉnh thuộc tính (Name) thành DGView. tìm và chọn thuộc tính Data Source, icon chứa dấu chỉ xuống hiển thị trong field giá trị bên phải, nhấn chuột vào mũi tên chỉ xuống để hiển thị danh sách các Data Source đã tạo trong Project (lúc này chưa có), nhấn chuột vào mục "Add Project Data Source" để hiển thị cửa sổ Wizard giúp bạn khai báo trực quan Data Source được dùng với đối tượng DataGridView. Chọn icon Database rồi button Next để hiển thị cửa sổ kế tiếp. Nhấn button New Connection để hiển thị cửa sổ "Add Connection", lần lượt khai báo các thông tin trong cửa sổ này như data source, server name, các thông tin để login, chọn tên database cần truy xuất, nhấn button "Test Connection" để kiểm tra xem có truy xuất được không. Nếu không được thì kiểm tra và hiệu chỉnh các thông số đã nhập sao cho việc truy xuất vào database thành công rồi nhấn chuột vào button OK để đóng cửa sổ "Add Connection" lại. Khi cửa sổ Wizard hiển thị lại, bạn chọn checkbox "Yes,…" rồi nhấn button Next để chuyển sang cửa sổ Wizard kế tiếp. Nhấn button Next lần nữa để chuyển sang cửa sổ Wizard kế tiếp, cửa sổ này hiển thị cây các tài nguyên trong database, mở rộng mục Tables, duyệt tìm và chọn tên table mà bạn muốn làm việc (MyTable). Nhấn chuột vào button Finish để hoàn tất việc định nghĩa data source được dùng trong đối tượng DataGridView. Quan sát trong cửa sổ thiết kế form, bạn thấy 3 đối tượng mới được tạo ra: 1 Dataset có tên là DBTestDataSet, 1 TableAdapter có tên là myTableTableAdapter, 1 BindingSource có tên là myTableBindingSource.

    6. Ấn kép chuột vào button "Luu ket qua…" để tạo hàm xử lý sự kiện click chuột trên nó rồi viết code sau đây:

    private void btnSave_Click(object sender, EventArgs e) {
    myTableTableAdapter.Update(DBTestDataSet.MyTable);
    }

    7. Chọn menu Debug.Start Debugging để dịch và chạy ứng dụng. Nếu bạn thực hiện đúng mọi bước trên thì chương trình không có lỗi và sẽ chạy tốt. Bạn có thể thay đổi bất kỳ field nào của record đã có trong table, bạn có thể thêm record mới vào hàng cuối của đối tượng DataGridView. Tuy nhiên nội dung hiệu chỉnh/thêm/bớt thông tin trên DataGridView chỉ được chứa cục bộ trong đối tượng DataSet tương ứng. Mỗi lần muốn lưu thông tin hiện có trong DataGridView (tức trong DataSet) lên Database Server, bạn phải nhấn chuột vào button "Luu ket qua…" để kích hoạt hàm btnSave_Click chạy và hàng lệnh trong thân của hàm này sẽ lưu kết quả lên database.

    Bạn có thể liên hệ với tạp chí để copy file DBTest.zip chứa toàn bộ Project VC# của chương trình.

    Q: Trong Excel, xin hỏi dùng hàm gì để đổi giá trị ngày tháng năm trong cột A thành giá trị thứ trong tuần và khi kéo công thức đó trong cột B xuống thì những ô nào trong cột A không có giá trị ngày tháng năm thì ô tương ứng trong cột B sẽ để trống.

    A: Trong Excel (hay trong nhiều phần mềm khác), khi cần giải quyết 1 chức năng nào đó thì bạn có thể chọn 1 trong 2 cách giải quyết sau:

    - Nếu biết hàm sẵn có trong môi trường giải quyết được chức năng cần thực hiện thì bạn hãy dùng hàm đó cho dễ dàng và nhanh chóng.

    - Nếu không có hàm sẵn có trong môi trường (có thể do bạn chưa biết rõ) thì bạn hãy viết 1 hàm mới cho riêng mình để giải quyết vấn đề mà mình muốn, người ta gọi hàm định nghĩa mới này là "user-defined function". Sau khi đã định nghĩa, bạn có thể dùng hàm mới của mình y như dùng hàm sẵn có của hệ thống.
     

    Giả sử bạn không tìm được hàm sẵn có nào để giải quyết việc đổi ngày/tháng sang ngày trong tuần, bạn có thể viết và dùng hàm tự định nghĩa theo qui trình điển hình sau đây: 

    1. Chạy Excel, mở file Excel chứa dữ liệu cần xử lý. 

    2. Kiểm tra nội dung ở cột A đã có nội dung ngày/tháng đúng theo yêu cầu chưa, nếu chưa thì hiệu chỉnh lại theo mong muốn.

    3. Chọn menu Tools.Macro.Visual Basic Editor để mở cửa sổ soạn code VBA. 

    4. Dời chuột về phần tử gốc của cửa sổ "Project" nằm ở trên trái màn hình, ấn phải chuột vào phần tử gốc để hiển thị menu lệnh, chọn mục Insert.Module để tạo mới 1 module mã nguồn VBA. Khi cửa sổ mã nguồn trống hiển thị, bạn hãy viết 2 hàm chức năng sau đây vào:
    'hàm xác định tên thứ bằng tiếng Anh trong tuần

    Public Function EnThuCuaNgay(rg As Range) As String
    Dim sbuf As String
    EnThuCuaNgay = Format(rg.Cells(1, 1).Value, "dddd")
    End Function
    'hàm xác định tên thứ bằng tiếng Việt trong tuần
    Public Function VnThuCuaNgay(rg As Range) As String
    Dim sbuf As String
    Dim EnTenthu(1 To 7) As String
    Dim VnTenThu(1 To 7) As String
    Dim i As Integer
    'khởi động tên các thứ bằng tiếng Anh
    EnTenthu(1) = "Sunday"
    EnTenthu(2) = "Monday"
    EnTenthu(3) = "Tuesday"
    EnTenthu(4) = "Wednesday"
    EnTenthu(5) = "Thursday"
    EnTenthu(6) = "Friday"
    EnTenthu(7) = "Saturday"
    'khởi động tên các thứ bằng tiếng Việt không dấu
    VnTenThu(1) = "Chua nhat"
    VnTenThu(2) = "Thu hai"
    VnTenThu(3) = "Thu ba"
    VnTenThu(4) = "Thu tu"
    VnTenThu(5) = "Thu nam"
    VnTenThu(6) = "Thu sau"
    VnTenThu(7) = "Thu bay"
    'xác định tên thứ từ ngày/tháng
    sbuf = Format(rg.Cells(1, 1).Value, "dddd")
    For i = 1 To 7
    If sbuf = EnTenthu(i) Then
    'đổi tên thứ từ Anh sang Việt
    VnThuCuaNgay = VnTenThu(i)
    Exit Function
    End If
    Next i
    VnThuCuaNgay = "Bi loi"
    End Function

    5. Chọn menu File.Close and Return... để quay về cửa sổ hiển thị bảng tính.

    6. Chọn cell B1, nhập nội dung sau vào cell:
    =VnTenCuaNgay(A1)

    7. Bạn sẽ thấy ngay tên thứ bằng tiếng Việt của ngày được qui định ở cell A1. hãy copy nội dung cell B1 và dán xuống các cell khác trong cột B để đổi ngày/tháng sang thứ của các phần tử còn lại.

    Q: Xin tìm giúp hàm API lấy mã ký tự Unicode.

    A: Bạn không nói rõ hàm API muốn tìm có chức năng cụ thể gì, lấy mã ký tự Unicode của ai nên chúng tôi chỉ có thể trả lời tổng quát. Vì mã Unicode là mã ký tự mới nên các ngôn ngữ lập trình khác nhau có mức độ hỗ trợ mã Unicode khác nhau: ngôn ngữ càng mới thì mức độ hỗ trợ càng cao. Thí dụ nếu lập trình bằng ngôn ngữ VB .Net thì bạn có thể gọi hàm định sẵn có tên là AscW() để lấy mã Unicode của ký tự trong tham số, thí dụ lệnh:

    MsgBox (AscW("ậ"))

    sẽ hiển thị mã Unicode của ký tự 'ậ' tiếng Việt. Tuy nhiên, nếu dùng ngôn ngữ VB 6.0 trở xuống, bạn không thể nhập trực tiếp ký tự 'ậ' vào mã nguồn của chương trình như lệnh trên, mặc dù VB 6.0 cũng cung cấp hàm AscW() với cùng chức năng như VB .Net.

    Một thí dụ khác, nếu lập trình trong VB .Net, bạn có thể miêu tả chuỗi "Nguyễn Văn Hiệp" theo mã Unicode rất tự nhiên, trực quan như sau :

    "Nguyễn Văn Hiệp"

    còn nếu bạn dùng VB 6.0 thì phải miêu tả chuỗi trên bằng 1 biểu thức như sau:

    "Nguy" & chrw(&H1ec5) & "n V" & chrw(&H103) & "n Hi" & chrw(&H1ecb) & "p"

    Thông qua thí dụ trên, nếu lập trình bằng những ngôn ngữ hơi cũ, bạn sẽ gặp khó khăn trong việc miêu tả chuỗi Unicode tiếng Việt, bạn cần phải biết mã ký tự Unicode của các ký tự tiếng Việt có dấu (giá trị mã >255). Cách thực dụng nhất để biết ký tự xác định có mã Unicode bao nhiêu, bạn có thể dùng tiện ích sẵn có "Character Map" của Windows bằng cách chọn Start.All Programs.Accessories.System Tools.Character Map. Khi cửa sổ của tiện ích này hiển thị, bạn chọn 1 font chữ hỗ trợ mã Unicode tiếng Việt nào đó (chắn ăn nhất là font Tahoma), duyệt tìm trong ma trận ký tự, chọn ký tự cần tìm mã, máy sẽ hiển thị mã ký tự cần tìm trong textbox nằm ở dưới cửa sổ, mã được viết bằng hệ thống số "thập lục phân".

    Trong trường hợp máy bạn chưa có tiện ích Character thì qui trình cài tiện ích này như sau: chọn menu Start.Control Panel.Add or Remove Programs để hiển thị cửa sổ "Add or Remove Programs", chọn mục "Add/Remove Windows Components", đánh dấu chọn vào mục "Accessories and Utilities", chọn button Next để máy cài tất cả các tiện ích của Windows vào môi trường Windows. Lúc này máy có thể yêu cầu CDROM chứa bản gốc Windows.

    Q: Phần mềm viết trên Foxpro 3.0 khi chạy trên các máy có RAM trên 1GB bị báo lỗi INSUFFICIENT MEMORY và không thể khởi động được chương trình?

    A: Visual Foxpro 3.0 là phiên bản chạy trên Windows, về lý thuyết nó sẽ dùng bộ nhớ ảo do Windows cung cấp. Tùy theo version mà Windows sẽ quản lý RAM tối đa là bao nhiêu. Thí dụ hiện nay, chúng ta thường dùng các version WinXP, Windows Vista, Windows 7, các version này cho phép quản lý RAM khá lớn (>3GB). 

    Do VFP 3.0 là phiên bản quá cũ nên khả năng quản lý bộ nhớ rất hạn chế, cụ thể khi chạy trên máy có RAM > 512MB nó thường báo lỗi "INSUFFICIENT MEMORY" và dừng chạy. Để khắc phục lỗi này, bạn có thể dùng 1 trong các phương pháp sau:

    1. Gỡ RAM ra khỏi máy, chỉ giữ lại 512MB hay ít hơn. Cách này rất bất tiện, làm máy chạy chậm và nhiều khi không khả thi (nếu dung lượng từng thanh RAM trên máy > 512MB).

    2. Cài và dùng Visual FoxPro version mới hơn. Đây là cách tốt nhất vì các phiên bản mới hơn thường tương thích ngược với phiên bản 3.0 của bạn và còn cung cấp thêm nhiều chức năng mới.

    3. Tạo 1 option boot Windows đặc biệt, option này sẽ hạn chế kích thước RAM mà Windows sẽ dùng để phục vụ tốt cho việc chạy VFP 3.0. Qui trình điển hình để thực hiện phương pháp 3 này như sau:

    - Chạy Windows Explorer (ấn phải chuột button Start, chọn mục Explorer).

    - Chọn Tools.Folder Options để hiển thị cửa sổ "Folder Options", đánh dấu chọn vào mục "Show hidden files and folders", bỏ dấu chọn mục "Hidden protected operating system files", chọn button OK để chấp nhận những thay đổi và trở lại cửa sổ Windows Explorer.

    - Chọn và hiển thị nội dung thư mục gốc của ổ c:\, bạn sẽ thấy có file tên là boot.ini. Đây là file mà bạn sẽ thay đổi nội dung.

    - Mở file boot.ini bằng ứng dụng soạn thảo văn bản nào đó (thí dụ NotePad), nội dung của file boot.ini thường có dạng như sau:

    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating systems]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

    - Copy toàn bộ mục "multi(0)…." và dán nó vào sau bản gốc (để thêm 1 mục option boot mới).

    - Hiệu chỉnh nội dung chuỗi miêu tả option boot mới tạo ra và thêm tham số "/maxmem=128" vào cuối chuỗi, nội dung kết quả sẽ có dạng sau :

    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating systems]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP for VFP 3.0" /noexecute=optin /fastdetect /maxmem=128

    - Lưu kết quả lên file c:\boot1.ini (không thể ghi đè lên file boot.ini vì file này đang bị cấm ghi). 

    - Đóng trình soạn thảo lại, mở lại cửa sổ Windows Explorer, hiển thị nội dung thư mục c:\, chọn file boot.ini và xóa nó, rename file boot1.ini thành boot.ini.

    - Boot lại máy, bạn sẽ thấy máy hiển thị menu yêu cầu chọn option boot Windows. Nếu bạn muốn làm việc với VFP 3.0, chọn option boot mới tương ứng với nó. Nếu muốn làm việc với các ứng dụng khác, chọn option boot cũ.

    Lưu ý khi boot Windows với option mới, Windows chỉ sử dụng đúng kích thước RAM qui định trong tham số /maxmem (trong trường hợp trên là 128MB), nhờ đó VFP 3.0 sẽ chạy tốt, không báo lỗi. Tuy nhiên nếu bạn chạy ứng dụng khác thì máy hoạt động rất chậm vì Windows phải "swap" thông tin giữa RAM và đĩa rất nhiều (do dung lượng RAM đang dùng quá ít).

    Q: 1. Sau khi biên dịch chuơng trình viết bằng Delphi thành một file giả sử là ABC.exe. Làm sao buộc người sử dụng khi nhấp đúp vào file ABC.exe này thì chuơng trình phải thực thi với quyền Admin?

    2. Trong Delphi 2010 khi biên dịch chuơng trình có sử dụng menu dạng ribbon thì mặc dù trong lúc thiết kế đã chọn font Segoe UI nhưng khi chạy lại không hiển thị font này mà là font Tahoma? (các thành phần khác luôn hiển thị đúng Font).

    3. Giả sử chỉ thiết kế 1 form là Form1 gồm có 1 nút là Button1. Tôi có thể viết code để khi chạy ứng dụng, chỉ cần nhấn Button1 (OnClick) thì sẽ xuất hiện 1 Form tạm thời (để thực hiện công việc nào đó), nhưng Form đó (tạm gọi là Form2) chỉ là 1 form trống rỗng. Muốn có các Button, Label, Edit,... trên Form2 thì phải viết code thế nào? Xin chỉ giúp đoạn code để thao tác với các thành phần Button, Edit,... trên Form2, sau khi nhấn chuột vào một thành phần nào đó hoặc Button Close chẳng hạn thì Form2 được giải phóng.

    4. Tôi thấy ứng dụng Calculator của Win7 có thể tính toán và cho hiển thị kết quả với rất nhiều chữ số (~ 30 số). Với chuơng trình viết bằng Delphi, làm thế nào để sau khi tính toán, kết quả hiển thị trên Edit vượt hơn 15 con số. VD: 10/3 = 3,333333333333333333333333333.

    A: 1. Trên các hệ điều hành hỗ trợ tốt vấn đề bảo mật, mỗi người dùng đều phải có 1 tài khoản (account) xác định để làm việc được với máy tính. Người quản trị máy (administrator) đã thiết lập quyền hạn cụ thể của từng account: account có thể truy xuất được tài nguyên nào, tính chất và mức độ truy xuất cụ thể trên tài nguyên đó là gì. Người dùng sử dụng máy sẽ được quản lý theo 2 bước:

    - Bước 1: Máy xác nhận người dùng bằng cách yêu cầu người dùng nhập thông tin về account (username+password), nếu thông tin nhập không trùng với bất kỳ account nào do máy đang quản lý, máy sẽ không cho phép người dùng tiếp tục làm việc. Trong trường hợp người dùng nhập đúng account, máy sẽ biết account này có những quyền hạn gì.

    - Bước 2: Mỗi khi người dùng yêu cầu 1 chức năng nào đó, mày sẽ kiểm tra xem có hợp pháp không bằng cách xem thông tin trong account của người dùng tương ứng có cho phép chức năng này không. Nếu không, máy không phục vụ. Khi người dùng chạy 1 ứng dụng nào đó, ứng dụng này sẽ được gán quyền hạn của user tương ứng. Trong lúc ứng dụng chạy, mỗi lần ứng dụng yêu cầu 1 chức năng nào đó, mày sẽ kiểm tra xem hợp pháp không, nếu hợp pháp máy mới phục vụ. 

    Tóm lại, phần mềm không có quyền thực thi cố định, mỗi khi được chạy bởi ai, nó có quyền hạn của người dùng kích hoạt nó. Phần mềm đang chạy với account có quyền hạn ít không thể tự nâng mình lên để có quyền cao hơn (thí dụ tự động chuyển sang quyền admin).

    2. Theo kiểm tra sơ bộ, chúng tôi nhận thấy các đối tượng giao diện chuẩn của Delphi 2010 như TPopupmenu, TMainMenu, TMenuItem… luôn dùng font hệ thống của Windows để hiển thị chuỗi "caption" của mình. Nếu muốn chúng dùng font khác để hiển thị chuỗi "caption" thì bạn có thể dùng một trong các phương án sau:

    - Đổi các font hệ thống như MS San Serif, System font thành font mà bạn cần dùng. Cách này dễ dàng thực hiện nhưng rất bất tiện và độ an toàn không cao, bạn không thể kiểm soát hoàn toàn được vì khi cài driver màn hình hay cài phần mềm khác, font hệ thống lại có thể bị cập nhật lại.

    - Sử dụng các component của hãng thứ 3 (free khá nhiều) cho phép lập trình thiết lập lại font mà chúng sử dụng. 

    - Đặt thuộc tính ownerdraw=true và viết hàm xử lý sự kiện OnOwnerdraw của Form để tự hiển thị chuỗi caption của từng thành phần menu theo font chữ mà bạn thích.

    3. Khi lập trình bằng Delphi (hay bằng một môi trường trực quan khác), bạn sẽ tạo Project để quản lý chương trình mình viết. Delphi 2010 cho phép tạo nhiều loại Project khác nhau như : SDI Application (phần mềm có 1 cửa sổ làm việc), MDI Application (phần mềm có nhiều cửa sổ làm việc đồng thời), VCL Form Application (phần mềm dùng form giao tiếp),… Khi bạn dùng loại Project "VCL Form Application", phần mềm lúc đầu chỉ có 1 Form. Tuy nhiên bạn có quyền tạo thêm nhiều form khác tùy nhu cầu. Để tạo form mới, bạn dời chuột về cửa sổ chứa cây Project (thường nằm ở trên phải màn hình), ấn phải chuột vào mục gốc (Project1.exe), chọn mục Add New.Form. Sau khi đã tạo mới form rỗng, bạn thiết kế các đối tượng giao diện vào form theo yêu cầu riêng, viết các hàm xử lý sự kiện trên các đối tượng giao diện... Về mặt mã nguồn, mỗi form được đặc tả bởi 1 Unit, Unit này chứa đặc tả class đối tượng form tương ứng. Thí dụ form đầu tiên thường có tên là TForm1, form kế tiếp là TForm2,... Trong 1 form, bạn có quyền tạo form khác và hiển thị nó để làm việc với người dùng, thí dụ thủ tục xử lý sự kiện nhấn chuột trên button Button1 trong form1 sau đây:

    procedure TForm1.Button1Click(Sender: TObject);
    {định nghĩa biến form }
    var rf:TForm2;
    begin
    {tạo đối tượng form2 }
    rf:=TForm2.Create(self);
    {hiển thị form2 để làm việc với người dùng }
    rf.ShowModal;
    {đóng form2 khi giao tiếp xong }
    rf.Free;
    end;

    4. Khi lập trình, ta dùng biến để chứa dữ liệu cần xử lý, mỗi biến phải thuộc 1 kiểu dữ liệu xác định và chiếm 1 vùng nhớ xác định, thí dụ biến nguyên, biến thực, biến chuỗi… Mỗi biến chỉ chứa được các giá trị thuộc kiểu của mình. Mỗi ngôn ngữ lập trình sẽ cung cấp 1 số kiểu dữ liệu cụ thể và cho phép người dùng định nghĩa kiểu "user-defined" theo yêu cầu riêng. Để miêu tả và xử lý số thực, ngôn ngữ Pascal trong môi trường lập trình Delphi 2010 cung cấp nhiều kiểu khác nhau, trong đó kiểu Double chiếm 8 byte và miêu tả được số thực với độ chính xác khoảng 15 ký số thập phân, còn kiểu Extended chiếm 10 byte và miêu tả được số thực với độ chính xác tối đa 20 ký số thập phân.

    Nếu có nhu cầu độ chính xác cao hơn, bạn phải tự thiết kế kiểu dữ liệu mới cho riêng mình rồi viết các đoạn code xử lý các phép toán trên các dữ liệu thuộc kiểu mới này.

    Q: Xin hướng dẫn thực hiện đề tài sau:

    - Dữ liệu nhập: Tập các ảnh thẻ 3x4 (D).

    - Ảnh truy vấn (Q),

    - Dữ liệu xuất: Tập các ảnh (R) thuộc D sao cho R gần giống với ảnh Q nhất.

    A: Bài toán của bạn là "bài toán nhận dạng khuôn mặt người". Đã có nhiều người, nhiều tổ chức nghiên cứu và họ đã đưa ra nhiều phương pháp giải quyết khác nhau, trong đó phương pháp được dùng nhiều nhất là xác định và so sánh các tính chất thiết yếu của khuôn mặt như miệng, mũi, mắt, tai,… Ý tưởng của phương pháp này là từ ảnh bitmap 3x4 (hay n*m bất kỳ) miêu tả mặt người nào đó, chương trình sẽ nhận dạng vị trí, kích thước và các tính chất cần quan tâm của từng tính chất thiết yếu như miệng, mũi, mắt, tai,… Bài toán so sánh 2 ảnh bitmap trở thành bài toán đơn giản hơn nhiều là so sánh các tính chất thiết yếu của 2 ảnh đó. 

    Hiện đã có nhiều đề tài luận văn tốt nghiệp của nhiều SV thuộc nhiều trường khác nhau thực hiện đề tài này, kết quả đạt được cũng rất khả quan. Nếu muốn biết chi tiết và rõ ràng hơn về việc giải quyết "bài toán nhận dạng khuôn mặt người", bạn có thể đến thư viện các khoa công nghệ thông tin của các trường đại học để hỏi thăm và mượn đọc bản thuyết minh đề tài liên quan.

    ID: A1011_124