Dự án Tex cho học sinh khiếm thị

tuhocvba

Administrator
Thành viên BQT
Bối cảnh:
Nếu trên TexStudio nếu chúng ta click vào lệnh phân số:
Bạn cần đăng nhập để thấy đính kèm


Ta sẽ ấn nút Ctr + → để di chuyển con trỏ từ num sang den hoặc ngược lại.

Bài toán đặt ra với Word (cho học sinh khiếm thị) :
Trên Word tôi có văn bản như sau:
Bạn cần đăng nhập để thấy đính kèm

Khi thực thi macro vidu() thì nó sẽ ghi dòng chữ sau vào vị trí con trỏ đang đứng: (hãy ghi chú vị trí con trỏ đang đứng vào biến global (public) trước khi thực thi lệnh ghi, để sau này thực thi lệnh tìm kiếm từ vị trí con trỏ đang đứng này.)
Bạn cần đăng nhập để thấy đính kèm

Mã:
Subvidu()
    Selection.InsertAfter "\frac{@ts1}{@ts2}"
End Sub
Tôi sử dụng @ts1 và @ts2 là các ký tự luôn là duy nhất trên văn bản (Trên văn bản đảm bảo không bao giờ có ký tự này nhằm tránh trùng lặp-có thể định nghĩa bằng từ khác).
Yêu cầu viết một thủ tục select vào cụm @ts1. Tên thủ tục là vidu2() .

Kết quả khi thực thi thủ tục vidu2() được như sau:
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Code:
Mã:
Public ts   As Long
Public sltk As Long
Public soluongthamso    As Long
Sub ghi()
    Dim ts1 As String
    Dim ts2 As String
    
    ts = ts + 1
    ts1 = "@ts" & ts    '@ts1
    
    ts = ts + 1
    ts2 = "@ts" & ts    '@ts2
    
    soluongthamso = 2 'Lam viec voi 2 tham so
    
    Selection.TypeText Text:=" \frac{" & ts1 & "}{" & ts2 & "}"
    sltk = 0 'Chua tim kiem lan nao
    Call ctrmuitenphai
End Sub



Sub ctrmuitenphai()
    Dim arr

    If ts = 0 Then Exit Sub

    ReDim arr(ts - soluongthamso + 1 To ts)
    For i = LBound(arr) To UBound(arr) Step 1
        arr(i) = "@ts" & i
    Next i
    'Thuc hien tim kiem va ghi:


    
    If sltk > UBound(arr) Then
        sltk = LBound(arr)
    ElseIf sltk < LBound(arr) Then
        sltk = LBound(arr)
    End If
    Selection.HomeKey Unit:=wdStory

  
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = CStr(arr(sltk))
            Do While .Execute
                Selection.Range.Select
                Selection.Delete
            Loop
        End With

    '=============================Ket thuc chuong trinh
    sltk = sltk + 1
End Sub
 
Dạ em xin đóng góp ý tưởng sử dụng bookmark để đánh dấu và tìm kiếm 1 phần nào đó trong range.
Yêu cầu bài toán:
Khi người sử dụng dùng phím tắt để insert text "\frac{@ts1}{@ts2}" thì code sẽ tự động tìm đến phần "@ts1" để bôi đen, sau đó delete để người dùng có thể nhập dữ liệu vào 1 cách nhanh chóng, tiếp theo là lựa chọn phần "@ts2”.
Từng bước thực hiện và kết quả khi chạy code “SELECTTEXT”
Bước 1: Chèn text "\frac{@ts1}{@ts2}"
Bước 2: Chạy code “SELECTTEXT”
Bạn cần đăng nhập để thấy hình ảnh

Bước 3: Sau khi người dùng nhập dữ liệu vào phần “@ts1” thì dữ liệu lúc này sẽ thay đổi thành: "\frac{3x+2}{@ts2}".
Tiếp theo ta chạy code “SELECTTEXT” lần nữa, code sẽ chuyển sang lựa chọn phần “@ts2” để người sử dụng có thể nhập dữ liệu ngay.
Bạn cần đăng nhập để thấy hình ảnh

Cách code hoạt động.
Sau khi người sử dụng insert text thì code sẽ bôi đen vùng text này. Vì vậy, code sẽ kiểm tra xem vùng lựa chọn này có giống với dạng “\frac{@ts1}{@ts2}” hay không. Nếu có thì gán bookmark có tên là “ps”.
Tiếp tục, code sẽ tìm kiếm từ khóa “@ts1” chỉ trong range được lựa chọn, bôi đen phần tìm thấy và xóa nó đi để người dùng nhập dữ liệu vào.
Để có thể tìm phần “@ts2”, code sẽ kiểm tra xem đã có bookmark tên “ps” hay chưa, nếu có thì sẽ lựa chọn bookmark, tiếp tục tìm tiếp trong bookmark xem có từ khóa “@ts2” hay không, nếu có thì sẽ bôi đen và xóa nó đi. Đồng thời, sẽ xóa luôn phần bookmark đã gán.
Để code phân biệt khi nào người dùng nhập vào phần “@ts1” và khi nào chuyển sang phần “@ts2” thì cần kiểm tra điều kiện là có bookmark tên “ps” hay chưa. Nếu có rồi thì chuyển sang phần “@ts2”, còn nếu chưa có thì sẽ làm tìm phần “@ts1”.
Mã:
Sub VANDEDATRA()
Selection.InsertAfter "\frac{@ts1}{@ts2}"
End Sub
Sub SELECTTEXT()
''''''''''''''CODE CUNG THAY PHAM MINH HOANG''''''''''''''''''''
'''''''''''SELECT TEXT TRONG CONG THUC '''''''''''''''''''''''''''
Dim n As String
Dim m As String
n = "@ts1"
m = "@ts2"
If ActiveDocument.Bookmarks.Exists("ps") = True Then
 ActiveDocument.Bookmarks("ps").Select
 Call timkiemtrongrange(m)
 ActiveDocument.Bookmarks("ps").Delete
ElseIf Selection.Range.Text = "\frac{" & n & "}{" & m & "}" Then
ActiveDocument.Bookmarks.Add _
 Name:="ps", Range:=Selection.Range
 Call timkiemtrongrange(n)
End If
End Sub
Private Sub timkiemtrongrange(n As String)
Dim oRng As Word.Range
Set oRng = Selection.Range
With oRng.Find
    .Text = n
    .Execute
    If .Found Then
    oRng.Select
    oRng.Delete
    End If
    End With
End Sub
 

NhanSu

SMod
Thành viên BQT
@nguyenduchien về logic code thì mình không có ý kiến gì nhưng về quy ước viết code (code convention) thì mình xin góp ý để dễ đọc như sau:
- Tên sub và function nên đặt theo kiểu PascalCase, viết hoa chữ cái đầu từ. Ví dụ VanDeCanTra thay vì VANDECANTRA.
- Tên biến thì tùy thói quen của mỗi người nhưng nên nhất quán. Có người thích dùng kiểu Hungarian (thêm kiểu trước tên biến, ví dụ strText là biến kiểu string); có người thích dùng kiểu PascalCase. Cá nhân mình thích kiểu Pascal, đặt tên biến rõ nghĩa luôn trừ các biến dùng nhiều lần với mục đích chung như i j n.
- Bắt đầu và kết thúc khối lệnh (ví dụ with và end with) nên thẳng hàng, phần thân của khối lệnh thụt vào 1 tab.
 
Dạ em cảm ơn anh. Em mới tập viết code nên còn nhiều sai sót. Em sẽ cải thiện để code rõ ràng và nhất quán hơn.
 
Top