Tặng các bạn Unicode ListView - chỉ có duy nhất 2 thiết lập mà thôi (9 người xem)

  • Thread starter Thread starter siwtom
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

siwtom

Thành viên gắn bó
Tham gia
19/3/08
Bài viết
2,127
Được thích
4,211
Tiêu đề đúng phải là: "ListView cho tiếng Việt"

Hôm nay lang thang tìm thấy chủ đề mà các bạn phàn nàn rằng ListView không hỗ trợ Unicode
http://www.giaiphapexcel.com/forum/showthread.php?59888-Array-Listview-tốc-độ-kinh-hoàng-(-4s-với
-65500-dòng
-)!!!
Mấy năm trước khi lập trình trong Delphi tôi cũng vấp phải vấn đề này. Thực ra lúc đó tôi quan tâm tới
vấn đề "đa ngôn ngữ" trong phần mềm nên có tìm hiểu về việc hiển thị ngôn ngữ không phải là tiếng Anh,
trong đó có tiếng Việt, trong menu, combobox, checkbox, button, treeview, listview, tabcontrol,
RadioButton, ListBox, PageControl, ToolBar v...v. Và tôi đã tìm ra giải pháp hiển thị tiếng Việt trong
nhiều Control trong đó có ListView.
Hóa ra việc giải quyết cực đơn giản. Có 2 bước:
1. Các bạn thả ListView xuống UserForm --> nhấn vào mục "Font" của ListView --> nhấn vào nút "..." ở
cuối --> trong cửa sổ nhẩy ra ở phần "script" (ở phần dưới của cửa sổ) chọn Vietnamese
Hoặc các bạn trong code thử thiết lập cho ListView là Font.Charset là vietnamese
Public Const VIETNAMESE_CHARSET = 163
ListView1.Font.Charset = VIETNAMESE_CHARSET
2. Khi đã thiết lập charset là vietnamese thi ta phải nhập vào ListView dữ liệu đã được code dùng trang
mã Vietnamse Windows-1258
Tôi tặng luôn các bạn hàm chuyển từ unicode (dựng sẵn và tổ hợp) sang Windows-1258. Không có VNI,
VN3 sang 1258 vì quan điểm của tôi là trong thời đại unicode, đa ngôn ngữ, trao đổi dữ liệu toàn cầu thì
chỉ dùng unicode mà thôi. Không biết nhiều người sống ở thời đại nào mà cứ dùng VNI, VN3 để làm khổ
mình, khổ người. Cài phông chữ VNI, VN3 chỉ để xử lý các tài liệu cũ chứ ai đời ở thế kỷ 21 viết tài liệu
mới mà vẫn dùng VNI, VN3, hoặc các phông chữ đặc thù của tiếng Việt???
Tất cả chỉ cần thế thôi, quá đơn giản phải không?
 

File đính kèm

Lần chỉnh sửa cuối:
Phải chi có một cái source mình cài đặt nó sẽ tự động Add vào System32 luôn, đồng thời nó đăng ký cho mình luôn, khỏi phải thủ công, copy rồi đăng ký, rồi tạo key để không bị thông báo luôn!

Anh muốn copy vào System32

Mã:
Public Sub CopyOCX()
    Dim strPath, strCopy As String
    Dim FS As FileSystemObject
    
    Set FS = CreateObject("Scripting.FileSystemObject")
        strPath = Application.ActiveWorkbook.Path & "\UnicodeFullControl.ocx"
        strCopy = "C:\WINDOWS\system32\" & "UnicodeFullControl.ocx"
    If DoesFileExist(strCopy) Then
        FS.DeleteFile strCopy
    End If
    If DoesFileExist(Application.ActiveWorkbook.Path & "\UnicodeFullControl.ocx") Then
        FS.CopyFile strPath, strCopy
        MsgBox "Copy xong"
    Else
        MsgBox "Khong the copy"
    End If
End Sub

Public Function DoesFileExist(PathName As String) As Boolean
    If Dir$(PathName) <> vbNullString Then
        DoesFileExist = True
    Else
        DoesFileExist = False
    End If
End Function
 
Upvote 0
Anh muốn copy vào System32

