II. Tra từ
2. Xuất kết quả (Hàm Translate)
Để hiển thị từ điển với cấu trúc nh một file Word ta phải xử lý chúng thông qua định dạng file rtf (RichText Format) mà trong Visual Basic đó là đối tợng RichTextBox. Mỗi đối tợng có hai trờng dữ liệu đáng quan tâm là trờng văn bản (Text) và trờng mã định dạng cho văn bản đó (TextRTF).
Ví dụ để hiển thị dòng chữ “Dai hoc Da Nang” font = “.vnTime” size=14, màu đỏ ta phải viết một đoạn mã nh sau:
{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;} {\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2 .VnTime;}}
{\colortbl\red0\green0\blue0;\red255\green0\blue0;} \deflang1033\pard\plain\f2\fs28\cf1 Dai hoc Da Nang \par }
(Xem phụ lục 2 về ý nghĩa của các mã rtf)
Nh vậy nếu dữ liệu đợc lu ở dạng file mã rtf thì dung lợng sẽ rất lớn do đó quá trình nạp dữ liệu sẽ chậm. Để khắc phục vấn đề này ta chỉ lu dữ liệu ở dạng file văn bản tức chỉ lu dòng “Dai hoc Da Nang”. Trên đó ta qui định thêm các tab định dạng riêng. Khi đó ta sẽ xử lý trên văn bản này, chỉ khi nào muốn hiển thị thông tin ra màn hình mới chuyển file văn bản đó thành mã rtf. Điều này có nghĩa là ta chỉ thay các tab đó thành các đoạn mã định dạng tơng ứng.
Các tab định dạng đợc qui định nh ở bảng dới
Tab Đoạn mã thay thế Giải thích
“$” "\par \plain\li500\f4\fs24\cf2 " Bắt đầu một nghĩa “#” "\par \plain\li0\f3\fs24\cf1\i " Bắt đầu một ví dụ “^” "\plain\f4\fs24\cf3 " Bắt đầu đánh dấu đỏ
“~” "\plain\li0\f3\fs24\cf1\i " Kết thúc đánh dấu đỏ thong giải thích “`” "\plain\f4\fs24\cf2 " Kết thúc đánh dấu đỏ trong ví dụ Chr(13) "\par " Xuống dòng
Với bảng font và bảng màu đợc định nghĩa qua đoạn mã:
"{\rtf1\ansi\deff0\deftab720 {\fonttbl
{\f0\fswiss MS Sans Serif;} {\f1\froman\fcharset2 Symbol;} {\f2\fswiss MS Sans Serif;} {\f3\fswiss .VnCourier;} {\f4\fswiss .VnTeknical;} {\f5\fswiss .VnTimeH;}} {\colortbl \red0\green0\blue0; \red0\green0\blue255; \red0\green120\blue120; \red255\green0\blue0;} \deflang2057\pard \par }"
Để biết thêm chi tiết ý nghĩa của các tab định dạng văn bản trên xin xem phần cấu trúc file RTF.
Nhiệm vụ của hàm Translate là lấy từ trong hộp nhập từ, tìm nó trong danh sách từ nếu có sẽ đa ra kết quả, còn không sẽ thông báo lỗi không tìm thấy.
nghệp
Nh vậy công việc của hàm Translate là: Trớc hết, loại bỏ các dấu (“.”, “,”, “:”, “!”,...) có trong từ nhập vào. Sau đó, kiểm tra có tồn tại một từ nh vậy trong từ điển không.
Nếu có, các việc phải làm:
- hiện dòng chọn sáng lên từ đó trong danh sách từ
- Cập nhật từ đó vào danh sách quay lui (lstBack) (xem phần nút lệnh quay lui)
- Kiểm tra trong danh sách những từ đã tra, nếu cha tồn tại một từ nh vậy thì bổ xung vào danh sách những từ đã tra.
- Thay tất cả các tab định dạng thành các đoạn mã định dạng nh bảng trên. - Hiển thị thông tin bằng cách dùng mã. Mã của thông tin hiển thị bao gồm phần định nghĩa bảng font và bảng màu ở trên sau đó là phần mã đã đợc thay thế các tab ở bớc kế trên.
Sau đây là nội dung toàn bộ hàm Translate
Public Sub Translate()
txtKey.Text = Trim(txtKey.Text) txtKey.Text = Replace(txtKey.Text, ".", "") txtKey.Text = Replace(txtKey.Text, ",", "") txtKey.Text = Replace(txtKey.Text, ":", "") txtKey.Text = Replace(txtKey.Text, ";", "") txtKey.Text = Replace(txtKey.Text, "!", "") txtKey.Text = Replace(txtKey.Text, "?", "") txtKey.Text = Replace(txtKey.Text, """", "") temp$ = LCase(txtKey.Text) If d.Exists(temp$) Then i = 0
Do While i < lstKey.ListCount And StrComp(txtKey.Text, lstKey.List(i), vbTextCompare) > 0 i = i + 1
Loop
If i = lstKey.ListCount Then i = i - 1
lstKey.Selected(i) = True 'Dua con tro ve vi tri cua tu ReDim Preserve B(BCount) As String
cmdHistory.Enabled = True cmdReplace.Enabled = True If BCount > 0 Then
cmdBack.Enabled = True End If
Current = lstKey.ListIndex ‘dnh dau tu dang tra ‘Bo sung tu vao danh sach quay lui
B(BCount) = Str(Current) & "/" & lstKey.Text
BCurrent = BCount ‘Dua con tro Back den cuoi danh sach BCount = BCount + 1
‘Bo sung tu vao danh sach nhung tu da tra If lstHistory.ListCount = 0 Then
lstHistory.AddItem (txtKey.Text) ReDim Preserve H(0) As Integer H(0) = lstKey.ListIndex
Else
kt = False
nghệp
If StrComp(txtKey.Text, lstHistory.List(i)) = 0 Then kt = True
Next i
If Not kt Then
lstHistory.AddItem (txtKey.Text)
ReDim Preserve H(lstHistory.ListCount - 1) As Integer H(lstHistory.ListCount - 1) = lstKey.ListIndex
End If End If
‘Hien thi thong tin
rtbEntry.TextRTF = "{\rtf1\ansi\deff0\deftab720 {\fonttbl
{\f0\fswiss MS Sans Serif;} {\f1\froman\fcharset2 Symbol;} {\f2\fswiss .VnTimeH;}} {\colortbl \red0\green0\blue0; \red255\green0\blue0;} \deflang2057\pard " & "\plain\qr\f2\fs32\cf1\b " & txtKey.Text & " \par }" temp$ = d.Item(temp$)
temp$ = Replace(temp$, "|", """")
temp$ = Replace(temp$, "^", "\plain\f4\fs24\cf3 ") temp$ = Replace(temp$, "`", "\plain\f4\fs24\cf2 ")
temp$ = Replace(temp$, "~", "\plain\li0\f3\fs24\cf1\i ") temp$ = Replace(temp$, Chr(13), " \par ")
temp$ = Replace(temp$, "#", "\par \plain\li0\f3\fs24\cf1\i ") temp$ = Replace(temp$, "$", "\par \plain\li500\f4\fs24\cf2 ") rtbItem.TextRTF = "{\rtf1\ansi\deff0\deftab720
{\fonttbl
{\f0\fswiss MS Sans Serif;} {\f1\froman\fcharset2 Symbol;} {\f2\fswiss MS Sans Serif;} {\f3\fswiss .VnCourier;} {\f4\fswiss .VnTeknical;} {\f5\fswiss .VnTimeH;}} {\colortbl \red0\green0\blue0; \red0\green0\blue255; \red0\green120\blue120; \red255\green0\blue0;} \deflang2057\pard "
& temp$ & " \par }" Else
Form3.Show vbModal, Me End If
nghệp
Ch
Chơng 3ơng 3
Thiết kế giao diện cập nhật
Thiết kế giao diện cập nhật
Để rõ ràng cho ngời dùng khi cập nhật ta tách một từ ra thành từng thành phần riêng biệt của nó. Một từ có các thành phần sau:
- Từ khóa để nhận dạng từ. Đợc lu trong một RichTextBox.
- Giải thích bao gồm nhiều nghĩa, mỗi nghĩa lại có ví dụ kèm theo. Do số l- ợng các nghĩa là không cố định và không giới hạn, nên ta có thể dùng một danh sách để lu các nghĩa theo kiểu chỉ số (nghĩa 1, nghĩa 2,...). Mỗi nghĩa lại chia ra thành hai phần giải thích và ví dụ. Hai phần này đợc đa ra trong hai RichTextBox. Nh vậy ta cần có các công cụ sau: (Xem hình 2-4)
Hình 2-4. Giao diện cập nhật của từ điển