Xây dựng Tool VBA tự động tạo code tool Tikz cho phần mềm Texstudio

tuhocvba

Administrator
Thành viên BQT
Anh em lập trình VBA có thể coi topic này là topic mẫu cho việc tạo Tool tự động tạo ra file output theo yêu cầu.

1. Đặt vấn đề:
Việc sử dụng mã code (TikZ) để vẽ hình có khó khăn là phải nhớ mã lệnh. Do đó, nếu có một Tool, khi click vào ra gợi ý lệnh thì sẽ bớt khó khăn hơn.
2. Tìm hiểu cấu trúc macro cho phần mềm Texstudio:
Mình gặp khó khăn trong việc này, chính thức tại thời điểm làm tool, thì không có tham khảo được đoạn code nào của người Việt. Nhưng may mắn là thông qua mấy trang web nước ngoài, mình dẫn link sau, thì đã hiểu được cấu trúc code.
Giả sử tôi có input như sau:
Bạn cần đăng nhập để thấy đính kèm

Bây giờ tôi muốn output như thế này
JavaScript:
var arraygt = [ "" ]; // Clear variable
arraygt =[
    "Vẽ đường thẳng",
    "   Đường thẳng với [độ dày]"
]
choisedialog = new UniversalInputDialog();
choisedialog.setWindowTitle( "Đường thẳng" );
choisedialog.add(arraygt,"Lựa chọn loại đường","choiseGT");
choisedialog.add( true, "Chèn chú thích ", "checkbox" );
    thvba: if (choisedialog.exec() != null) {
            if (choisedialog.get("choiseGT") == "Vẽ đường thẳng") {
                cursor.insertLine();
                editor.insertText("\draw (x1,y1) -- (x2,y2);");


break thvba;}

            if (choisedialog.get("choiseGT") == "   Đường thẳng với [độ dày]") {
                cursor.insertLine();
                editor.insertText("\draw[line width=1pt] (x1,y1)--(x2,y2);");
                cursor.insertLine();
                editor.insertText("");


break thvba;}

}
Phần code đầu là phần quan trọng, coi như cố định. Phần thay đổi là bắt đầu từ việc xét điều kiện (if). Nếu như input có càng nhiều hạng mục thì code trên càng dài, càng lắm lệnh if, đây chính là phần mà macro cần giản lược.

3. Hướng suy nghĩ:
Output tôi mong muôn là tạo ra một file txt có nội dung như trên từ INPUT như đã nêu. Tất nhiên nội dung input có thể thay đổi, tức là có thể có nhiều dòng dữ liệu đầu vào nhưng cấu trúc thì không thay đổi.

Vậy, nội dung sẽ ghi vào một biến string. Cụ thể ở trong chương trình, tôi nạp nội dung này vào biến op. Sau khi nội dung này được soạn xong, thì tôi ghi nội dung này ra file txt và lưu lại.
Mã:
'INPUT: link file txt
'INPUT: Noi dung nhap vao file txt

'OUTPUT: txt

Sub CreateAfile(ByVal lk As String, ByVal outem As String)
    Dim fso As Object, MyFile  As Object
    Dim lk2 As String
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Right(lk, 1) = Application.PathSeparator Then
        lk2 = lk & "Code_" & Format(Now, "yymmddhhmmss") & ".txt"
    Else
        lk2 = lk & Application.PathSeparator & "Code_" & Format(Now, "yymmddhhmmss") & ".txt"
    End If
    Set MyFile = fso.CreateTextFile(lk2, True, True)
    MyFile.Write outem
    MyFile.Close
    Set fso = Nothing
End Sub
Đoạn code này chính là đoạn code để ghi nội dung ra một file txt và lưu lại.
Đây là phần mà các bạn có thể áp dụng cho các chương trình khác nhau của các bạn.

Link file VBA mà các bạn có thể tham khảo code:
Ấn Alt +F11, mật khẩu mở pass vẫn như mọi khi:
Mã:
tuhocvba.net

Trong quá trình tìm hiểu cấu trúc code macro của phần mềm Texstudio, tôi tham khảo ở đây:

Keyword để tôi có thể tìm hiểu đó chính là "UniversalInputDialog". Nhờ có keyword này mà tôi đã tìm được nguồn tham khảo rất chính xác. Tại sao tôi lại có keyword này thì cần phải cảm ơn video của thầy Bùi Quỹ, trong phần giới thiệu Tool, tuy tool thì không công khai, nhưng qua màn hình, trong một chốc lát tôi nhìn thấy dòng code có chữ UniversalInputDialog xuất hiện.
Bạn cần đăng nhập để thấy đa phương tiện
 

giaiphapvba

Administrator
Thành viên BQT
Nhìn vào sơ đồ này mọi người sẽ dễ hình dung công việc phải làm, không có gì phức tạp lắm (theo quan điểm VBA)
Bạn cần đăng nhập để thấy đính kèm
 

phuonghong1997

Yêu THVBA như điếu đổ
Theo em thì anh chị nên dùng hình ảnh để minh họa ý tưởng. Em đọc mà cũng không hiểu anh chị nói gì ạ.
Cách upload hình lên diễn đàn, anh chị tham khảo ở đây ạ :
 

MINH-PHUONG

Yêu THVBA
Dạ, AD GIAIPHAPVBA và phuonghong1997 ơi!
Ở mục số 2 trong hình dòng 8 " choisedialog.add(arraygt,"Lựa chọn loại đường","choiseGT"); ".
Sau khi chạy thì sẽ xuất hiện thêm 1 cái lựa chọn trong check box nữa. Lần lượt là: 2 phần tử trong arrayqt + 1 lựa chọn là total các phần tử trong arrayqt.
AD có có giải pháp nào để ẩn hoặc xóa cái bonus thêm đó không? Chỉ em với em tìm mãi không ra!
Em cảm ơn phuonghong1997 và AD nhiều lắm!
Đây là hình thực tế!
Bạn cần đăng nhập để thấy hình ảnh
 

tuhocvba

Administrator
Thành viên BQT
Bạn xem lại code của bạn, chứ của tôi có làm gì thấy số 2 nào đâu.
Bạn cần đăng nhập để thấy hình ảnh
 

MINH-PHUONG

Yêu THVBA
Bạn xem lại code của bạn, chứ của tôi có làm gì thấy số 2 nào đâu.
Bạn cần đăng nhập để thấy hình ảnh
Dạ, code của em iran trên AD hướng dẫn hihi!
AD đang dùng texstudio mấy vậy!

Bạn cần đăng nhập để thấy hình ảnh

Em sài bản: 4.0.0 qt5.

Đây là script hướng dẫn!
Bạn cần đăng nhập để thấy hình ảnh


Đây là kết quả khi Run!
Bạn cần đăng nhập để thấy hình ảnh


Em cảm ơn AD đã hỗ trợ!
 
Tôi không rõ chủ đề này, nhưng tôi nghĩ vấn đề là ở chỗ code macro của bạn.
Sao bạn không đưa code macro Texstudio của bạn lên xem sao.
Chú ý code phải để trong thẻ code. Hướng dẫn (xem mục 4) :
 

MINH-PHUONG

Yêu THVBA
Tôi không rõ chủ đề này, nhưng tôi nghĩ vấn đề là ở chỗ code macro của bạn.
Sao bạn không đưa code macro Texstudio của bạn lên xem sao.
Chú ý code phải để trong thẻ code. Hướng dẫn (xem mục 4) :
Dạ, nhờ Yukino Ichikawa chỉ em mới biết cách đưa code.
Em cảm ơn Yukino Ichikawa ngen!
Đoạn script em sử dụng!:
%SCRIPT
var arraygt = ["Vẽ đường thẳng","Đường thẳng với [độ dày]"];
choisedialog = new UniversalInputDialog();
choisedialog.setWindowTitle( "Đường thẳng" );
choisedialog.add(arraygt,"Lựa chọn loại đường","choiseGT");
choisedialog.add( true, "Chèn chú thích ", "checkbox" );
thvba: if (choisedialog.exec() != null) {
    if (choisedialog.get("choiseGT") == "Vẽ đường thẳng") {
        cursor.insertLine();
        editor.insertText("\draw (x1,y1) -- (x2,y2);");
break thvba;};
    if (choisedialog.get("choiseGT") == "Đường thẳng với [độ dày]") {
        cursor.insertLine();
        editor.insertText("\draw[line width=1pt] (x1,y1)--(x2,y2);");
        cursor.insertLine();
        editor.insertText("");
break thvba;};
};
 

tuhocvba

Administrator
Thành viên BQT
@MINH-PHUONG Code của bạn chạy trên máy mình không có vấn đề gì nhé.
Bạn cần đăng nhập để thấy đính kèm

Thông tin TexStudio của tôi :
Bạn cần đăng nhập để thấy đính kèm
 

MINH-PHUONG

Yêu THVBA
@MINH-PHUONG Code của bạn chạy trên máy mình không có vấn đề gì nhé.
Bạn cần đăng nhập để thấy đính kèm

Thông tin TexStudio của tôi :
Bạn cần đăng nhập để thấy đính kèm
Dạ em cảm ơn AD, thì em chịu thôi em nghĩ là do phiên bản! Chưa có ảnh hưởng lắm nên thôi em chấp nhận!
 
Top