Mã:
Public Sub CopyOCX()
    Dim strPath, strCopy As String
    Dim FS As [COLOR=#ff0000]FileSystemObject[/COLOR]
    
    Set FS = CreateObject("Scripting.FileSystemObject")
        strPath = Application.ActiveWorkbook.Path & "\UnicodeFullControl.ocx"
        strCopy = "C:\WINDOWS\system32\" & "UnicodeFullControl.ocx"
    If DoesFileExist(strCopy) Then
        FS.[COLOR=#ff0000]DeleteFile [/COLOR]strCopy
    End If
    If DoesFileExist(Application.ActiveWorkbook.Path & "\UnicodeFullControl.ocx") Then
        FS.CopyFile strPath, strCopy
        MsgBox "Copy xong"
    Else
        MsgBox "Khong the copy"
    End If
End Sub

Public Function DoesFileExist(PathName As String) As Boolean
    If Dir$(PathName) <> vbNullString Then
        DoesFileExist = True
    Else
        DoesFileExist = False
    End If
End Function

Hình như đây là ngôn ngữ của VB6 thì phải, sao tôi chạy trên Excel nó lại báo lỗi! (Runtime Error 70 - Permission Denied)

Còn đăng ký cho nó chắc làm thủ công nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Anh vào tool - Rẻences - chec vào mục Microsoft Scripting runtime
 
Upvote 0
Anh vào tool - Rẻences - chec vào mục Microsoft Scripting runtime

Cũng không cần (mất công)
Thay vì
Dim FS As FileSystemObject
Sửa thành:
Dim FS As Object
là được rồi
------------
Góp ý thêm: Đã dùng đến FileSystemObject thì dùng luôn trong hàm DoesFileExist đi ---> Dùng hàm DIR kể như... uổng công!
Viết 1 hàm là dùng vào nhiều việc (để kiểm tra sự tồn tại của 1 file, bao gồm file viết bằng tiếng Việt có dấu)... Nếu viết hàm chỉ phục vụ cho mỗi việc kiểm tra xem file UnicodeFullControl.ocx có tồn tại hay không thì thật... vô nghĩa
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng không cần (mất công)
Thay vì
Dim FS As FileSystemObject
Sửa thành:
Dim FS As Object
là được rồi
------------
Góp ý thêm: Đã dùng đến FileSystemObject thì dùng luôn trong hàm DoesFileExist đi ---> Dùng hàm DIR kể như... uổng công!
Viết 1 hàm là dùng vào nhiều việc (để kiểm tra sự tồn tại của 1 file, bao gồm file viết bằng tiếng Việt có dấu)... Nếu viết hàm chỉ phục vụ cho mỗi việc kiểm tra xem file UnicodeFullControl.ocx có tồn tại hay không thì thật... vô nghĩa

Em hiểu tại sao bị lỗi rồi, bởi vì mình xài file có sử dụng UFC mà thực hiện thủ tục xóa trên file đó thì nó sẽ báo lỗi (lỗi này là có người đang sử dụng chương trình đó nên không thể xóa).

Với thủ tục của Thuyyeu99 mình nghĩ chỉ cần sửa lại như vầy:

PHP:
Public Sub CopyOCX()
    Dim strPath, strCopy As String
        strPath = "Z:\01_Ket_Toan\TRONG_NGHIA\UFC\UnicodeFullControl.ocx"
        strCopy = "C:\WINDOWS\system32\UnicodeFullControl.ocx"
    
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(strPath) Then
            If .FileExists(strCopy) = False Then
                .CopyFile strPath, strCopy
            End If
        End If
    End With
End Sub
 
Upvote 0
Sửa lại Sub Copy thế này:
PHP:
Public Sub CopyOCX()
  Dim strPath As String, strCopy As String
  strPath = ThisWorkbook.Path & "\UnicodeFullControl.ocx"
  strCopy = "C:\WINDOWS\system32\" & "UnicodeFullControl.ocx"
  With CreateObject("Scripting.FileSystemObject")
    If .FileExists(strCopy) Then .DeleteFile strCopy
    If .FileExists(strPath) Then
      .CopyFile strPath, strCopy
       MsgBox "Copy xong"
    Else
      MsgBox "Khong the copy"
    End If
  End With
End Sub
Nhưng e rằng cũng còn gặp khó khăn trên hệ thống Windows 7 về vấn đề UAC (nó sẽ cóc cho xóa hoặc copy file trong thư mục System32) ---> Ai dùng Windows 7 thử xem
 
Upvote 0
Sửa lại Sub Copy thế này:

Nhưng e rằng cũng còn gặp khó khăn trên hệ thống Windows 7 về vấn đề UAC (nó sẽ cóc cho xóa hoặc copy file trong thư mục System32) ---> Ai dùng Windows 7 thử xem

Nếu như đã copy, theo hướng dẫn dưới đây, thì đăng ký cho nó bằng code luôn phải làm sao ạ?

Đối với UFC, bạn không cần cài đặt. Nhưng bạn cần phải đăng ký nó với hệ thống mà bạn đang dùng. Cách đăng ký như sau :
Đối với Windows 2000, XP, 2003
- Sau khi đã chép vào thư mục System32 (hay bất kỳ thư mục nào cũng được) bạn cần phải Register nó.Mở Menu Start -> Run và gỏ vào "Regsvr32 " và tên đường dẩn của file ocx. Ví dụ tôi chép UnicodeFullcontrols.ocx vào thư mục "C:\WINDOWS\system32" thì tôi sẽ gỏ vào hộp Run như sau :
Regsvr32 "C:\WINDOWS\system32\UnicodeFullcontrols.ocx"
Sau khi đăng ký file OCX, bạn phải đăng ký tiếp file "Proptool.dll". Cách đăng ký cũng y như OCX.
Đối với Windows Vista
Đối với Windows Vista hay Seven thì bạn phải tắt User Account Control (UAC) trước rồi mới đăng ký với hệ thống được. Các tắt UAC như sau :
- Vào Control Panel : chọn "User Account And Family Safety" -> "User Account"
- Và chọn dòng dưới cùng : bấm vào "Turn User Account Control on or off", sau đó bạn bỏ check ở dòng "Use User Account Control (UAC) to help protect your computer.Cuối cùng là đăng ký như Windows XP.
Đối với Windows Seven (Windows 7)
Đối với Windows Vista hay Seven thì bạn phải tắt User Account Control (UAC) trước rồi mới đăng ký với hệ thống được. Các tắt UAC như sau :
- Vào Control Panel : chọn "User Account And Family Safety" -> "User Account" và chọn vào "Change User Account Control Setting"
- Sau đó kéo thanh Slide xuống mức thấp nhất (Never Notify). Cuối cùng là đăng ký như Windows XP.
Add vào Project
Vào dự án (Project) của mình và chọn Menu "Project"->"Component...", và tìm Unicode Full Controls ... và Check vào nó -> Bấm OK.

Designed By Dương Quốc Hưng
 
Upvote 0
Khi làm ứng dụng mà có sử dụng các thư việc, ActiveX Controls thì nên làm bộ cài đặt để đăng ký Registry, thiết lập hay can thiệp vào HĐH. Khi cài đặt buộc user phải đang đăng nhập account admin, khi cài xong rồi thì các loại account cũng có thê sử dụng được ứng dụng. Nếu không làm bộ cài đặt thì e rằng chỉ tác giả dùng thì mới thấy tiện. Việc viết code trong ứng dụng để cài đặt các thư việc là không khả thi!
 
Lần chỉnh sửa cuối:
Upvote 0
Khi làm ứng dụng mà có sử dụng các thư việc, ActiveX Controls thì nên làm bộ cài đặt để đăng ký Registry, thiết lập hay can thiệp vào HĐH. Khi cài đặt buộc user phải đang đăng nhập account admin, khi cài xong rồi thì các loại account cũng có thê sử dụng được ứng dụng. Nếu không làm bộ cài đặt thì e rằng chỉ tác giả dùng thì mới thấy tiện. Việc viết code trong ứng dụng để cài đặt các thư việc là không khả thi!


Thì ý em cũng muốn vậy, tức là thư viện nguồn (dll, ocx) đã có sẳn, nhưng nếu ai đó đóng gói nó thành cái source và khi install nó tự cài đặt cũng như đăng ký luôn thì sẽ tiện hơn. VẤN ĐỀ LÀ LÀM SAO ĐÓNG GÓI THÌ EM HOÀN TOÀN MÙ TỊT.
 
Upvote 0
Cái code copy của em em dùng để Backcup du liệu thôi chứ không phải dùng để copy OCX đâu.

Cái Ocx này của anh hưng chủ yếu dùng cho vb6 là chính nên có 1 số control không chạy được trong vba, còn cái BSAC của anh Tuân hỗ trợ hoàn toàn VBA }}}}}}}}}}}}}}}.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì ý em cũng muốn vậy, tức là thư viện nguồn (dll, ocx) đã có sẳn, nhưng nếu ai đó đóng gói nó thành cái source và khi install nó tự cài đặt cũng như đăng ký luôn thì sẽ tiện hơn. VẤN ĐỀ LÀ LÀM SAO ĐÓNG GÓI THÌ EM HOÀN TOÀN MÙ TỊT.

Các phần mềm mình làm đều dùng InnoSetup để tạo bộ cài đặt.
Địa chỉ download:
http://www.jrsoftware.org/isinfo.php

Khi tạo bộ cài cứ tạo theo "Wizard" là được. Việc tác động vào Registry và đăng ký HĐH rất dễ dàng. Cao cấp hơn nữa mới phải viết script (ngôn ngữ Pascal).

Xem hướng dẫn trên Youtube
[video=youtube;wP9HcD4oPDw]http://www.youtube.com/watch?v=wP9HcD4oPDw[/video]
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom