Tặng các bạn Unicode ListView - chỉ có duy nhất 2 thiết lập mà thôi (3 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:
Thú thật xem mấy bài về LV này học thêm nhiều điều, nhưng không phải học để làm LV.
Muốn đưa dữ liệu lên LV mà phải for i và convert font nữa thì tôi dùng cái khác cho khỏe. Đẹp hơn 1 chút mà chậm hơn thì suy nghĩ lại.
Cám ơn Nghĩa và các bạn nhiều.

Đồng ý!
Nói thiệt tôi cũng chẳng khoái cái Listview gì mấy
Thiếu gì control khác hổ trợ Unicode hoàn toàn, chẳng việc gì phải cực thân (trừ trường hợp bất khả kháng)
 
Upvote 0
Đồng ý!
Nói thiệt tôi cũng chẳng khoái cái Listview gì mấy
Thiếu gì control khác hổ trợ Unicode hoàn toàn, chẳng việc gì phải cực thân (trừ trường hợp bất khả kháng)

Tôi đồng ý với bạn là nếu ta không giải quyết được vấn đề hiển thị tiếng Việt trên ListView thì ta dùng control khác. Lựa chọn tùy mỗi người. Nhưng tôi thấy bạn khẳng định

- Việc convert để hiển thị tiếng Việt trên Listview đã được bàn và làm từ lâu trên diễn đàn rồi, có điều là convert sang VNI
nên muốn học hỏi.
Như vậy việc hiển thị TV cho ListView đã được bàn, đã được giải quyết cho VNI. Tôi muốn thử xem với VNI thế nào nên làm một ví dụ. Không biết tôi làm sai ở khâu nào mà tôi không hiển thị được TV. code chỉ làm mỗi việc nhập text vào ListView vì text đã là VNI-Windows rồi. Hay tôi còn phải convert như thế nào nữa? Chả nhẽ viết hàm convert VNItoVNI?
 

File đính kèm

Upvote 0
nên muốn học hỏi.
Như vậy việc hiển thị TV cho ListView đã được bàn, đã được giải quyết cho VNI. Tôi muốn thử xem với VNI thế nào nên làm một ví dụ. Không biết tôi làm sai ở khâu nào mà tôi không hiển thị được TV. code chỉ làm mỗi việc nhập text vào ListView vì text đã là VNI-Windows rồi. Hay tôi còn phải convert như thế nào nữa? Chả nhẽ viết hàm convert VNItoVNI?

Chỉ cần đổi Script trong hộp thoại FONT (bấm từ property Font ) của Listview thành Turkish là được -
Font VNI-Time chỉ có 2 loại European Central và Turkish.
 
Upvote 0
Chỉ cần đổi Script trong hộp thoại FONT (bấm từ property Font ) của Listview thành Turkish là được -
Font VNI-Time chỉ có 2 loại European Central và Turkish.

Tôi có cảm giác là mọi người trên GPE không kiểm tra lại nhưng mỗi phát biểu đều như đinh đóng cột. Tôi trước khi trả lời hoặc hỏi trong tất cả các bài viết tôi đều kiểm tra.
Của tôi ngoài European Central và Turkish còn có Western. Tôi đã kiểm tra hết cả 3 trước khi hỏi.
 
Upvote 0
Như vậy việc hiển thị TV cho ListView đã được bàn, đã được giải quyết cho VNI. Tôi muốn thử xem với VNI thế nào nên làm một ví dụ. Không biết tôi làm sai ở khâu nào mà tôi không hiển thị được TV. code chỉ làm mỗi việc nhập text vào ListView vì text đã là VNI-Windows rồi. Hay tôi còn phải convert như thế nào nữa? Chả nhẽ viết hàm convert VNItoVNI?
Bạn đã convert Unicode sang VNI, thế sao không chỉnh Font Property của Listview sang VNI-Times? Đặt font = Arial thì thế quái nào mà hiển thị được chứ

Capture.JPG
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
@switorm: sorry, NHƯNG tôi đã test trước khi post bài ở máy tôi với Win7 Excel 2010 thì đổi sang script Turkish thì hiển thị được tiếng việt font VNI-Times (để ở European Central thì không), tôi nhầm đúng là còn dạng script nữa Western với font VNI-Times (tối khuya không để ý kéo lên trên , nghĩ là có 2 thôi)
 
Lần chỉnh sửa cuối:
Upvote 0

@switorm:
sorry, NHƯNG tôi đã test trước khi post bài ở máy tôi với Win7 Excel 2010 thì đổi sang script Turkish thì hiển thị được tiếng việt font VNI-Times (để ở European Central thì không), tôi nhầm đúng là còn dạng script nữa Western với font VNI-Times (tối khuya không để ý kéo lên trên , nghĩ là có 2 thôi)

Nếu thế thì hơi lạ rồi. Máy tôi là XP SP2 + Excel 2007. Tôi chọn lần lượt cả 3 charset nhưng text trong ListView vẫn thế. Tôi còn đọc ra ListView1.Font. Charset thì thấy chúng đúng cả, tức vd. nếu chọn Turkish thì sau đó code đọc ra là ListView1.Font. Charset = 162
 
Upvote 0
Mỗi người, mỗi điều kiện có cách nhìn nhận khác nhau. Riêng mình lại rất thích sử dụng Listview. Để hiển thị dữ liệu với số lượng lớn khá nhanh, việc load nó có vẻ nhanh hơn 1 số Controls khác. Nó không bị các thông báo linh tinh khi sử dụng. Hình thức nó hỗ trợ trình bày tốt hơn Listbox, Combobox v.v....Nhưng hạn chế của nó là hiển thị tiếng Việt Unicode. Mình thấy nó hiển thị tiếng Việt font TCVN3 khá tốt. Mình viết 1 hàm nhỏ mô phỏng theo hàm của Thày Phạm Duy Long và sử dụng thấy cũng ổn, tuy nhiên nó lại làm chậm hơn 1 chút 1 load data lên Listview. Với lượng dữ liệu vừa phải thì cũng khó mà phân biệt được.

Rất mong nhận được ý kiến phân tích hướng dẫn để có thêm 1 công cụ trình bày form ưa thích, tiện lợi để anh em học hỏi thêm.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mỗi người, mỗi điều kiện có cách nhìn nhận khác nhau. Riêng mình lại rất thích sử dụng Listview. Để hiển thị dữ liệu với số lượng lớn khá nhanh, việc load nó có vẻ nhanh hơn 1 số Controls khác. Nó không bị các thông báo linh tinh khi sử dụng. Hình thức nó hỗ trợ trình bày tốt hơn Listbox, Combobox v.v....Nhưng hạn chế của nó là hiển thị tiếng Việt Unicode. Mình thấy nó hiển thị tiếng Việt font TCVN3 khá tốt. Mình viết 1 hàm nhỏ mô phỏng theo hàm của Thày Phạm Duy Long và sử dụng thấy cũng ổn, tuy nhiên nó lại làm chậm hơn 1 chút 1 load data lên Listview. Với lượng dữ liệu vừa phải thì cũng khó mà phân biệt được.

Rất mong nhận được ý kiến phân tích hướng dẫn để có thêm 1 công cụ trình bày form ưa thích, tiện lợi để anh em học hỏi thêm.

Vấn đề tôi quan tâm ở đây là ListView hiển thị trong XP thế nào. Tôi không xét Win7 vì nó vượt trội XP rồi, nếu không thì nó đã không có tên mới.
Nếu bạn nào có XP thì kiểm tra hộ. Chả nhẽ chỉ có riêng XP của tôi hiển thị không đúng?
Tôi nghĩ Grid và ListView là 2 control khác nhau, có những chức năng khác nhau. Nếu cứ thấy ListView chưa hiển thị đúng thì tìm tòi xem liệu có giải pháp không chứ đầu hàng luôn rồi dùng control khác thì hơi "sớm". Rồi nếu thấy TreeView cũng chưa theo ý mình thì cũng đầu hàng rồi kiếm "đồ" khác thay thế? Chuyện thay đổi các thiết lập để chuẩn hơn cho mỗi người cụ thể là chuyện bình thường, nếu không thì Windows "cung cấp" cho người dùng Control Panel để làm gì?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Hàm chuyển font từ UNI, VNI sang Vietnamese 1258 và ngược lại.

Tôi thấy nếu cài đặt như siwtom và chạy trên ListView mã Vietnamese 1258 cũng rất hay. Tôi cải tiến hàm chuyển font từ Unicode dựng sẳn và VNI chuyển qua Vietnamese 1258 và chuyển qua lại giữa các mã với nhau. Riêng mã Unicode tổ hợp và mã TCVN tôi không thực hiện được do bộ gõ không chuẩn, tự động chuyển mã về Uicode hoặc về Vietnamese nên tôi không có bộ mã cho nó một cách chính xác, có lẽ tôi sẽ cải tiến sau.

Hàm chuyển mã:
Mã:
Function FontConverter(ByVal SourceText As String, ByVal SourceCode As Byte, ByVal TargetCode As Byte) As String
[COLOR=#006400]    'SourceCode: SelectCase: 1 (Unicode), 2 (VNI Windows),[B] 3 (Vietnamese1258)[/B]
    'TargetCode: SelectCase: 1 (Unicode), 2 (VNI Windows), [B]3 (Vietnamese1258)[/B], 4 (Alphabet-NonDiacritic (Ky tu khong dau))[/COLOR]
    Dim ArrUNI As Variant, ArrVNI As Variant, ArrVN1258 As Variant, ArrALPHA As Variant
    Dim TransChar As String, inString1 As String, inString2 As String
    Dim i As Long, j As Long, Ch2b As Boolean
    
    ArrUNI = Array(225, 224, 7843, 227, 7841, 226, 7845, 7847, 7849, 7851, 7853, 259, 7855, 7857, 7859, 7861, 7863, 273, 233, _
                    232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, _
                    7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, 432, _
                    7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 193, 192, 7842, 195, 7840, 194, 7844, 7846, 7848, _
                    7850, 7852, 258, 7854, 7856, 7858, 7860, 7862, 272, 201, 200, 7866, 7868, 7864, 202, 7870, 7872, 7874, 7876, _
                    7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, 212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, _
                    7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, 7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924)
    
    ArrVNI = Array("aù", "aø", "aû", "aõ", "aï", "aâ", "aá", "aà", "aå", "aã", "aä", "aê", "aé", "aè", "aú", "aü", "aë", "ñ", "eù", _
                    "eø", "eû", "eõ", "eï", "eâ", "eá", "eà", "eå", "eã", "eä", "í", "ì", "æ", "ó", "ò", "où", "oø", "oû", "oõ", "oï", _
                    "oâ", "oá", "oà", "oå", "oã", "oä", "ô", "ôù", "ôø", "ôû", "ôõ", "ôï", "uù", "uø", "uû", "uõ", "uï", "ö", "öù", _
                    "öø", "öû", "öõ", "öï", "yù", "yø", "yû", "yõ", "î", "AÙ", "AØ", "AÛ", "AÕ", "AÏ", "AÂ", "AÁ", "AÀ", "AÅ", "AÃ", _
                    "AÄ", "AÊ", "AÉ", "AÈ", "AÚ", "AÜ", "AË", "Ñ", "EÙ", "EØ", "EÛ", "EÕ", "EÏ", "EÂ", "EÁ", "EÀ", "EÅ", "EÃ", "EÄ", _
                    "Í", "Ì", "Æ", "Ó", "Ò", "OÙ", "OØ", "OÛ", "OÕ", "OÏ", "OÂ", "OÁ", "OÀ", "OÅ", "OÃ", "OÄ", "Ô", "ÔÙ", "ÔØ", "ÔÛ", _
                    "ÔÕ", "ÔÏ", "UÙ", "UØ", "UÛ", "UÕ", "UÏ", "Ö", "ÖÙ", "ÖØ", "ÖÛ", "ÖÕ", "ÖÏ", "YÙ", "YØ", "YÛ", "YÕ", "Î")
    
    [B][COLOR=#0000cd]ArrVN1258 = Array("aì", "aÌ", "aÒ", "aÞ", "aò", "â", "âì", "âÌ", "âÒ", "âÞ", "âò", "ã", "ãì", "ãÌ", "ãÒ", "ãÞ", "ãò", "ð", "eì", _
                    "eÌ", "eÒ", "eÞ", "eò", "ê", "êì", "êÌ", "êÒ", "êÞ", "êò", "iì", "iÌ", "iÒ", "iÞ", "iò", "oì", "oÌ", "oÒ", "oÞ", _
                    "oò", "ô", "ôì", "ôÌ", "ôÒ", "ôÞ", "ôò", "õ", "õì", "õÌ", "õÒ", "õÞ", "õò", "uì", "uÌ", "uÒ", "uÞ", "uò", "ý", "ýì", _
                    "ýÌ", "ýÒ", "ýÞ", "ýò", "yì", "yÌ", "yÒ", "yÞ", "yò", "Aì", "AÌ", "AÒ", "AÞ", "Aò", "Â", "Âì", "ÂÌ", "ÂÒ", "ÂÞ", _
                    "Âò", "Ã", "Ãì", "ÃÌ", "ÃÒ", "ÃÞ", "Ãò", "Ð", "Eì", "EÌ", "EÒ", "EÞ", "Eò", "Ê", "Êì", "ÊÌ", "ÊÒ", "ÊÞ", "Êò", _
                    "Iì", "IÌ", "IÒ", "IÞ", "Iò", "Oì", "OÌ", "OÒ", "OÞ", "Oò", "Ô", "Ôì", "ÔÌ", "ÔÒ", "ÔÞ", "Ôò", "Õ", "Õì", "ÕÌ", _
                    "ÕÒ", "ÕÞ", "Õò", "Uì", "UÌ", "UÒ", "UÞ", "Uò", "Ý", "Ýì", "ÝÌ", "ÝÒ", "ÝÞ", "Ýò", "Yì", "YÌ", "YÒ", "YÞ", "Yò")[/COLOR][/B]
    
    ArrALPHA = Array("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "d", "e", "e", "e", "e", "e", _
                    "e", "e", "e", "e", "e", "e", "i", "i", "i", "i", "i", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", _
                    "o", "o", "o", "o", "o", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "y", "y", "y", "y", "y", "A", "A", _
                    "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "D", "E", "E", "E", "E", "E", "E", "E", _
                    "E", "E", "E", "E", "I", "I", "I", "I", "I", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", _
                    "O", "O", "O", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "Y", "Y", "Y", "Y", "Y")
    
    If SourceCode = TargetCode Then FontConverter = SourceText: Exit Function
    TransChar = SourceText
    Select Case SourceCode
        Case 1
            For i = 1 To Len(TransChar)
                inString1 = Mid(TransChar, i, 1)
                If AscW(inString1) >= 192 Then
                    For j = 0 To UBound(ArrUNI)
                        If AscW(inString1) = ArrUNI(j) Then
                            Select Case TargetCode
                                Case 2: inString1 = ArrVNI(j)
                                Case 3: inString1 = ArrVN1258(j)
                                Case 4: inString1 = ArrALPHA(j)
                                Case Else: GoTo CaseElse
                            End Select
                            Exit For
                        End If
                    Next
                End If
                FontConverter = FontConverter + inString1
            Next
        Case 2
            For i = 1 To Len(TransChar)
                Ch2b = False
                If i < Len(TransChar) Then
                    inString2 = Mid(TransChar, i + 1, 1)
                    If inString2 Like "[ùøûõïâáàåãäêéèúüë]" = True _
                    Or inString2 Like "[ÙØÛÕÏÂÁÀÅÃÄÊÉÈÚÜË]" = True Then
                        Ch2b = True
                    End If
                End If
                inString1 = Mid(TransChar, i, IIf(Ch2b, 2, 1))
                For j = 0 To UBound(ArrVNI)
                    If inString1 = ArrVNI(j) Then
                        Select Case TargetCode
                            Case 1: inString1 = ChrW(ArrUNI(j))
                            Case 3: inString1 = ArrVN1258(j)
                            Case 4: inString1 = ArrALPHA(j)
                            Case Else: GoTo CaseElse
                        End Select
                        Exit For
                    End If
                Next
                FontConverter = FontConverter + inString1
                If Len(TransChar) > 2 And Ch2b = True Then
                    i = i + 1
                ElseIf Len(TransChar) = 2 And Ch2b = True Then
                    Exit Function
                End If
            Next
[COLOR=#0000cd][B]        Case 3
            For i = 1 To Len(TransChar)
                Ch2b = False
                If i < Len(TransChar) Then
                    inString2 = Mid(TransChar, i + 1, 1)
                    If inString2 Like "[ìÌÒÞò]" = True Then
                        Ch2b = True
                    End If
                End If
                inString1 = Mid(TransChar, i, IIf(Ch2b, 2, 1))
                For j = 0 To UBound(ArrVN1258)
                    If inString1 = ArrVN1258(j) Then
                        Select Case TargetCode
                            Case 1: inString1 = ChrW(ArrUNI(j))
                            Case 2: inString1 = ArrVNI(j)
                            Case 4: inString1 = ArrALPHA(j)
                            Case Else: GoTo CaseElse
                        End Select
                        Exit For
                    End If
                Next[/B][/COLOR]
                FontConverter = FontConverter + inString1
                If Len(TransChar) > 2 And Ch2b = True Then
                    i = i + 1
                ElseIf Len(TransChar) = 2 And Ch2b = True Then
                    Exit Function
                End If
            Next
        Case Else
CaseElse:
        FontConverter = "#N/A"
    End Select
    Erase ArrUNI, ArrVNI, ArrVN1258, ArrALPHA
End Function

Các bạn xem file nhé!
 

File đính kèm

Upvote 0
Để Excel tắt cảnh báo
1/Vào key: HKEY_CURRENT_USER \Software\Microsoft\Office\Common
nhấp phải chọn new – DWORD value – đặt tên là UFIControls – mở ra và chọn Value data là 1

2/ tiếp tục vào khóa : HKEY_CURRENT_USER \Software\Microsoft\VBA\Security
nhấp phải chọn new – DWORD value – đặt tên là LoadControlsInForms – mở ra và chọn Value data là 1

Nếu không có khóa Security thì tạo mới rồi đặt tên là Security
 
Upvote 0
Để Excel tắt cảnh báo
1/Vào key: HKEY_CURRENT_USER \Software\Microsoft\Office\Common
nhấp phải chọn new – DWORD value – đặt tên là UFIControls – mở ra và chọn Value data là 1

2/ tiếp tục vào khóa : HKEY_CURRENT_USER \Software\Microsoft\VBA\Security
nhấp phải chọn new – DWORD value – đặt tên là LoadControlsInForms – mở ra và chọn Value data là 1

Nếu không có khóa Security thì tạo mới rồi đặt tên là Security

Tôi không rành về lập trình nên cho tôi hỏi bạn, để "vào key" thì phải gõ ở đâu? Trong Address, trong Search hay trong Run vậy bạn?

==========================

ĐÃ BIẾT CÁCH ĐĂNG KÝ.
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy bộ Control của anh hưng bên câu lạc bộ VB. Cái control Listview unicode sử dụng được trong Excel. Nếu ai muốn tham khảo qua bên đây caulacbovb dơnload về
http://www.caulacbovb.com/forum/viewtopic.php?f=36&t=8746&start=20



Nhìn trên hình thấy đâu có giống font Unicode nhỉ? Có vẻ như là font VNI thì phải
Vậy nếu đoán không lầm là người ta lại chơi trờ chuyển font, xong mới đặt vào ListView ---> Chuyện quá thường!
 
Upvote 0
Nhìn trên hình thấy đâu có giống font Unicode nhỉ? Có vẻ như là font VNI thì phải
Vậy nếu đoán không lầm là người ta lại chơi trờ chuyển font, xong mới đặt vào ListView ---> Chuyện quá thường!

Đúng vậy! Nó cũng convert font như mình thôi, hãy nhìn code:

Mã:
Private Sub UserForm_Initialize()
    Dim i As Integer
    With UniListView1
        'Thêm 3 c?t vào Listview
        For i = 0 To 19
            .ColumnAdd i, [COLOR=#ff0000][B]UnicodeText[/B][/COLOR]("Co65t thu71 " & 1 + i), 120
        Next
        'Thêm 50 m?u tin (vào m?i c?t)
        For i = 0 To 49
            .ItemAdd i, "Item" & i
            For j = 1 To 19
                .SubItemSet i + 1, j, [B][COLOR=#ff0000]UnicodeText[/COLOR][/B]("Ma64u tin ") & i, 0
            Next
        Next i
    End With
End Sub


Cho nên đằng nào cũng là chuyển font vả lại tải về sẽ lại cài đặt.
 
Upvote 0
Sau khi tải về và chạy thử thì có các vấn đề sau:

Ưu điểm:

- Sử dụng thoải mái với UNICODE (không cần convert như bài trước mình viết)

- Có nhiều tính năng trong Properties (hơi khác so với ListView thường).

- Code cũng đơn giản:

PHP:
Private Sub UserForm_Initialize()
    Dim i As Integer, j As Integer, Arr
    With UniListView1
        For i = 0 To 5
            .ColumnAdd i, Sheet1.Cells(1, i + 1), 220
        Next
        
        Arr = Sheet1.Range("A2:F26").Value
        For i = 0 To UBound(Arr, 1) - 1
            .ItemAdd i, Arr(i + 1, 1)
            For j = 1 To UBound(Arr, 2) - 1
                .SubItemSet i + 1, j, Arr(i + 1, j + 1), 0
            Next
        Next
    End With
End Sub


Nhược điểm:

- Sẽ nổi lên câu thông báo như Thuyyeu99 đã nêu.

- Mình thử cả 2 máy WinXP đều không thấy thanh trượt (scroll) như ListView thường.
(Đã tìm ra nguyên nhân, phải chọn Style = CurrentTheme thì nó mới ra scrollbar)
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    71.5 KB · Đọc: 42
  • Test.xls
    Test.xls
    31.5 KB · Đọc: 69
Lần chỉnh sửa cuối:
Upvote 0
Nhìn trên hình thấy đâu có giống font Unicode nhỉ? Có vẻ như là font VNI thì phải
Vậy nếu đoán không lầm là người ta lại chơi trờ chuyển font, xong mới đặt vào ListView ---> Chuyện quá thường!

Cái LV ở dưới là cái LV chuẩn của Excel em dủng Fon ABC còn cái trên là mới là Unilistview dùng Font tahoma
 
Upvote 0
Cái LV ở dưới là cái LV chuẩn của Excel em dủng Fon ABC còn cái trên là mới là Unilistview dùng Font tahoma

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!
 
Upvote 0
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!


Có "đồ nghề" đây:
Mã:
Option Explicit
Private Const lngRegKey1ROOT = &H80000001   ' HKEY_CURRENT_USER
Private Const strRegKey1Name = "Software\Microsoft\Office\Common"
Private Const strRegKey2Name = "Software\Microsoft\VBA\Security"
Private Const lngKey1DataType = 4   '"REG_DWORD"
Private Const lngKey2DataType = 4   '"REG_DWORD"
Private Const strKey1ValueName = "UFIControls"
Private Const strKey2ValueName = "LoadControlsInForms"
Private Const KEY_ALL_ACCESS = &H2003F
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" ( _
                                      ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
                                      ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" ( _
                                      ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" ( _
                                       ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
                                       ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" ( _
                                        ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Sub SetKeyDataValue(RegKeyRoot As Long, RegKeyName As String, KeyDataType As Long, KeyValueName As String, KeyValueDate As Variant)
    Dim OpenKey As Long, SetValue As Long, hKey As Long
    OpenKey = RegOpenKeyEx(RegKeyRoot, RegKeyName, 0, KEY_ALL_ACCESS, hKey)
    If (OpenKey <> 0) Then
        Call RegCreateKey(RegKeyRoot, RegKeyName, hKey)
    End If
    Select Case KeyDataType
    Case 1:
        SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
    Case 3:
        SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
    Case 4:
        SetValue = RegSetValueEx(hKey, KeyValueName, 0&, KeyDataType, CLng(KeyValueDate), 4)
    End Select
    SetValue = RegCloseKey(hKey)
End Sub
Public Sub DeleteRegValue(RegKeyRoot As Long, RegKeyName As String, KeyValueName As String)
    Dim DeleteKeyValue As Long, hKey As Long
    DeleteKeyValue = RegOpenKeyEx(RegKeyRoot, RegKeyName, 0, KEY_ALL_ACCESS, hKey)
    DeleteKeyValue = RegDeleteValue(hKey, KeyValueName)
End Sub

Muốn tạo hai giá trị trên:

Mã:
Public Sub addReg()     
    Call SetKeyDataValue(lngRegKey1ROOT, strRegKey1Name, lngKey1DataType, strKey1ValueName, 1)
    Call SetKeyDataValue(lngRegKey1ROOT, strRegKey2Name, lngKey2DataType, strKey2ValueName, 1)
End Sub

Muốn xóa đi:
Mã:
Public Sub xoavalue()
    DeleteRegValue lngRegKey1ROOT, strRegKey1Name, strKey1ValueName
    DeleteRegValue lngRegKey1ROOT, strRegKey2Name, strKey2ValueName
End Sub

Nếu chưa có key Common hoặc Security thì nó sẽ tự tạo ra nhưng phải khởi động lại máy mới thấy.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách cài đặt UnicodeFullControls (UFC):

- Đố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

Với các file DLL và OCX có sẳn, mình có code nào để cài đặt (chuyển nó vào thư mục) và đăng ký chúng hay không?
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom