Tặng các bạn Unicode ListView - chỉ có duy nhất 2 thiết lập mà thôi (1 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:
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

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?
Không ngờ nó lại đơn giản thế nhỉ?
Cảm ơn bạn! Đã thử nghiệm trên Win7, Office 2010 thành công
-------------------------
Không biết việc hiển thị tiếng Việt trên Caption của UserForm có đơn giản vậy không ta?
 
Upvote 0
Không ngờ nó lại đơn giản thế nhỉ?
Cảm ơn bạn! Đã thử nghiệm trên Win7, Office 2010 thành công
-------------------------
Không biết việc hiển thị tiếng Việt trên Caption của UserForm có đơn giản vậy không ta?
Tôi không nhớ rõ đã thử Caption chưa nhưng chắc có ...
Font mà bạn có thể thiết lập trong UserForm (hay Form trong Delphi) là thiết lập cho client area, tức toàn
bộ vùng Form mà bạn làm việc, thả các control. Còn thanh tiêu đề cửa sổ thuộc nonclient area. Mọi thiết
lập font cho thanh tiêu đề là thiết lập cho system, nó có hiệu lực trong toàn Windows, trong tất cả các cửa
sổ, còn thiết lập cho UserForm, ListView là thiết lập cho phần mềm của mình mà thôi. Làm thế nào để
thiết lập cho thanh tiêu đề? Thậm chí Charset có muốn cũng không thiết lập được "bằng tay". Phải dùng
code và gọi các hàm: SystemParametersInfo + SPI_GETNONCLIENTMETRICS (đọc thông tin
lfCaptionFont là cấu trúc LOGFONT), sửa cấu trúc LOGFONT (trường lfCharSet, tất nhiên phải thay cả
font sang unicode), SystemParametersInfo + SPI_SETNONCLIENTMETRICS (thiết lập mới)
Nhưng có làm được thì cũng có nghĩa là bắt buộc các cửa sổ khác phải theo, xâm phạm vào quyền
quyết đnh của người dùng. Vậy nếu người dùng muốn thì tự đổi phông chữ hệ thống cho thanh tiêu đề
cửa sổ sang phông chữ unicode (với phông chữ mặc định MS Sans Serif của system thì cũng chả có
script nào khác ngoài Trung Âu). Lúc đó thì đơn giản: chỉ cần gọi hàm DefWindowProcW để thiết lập
Caption cho cửa sổ của mình, vd.:
Mã:
Public Declare Function DefWindowProcW Lib "user32" (ByVal hwnd As Long, ByVal wMsg As Long, 
ByVal wParam As Long, ByVal lParam As Long) As Long
Function GetWindowHandle(ByVal frm As UserForm) As Long
    If Val(Application.Version) < 9 Then
        GetWindowHandle = FindWindow("ThunderXFrame", frm.caption)  'XL97
    Else
        GetWindowHandle = FindWindow("ThunderDFrame", frm.caption)  'XL2000+
    End If
End Function
DefWindowProcW GetWindowHandle(Me), WM_SETTEXT, 0, _
        StrPtr(ThisWorkbook.Sheets("DATA").Range("A19").Value)
 
Lần chỉnh sửa cuối:
Upvote 0
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
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?
Như nghiên cứu của tôi (các tên Control là của Delphi - có T ở đầu) với 2 động tác như cho ListView thì:
1. Hiển thị đúng cho: TBitBtn, TComboBox, TMemo, TEdit, TStatusBar, TLabel, TGroupBox (Caption),
TRadioGroup (Caption), TSpeedButton, TStringGrid, TDrawGrid, TListView, TTreeView,
THeaderControl, TTabSet, TOutline, THeader.
2. không hiển thị đúng cho: TMainMenu, TPopupMenu, TButton, TCheckBox, TRadioButton, TListBox,
TCheckListBox, TStaticText, TTabbedNotebook, TTabControl, TPageControl, TToolBar.
3. Với TTabControl, TPageControl thì gỡ rối đơn giản: thiết lập OwnerDraw = TRUE rồi tự vẽ chữ
 
Lần chỉnh sửa cuối:
Upvote 0
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

Rất cám ơn bạn chia sẽ, tuy nhiên, vì là Unicode tổ hợp nên khi hiển thị trên Listview nó không đẹp là điều thứ nhất, thứ 2 là khi chuyển từ Listview xuống sheet thì font chữ không được như ban đầu, tức là nếu như tôi ghi Hoàng Trọng Nghĩa thì khi chuyển xuống sheet nó trở thành: HoaÌng Troòng NghiÞa. Như vậy nó cũng có gì đó không ổn.

Nó cũng là một dạng convert từ Uni sang Vni khi chuyển xuống cũng phải convert lại chăng?

Xem hình để thấy dấu của Unicod dựng sẳn (sheet) và Unicode tổ hợp (Listview) nó đặt dấu không đúng vị trí từ, và khi nó từ Listview nhập lại sheet nó hiển thị không còn là Unicode nữa!
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    73 KB · Đọc: 609
Lần chỉnh sửa cuối:
Upvote 0
Rất cám ơn bạn chia sẽ, tuy nhiên, vì là Unicode tổ hợp nên khi
hiển thị trên Listview nó không đẹp là điều thứ nhất, thứ 2 là khi chuyển từ Listview xuống sheet thì font
chữ không được như ban đầu, tức là nếu như tôi ghi Hoàng Trọng Nghĩa thì khi chuyển xuống sheet nó
trở thành: HoaÌng Troòng NghiÞa. Như vậy nó cũng có gì đó không ổn.
Nó cũng là một dạng convert từ Uni sang Vni khi chuyển xuống cũng phải convert lại chăng?
Xem hình để thấy dấu của Unicod dựng sẳn (sheet) và Unicode tổ hợp (Listview) nó đặt dấu không đúng
vị trí từ, và khi nó từ Listview nhập lại sheet nó hiển thị không còn là Unicode nữa!
Tôi viết: "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ức ta "nhồi" vào ListView dữ liệu được mã bằng windows-1258.
Khi bạn đọc từ ListView ra thì dĩ nhiên dữ liệu đọc ra cũng là windows-1258. ListView có "biết" làm cái
việc convert đâu? Mà có biết làm (cứ cho là thế) thì nó đâu biết là phải làm mà không phải là để nguyên?
Tóm lại để có dữ liệu unicode thì lại phải convert
Còn chuyện phông chữ thì chúng khác nhau. Bạn cố tình chọn phông chữ xấu rồi lại kêu ca. Tôi luôn dùng
"Arial" hoặc "Time ..." thôi.
Ở ảnh dưới tôi dùng Time ... cho ListView
Mà bạn nghĩ sai rồi đấy. Trong ListView làm gì có unicode. Chỉ có windows-1258 thôi. Mà có code đàng
hoàng, bạn không đọc, không hiểu vd.
Mã:
For c = 1 To 2
                    .SubItems(c) = UniToWindows1258(ActiveSheet.Cells(r, c + 1).Value)
Next
là cái gì đã được "nhồi" vào ListView?
 
Lần chỉnh sửa cuối:
Upvote 0
siwtom ơi! Sao mình down về mở lên thì nó cũng bị trường hợp giống bạn Hoàng Trọng Nghĩa vậy! Mình đang sài win xp offic 2010 ?
 
Upvote 0
siwtom ơi! Sao mình down về mở lên thì nó cũng bị trường hợp giống bạn
Hoàng Trọng Nghĩa vậy! Mình đang sài win xp offic 2010 ?
Trường hợp giống bạn Hoàng Trọng Nghĩa có nghĩa cụ thể là gì?
Là phông chữ không đẹp? Là khi xuất từ ListView thì không phải là unicode? Là cả hai?
Tôi nghĩ là tôi đã viết quá rõ ràng rồi nên cũng chả biết trả lời thêm thế nào. Nhất là khi câu hỏi chung
chung như thế.
Tôi dùng XP, Excel 2007 + Time New Roman cho ListView thì có như hình tôi đã gửi

Nói về Times New Roman:
Khi bạn và tôi cài Windows là đã có Times New Roman rồi đúng không? Nhưng chắc chắn không có bàn
phím Windows để viết văn bản tiếng Vệt. Do tôi không dùng Unikey bao giờ vì tôi luôn dùng đồ của
Windows. Dùng đồ của system có điểm lợi là khi tôi viết trong Notepad hay WORD thì tôi có được chắc
chắn là nó luôn tương thích. Bàn phím của Windows và Notepad, WORD của Windows thì chắc chắn luôn
tương thích rồi, vì cùng một "tác giả" mà. Dùng đồ của bên thứ 3 thì đôi khi gặp phải sự không tương
thích do đồ đó được viết cho system cũ, khi có phiên bản system mới thì đôi khi lại phải update phiên
bản đồ thứ 3 mới. Tôi không thích điều này nên nếu system có thì luôi xài đồ của system.
Vậy tôi muốn xài bàn phím của Windows. Để có được bàn phím này thì tôi vào Control Panel --> tùy chọn
vùng và ngôn ngữ --> thẻ ngôn ngữ --> có 2 ô thì đánh dấu kiểm tại ô ở trên --> OK --> đút đĩa Windows
vào để Windows copy các tập tin cần thiết. Sau đó vẫn thẻ Ngôn ngữ --> chọn Chi tiết --> Add --> chọn
và thêm Vietnamse. Lúc này thì trong biểu tượng cạnh đồng hồ có thễ chuyển qua lại từ bàn phím Anh <-
-> Việt. Cách viết: chọn bàn phím VI:
0 là chữ đ, 1 là chữ ă, 2 là chữ â, 3 là chữ ê, 4 là chữ ô, [ là chữ ư, ] là chữ ơ
5 là dấu huyền, 6 là dấu hỏi, 7 là dấu ngã, 8 là dấu sắc, 9 là dấu nặng
muốn viết chữ hoa thì bấm thêm SHIFT, muốn viết số từ 0 đến 9 thì bấm Alt (phải) + 0 .. 9
muốn bấm "[" hoặc "]" thì bấm Alt + "[" hoặc Alt + "]"
Với Wn 7 thì hình như cài xong đã có bàn phím nhưng sau phải tự vào và "bật" nó lên thì mới có trong
biểu tượng ngôn ngữ.
Có thể sau khi cài bản vá 2 XP và làm xong các thao tác trên thì tôi có Times New Roman "đẹp" như
trong hình chăng?
 
Lần chỉnh sửa cuối:
Upvote 0
Là phông chữ không đẹp! Mấy cái dấu đặt chưa đúng chỗ siwtom ơi!
 
Upvote 0
Trường hợp giống bạn Hoàng Trọng Nghĩa có nghĩa cụ thể là gì?
Là phông chữ không đẹp? Là khi xuất từ ListView thì không phải là unicode? Là cả hai?
Tôi nghĩ là tôi đã viết quá rõ ràng rồi nên cũng chả biết trả lời thêm thế nào. Nhất là khi câu hỏi chung chung như thế.
Tôi dùng XP, Excel 2007 + Time New Roman cho ListView thì có như hình tôi đã gửi

Khi code có tính phổ biến thì mình cũng nên chọn đa số máy hiểu font, đó là điều dĩ nhiên, nhưng nếu dùng UNICODE DỰNG SẲN dù máy nào font chữ vẫn đẹp và hiển thị đúng, còn UNICODE TỔ HỢP thì lại cho ra kết quả máy này hiển thị đẹp, máy kia lại "trật chìa" việc bỏ dấu tiếng Việt. Bạn xem hình sẽ hiểu:
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    63.3 KB · Đọc: 570
Upvote 0
...
là cái gì đã được "nhồi" vào ListView?

Tôi nghĩ bạn chưa thấy cách hiển thị với các loại Tổ hợp và Dựng sẳn ở nhiều máy nên bạn nói như vậy, với File dưới, tôi chỉ thêm nút lệnh, ngoài ra hoàn toàn là do bạn viết.

Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy mà rất nhiều máy khi sử dụng Unicode Tổ hợp.
 

File đính kèm

Upvote 0
Tôi nghĩ bạn chưa thấy cách hiển thị với các loại Tổ hợp và Dựng sẳn ở nhiều máy nên bạn nói như vậy, với File dưới, tôi chỉ thêm nút lệnh, ngoài ra hoàn toàn là do bạn viết.

Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy mà rất nhiều máy khi sử dụng Unicode Tổ hợp.

Tôi đâu thấy có lệch gì ta

Capture.JPG

(Tôi đang dùng Win7 + Office 2010)
 
Upvote 0
Tôi đâu thấy có lệch gì ta



(Tôi đang dùng Win7 + Office 2010)

Như em đã nói, có máy hiển thị thế này, có máy hiển thị thế kia, Thầy thử màn hình có độ phân giải 1024 x 768 pixels thử xem có bị lệch do màn hình không? Ở chỗ em xài máy tính bàn, màn hình 17" (không wide) nên toàn bộ máy hiển thị lệch dấu.

Kể cả khi dùng bộ gõ Unicode Tổ hợp khi gửi bài trên diễn đàn này, những bài đó nhìn chữ bị lệch là em biết dùng font gì liền vì nó rất khó đọc, dấu bị lệch tùm lum, vừa đọc vừa cố gắng hiểu nghĩa như là đọc tiếng nước ngoài vậy!
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ bạn chưa thấy cách hiển thị với các loại Tổ hợp và Dựng sẳn ở nhiều máy nên bạn nói như vậy, với File dưới, tôi chỉ thêm nút lệnh, ngoài ra hoàn toàn là do bạn viết.

Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy mà rất nhiều máy khi sử dụng Unicode Tổ hợp.

Kyo xài Win XP, Office 07 và thấy bị lệch dấu y chang vậy.
Đã thử trên màn hình 19'' và 17'' nhưng vẫn bị lệch dấu.
 
Upvote 0
Tôi nghĩ bạn chưa thấy cách hiển thị với các loại Tổ hợp và Dựng
sẳn ở nhiều máy nên bạn nói như vậy, với File dưới, tôi chỉ thêm nút lệnh, ngoài ra hoàn toàn là do bạn
viết.
Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy
mà rất nhiều máy khi sử dụng Unicode Tổ hợp.
Trước tiên ta thống nhất với nhau là: tôi không nói là bạn nói dối. Vấn đề của bạn được lưu bằng hình
ảnh nên tôi cũng nhìn thấy. Chỉ có điều bạn cứ một mực bàn tới chuyện unicode tổ hợp với dựng sẵn.
Tôi biết tổ hợp và dựng sẵn là thế nào, chúng khác nhau như thế nào. Nhưng bạn thử nghĩ xem - trong
ListView làm gì có unicode mà tổ hợp với dựng sẵn?Bạn có vài cách nhận biết. Thứ nhất là nhìn vào
code. Rõ ràng là ta nhập vào ListView dữ liệu không phải unicode. Hơn thế nữa, nếu dữ liệu gốc là như
nhau vd. Hoàng Trọng Nghĩa, thì dù nó ở dạng tổ hợp hay dựng sẵn thì dữ liệu nhập vào ListView, tức
windows-1258 là như nhau.Tại sao? Vì hàm convert chỉ có 1 tập ký tự ĐÍCH windows-1258 duy nhất.
Vậy thì với Hoàng Trọng Nghĩa tổ hợp và Hoàng Trọng Nghĩa dựng sẵn hàm trả về 2 chuỗi khác nhau
bằng cách nào??? Nếu bạn vẫn không tin thì bạn hãy viết trong sheet 2 dòng Hoàng Trọng Nghĩa, 1 dòng
dùng tổ hợp, 1 dòng dùng dựng sẵn. Sau đó bạn xuất từ ListView xuống sheet thì bạn thấy 2 chuỗi là như
nhau. Nhưng nhiều khi 2 chuỗi nhìn như nhau nhưng chúng lại khác nhau về BYTE, vậy bạn hãy làm động
tác nữa là lấy từ ListView rồi ghi ra đĩa ở 2 tập tin. Sau đó mở 2 tập tin bằng HexEditor bạn sẽ thấy các
bai ở vị trí tương ứng là như nhau.
Tóm lại 2 chuỗi có nội dung như nhau thì dù được mã dùng tổ hợp hay dựng sẵn thì khi đi qua hàm
convert sẽ có 2 chuỗi "y hệt" nhau. Y hệt ở đây không chỉ là nhìn thấy giống nhau mà thực sự chúng là 2
chuỗi BYTE y hệt nhau. Vậy thì lỗi hiển thị đâu có liên quan tới tổ hợp hay dựng sẵn.
Nhân đây tôi cũng muốn nói là bạn đưa cái ví dụ về viết trên GPE hay đâu đó có sự khác biệt giữa tổ
hợp và dựng sẵn là không tương ứng với trường hợp ở đây. Khi bạn gõ 2 đoạn text vào Textbox hay
trên GPE, lúc thì tổ hợp lúc dựng sẵn thì bạn có thể thấy hiển thị hơi khác. Vì sao? Vì lúc đó trong
Textbox, trên GPE bạn có unicode, lúc thì tổ hợp, lúc thì dựng sẵn, tức 2 chuỗi trong Textbox, trên GPE là
không "y hệt" nhau về "phương diện" BYTE.. Còn trong trường hợp đang xét trong ListView không có
unicode, và chuỗi ký tự - BYTE trong ListView ở 2 trường hợp là "y hệt" nhau.
Theo tôi nếu đã cố tìm nguyên nhân thì hoặc là ở độ phân giải màn hình - cái này không thuyết phục tôi,
hoặc ở phông chữ Arial, Times ...
Tôi không tin là độ phân giải. Nếu text hiển thị đúng (như ở máy tôi) thì nó đúng với mọi độ phân giải, còn
nếu không đúng (như ở máy bạn) thì nó không đúng ở mọi độ phân giải. Bạn thử xem. Vì tôi tải file của
bạn về và text hiển thị đúng với 800 x 600, 1024 x 768, 1152 x 864, 1280 x 1024, 1600 x 1200 (máy tôi
chỉ có thế thôi) + XP SP2 + Excel 2007 + thao tác cài bàn phím Vietnamese
Tôi không tin là độ phân giải, vậy tôi nghi ngờ gì? Tôi không còn lựa chọn nào khác ngoài nghi ngờ
phông chữ.
Bạn có thể đính kèm tập tin phông chữ Arial, Times New Roman của bạn không?. Tôi cũng muốn thử xét
phông chữ xem thế nào. Trong thư mục Windows\Fonts có nhiều Arial, Times, bạn có thể copy hết và
nén bằng WinRar.
Chuyện không liên quan tới tổ hợp, dựng sẵn tôi đã viết ở trên. Tôi muốn xét 1 câu nữa của bạn.

"Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy
mà rất nhiều máy khi sử dụng Unicode Tổ hợp".

Nghĩa là thế nào? Là nếu text được viết dùng Tổ hợp thì không hiển thị chính xác? Thế mà trong file bạn
gửi "Hoàng Trọng Nghĩa" có lỗi hiển thị, mà bạn cho là nguyên cớ do Tổ hợp, Dựng sẵn ấy thì "Hoàng
Trọng Nghĩa" được dùng với unicode Dựng sẵn cơ mà
 
Lần chỉnh sửa cuối:
Upvote 0
Install files for complex script and right to left languages (including Thai)

Tôi nghĩ bạn chưa thấy cách hiển thị với các loại Tổ hợp và Dựng sẳn ở nhiều máy nên bạn nói như vậy, với File dưới, tôi chỉ thêm nút lệnh, ngoài ra hoàn toàn là do bạn viết.

Mọi người thấy nếu font chữ có lệch dấu, thì cho ý kiến, còn tôi thì thấy bị lệch đấy, không phải ở 1 máy mà rất nhiều máy khi sử dụng Unicode Tổ hợp.

Máy cài Windows Xp2 + Office2003


Khi vào Control Panel \ Date, Time, Language, and Regional Options \ Language and Regional Options:
Chọn thẻ [ Language ]
Trong mục [ Supplementan language support ]
Bỏ chọn ở dòng: Install files for complex script and right to left languages (including Thai)
Thì có hiện tượng lệch dấu như trong hình sau (dấu nặng là rõ nhât)


Chọn lại ở dòng: Install files for complex script and right to left languages (including Thai) Thì dấu lại hiện đúng vị trí bình thường

Các bạn hãy làm thử thí nghiệm nầy xem có bị hiện tượng như vậy không? Nếu cũng bị hiện tượng này thì có thể đây là nguyên nhân … ;;;;;;;;;;;
 

File đính kèm

  • Check.JPG
    Check.JPG
    139.1 KB · Đọc: 268
  • Un check.JPG
    Un check.JPG
    144.7 KB · Đọc: 270
Upvote 0
Máy cài Windows Xp2 + Office2003

Khi vào Control Panel \ Date, Time, Language, and Regional Options \ Language and Regional Options:
Chọn thẻ [ Language ]
Trong mục [ Supplementan language support ]
Bỏ chọn ở dòng: Install files for complex script and right to left languages (including Thai)
Thì có hiện tượng lệch dấu như trong hình sau (dấu nặng là rõ nhât)

Chọn lại ở dòng: Install files for complex script and right to left languages (including Thai) Thì dấu lại hiện
đúng vị trí bình thường
Các bạn hãy làm thử thí nghiệm nầy xem có bị hiện tượng như vậy không? Nếu cũng bị hiện tượng này
thì có thể đây là nguyên nhân …
Vấn đề này tôi đã viết tại bài #8 nhưng chắc không ai thèm đọc. Trích:
"Vậy tôi muốn xài bàn phím của Windows. Để có được bàn phím này thì tôi vào Control Panel --> tùy
chọn vùng và ngôn ngữ --> thẻ ngôn ngữ --> có 2 ô thì đánh dấu kiểm tại ô ở trên --> OK --> đút đĩa
Windows vào để Windows copy các tập tin cần thiết"
"Có thể sau khi cài bản vá 2 XP và làm xong các thao tác trên thì tôi có Times New Roman "đẹp" như
trong hình chăng?"
"ô ở trên" chính là ô "Install files for complex script and right to left languages (including Thai)" của bạn.
"và làm xong các thao tác trên" có nghĩa là trong quá trình đó Windows đã copy 1 số tập tin "nào đó" nên
tôi có phông chữ đẹp.
Cũng chính vì nghi ngờ phông chữ nên trong bài #15 tôi muốn bạn Hoàng Trọng Nghĩa gửi cho tôi phông
chữ để "xét nghiệm"
Một cái cần ghi nhớ: phông chữ dùng để HIỂN THỊ văn bản. Nếu văn bản không hiển thị đúng thì 99 % là
do phông chữ. Nếu hiển thị "ô vuông" thì có nghĩa là máy ta không có phông chữ mà người soạn văn bản
dùng để viết văn bản. Nếu hiển thị "không đẹp" thì do có thiết lập nào đó không chuẩn. Không có chuyện
vấn đề Tổ hợp hay Dựng sẵn ở đây vì Windows hỗ trợ unicode và hỗ trợ cả 2 dạng.
Cũng chính vì muốn dùng đồ của Windows nên tôi bắt buộc phải cài bàn phím vietnamse, mà để làm điều
đó thì tôi bắt buộc phải đánh dấu kiểm tại ô trên (nếu muốn cài bàn phím Trung Quốc thì phải đánh dấu
kiểm tại ô dưới. Nếu cài cả 2 thì đánh dấu cả 2), từ đó "tự nhiên" tôi có phông chữ đẹp. Còn dùng
Unikey thì mấy ai nghĩ tớii việc vào Control Panel? Mà không vào thì có phông chữ xấu. Cố tình dùng đồ
của Windows tự dưng lại có nhiều cái lợi
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề này tôi đã viết tại bài #8 nhưng chắc không ai thèm đọc. Trích:
"Vậy tôi muốn xài bàn phím của Windows. Để có được bàn phím này thì tôi vào Control Panel --> tùy chọn vùng và ngôn ngữ --> thẻ ngôn ngữ --> có 2 ô thì đánh dấu kiểm tại ô ở trên --> OK --> đút đĩa Windows vào để Windows copy các tập tin cần thiết"
"Có thể sau khi cài bản vá 2 XP và làm xong các thao tác trên thì tôi có Times New Roman "đẹp" như trong hình chăng?"
"ô ở trên" chính là ô "Install files for complex script and right to left languages (including Thai)" của bạn.
"và làm xong các thao tác trên" có nghĩa là trong quá trình đó Windows đã copy 1 số tập tin "nào đó" nên tôi có phông chữ đẹp.
Cũng chính vì nghi ngờ phông chữ nên trong bài #15 tôi muốn bạn Hoàng Trọng Nghĩa gửi cho tôi phông chữ để "xét nghiệm"
Một cái cần ghi nhớ: phông chữ dùng để HIỂN THỊ văn bản. Nếu văn bản không hiển thị đúng thì 99 % là do phông chữ. Nếu hiển thị "ô vuông" thì có nghĩa là máy ta không có phông chữ mà người soạn văn bản dùng để viết văn bản. Nếu hiển thị "không đẹp" thì do có thiết lập nào đó không chuẩn. Không có chuyện vấn đề Tổ hợp hay Dựng sẵn ở đây vì Windows hỗ trợ unicode và hỗ trợ cả 2 dạng.

Cũng chính vì muốn dùng đồ của Windows nên tôi bắt buộc phải cài bàn phím vietnamse, mà để làm điều đó thì tôi bắt buộc phải đánh dấu kiểm tại ô trên (nếu muốn cài bàn phím Trung Quốc thì phải đánh dấu kiểm tại ô dưới. Nếu cài cả 2 thì đánh dấu cả 2), từ đó "tự nhiên" tôi có phông chữ đẹp. Còn dùng Unikey thì mấy ai nghĩ tớii việc vào Control Panel? Mà không vào thì có phông chữ xấu. Cố tình dùng đồ của Windows tự dưng lại có nhiều cái lợi

Tôi không hiểu bạn nói font chữ là font chữ nào, dĩ nhiên, mặc định khi cài Window font Unicode đã có sẳn trong máy, ai lại đi cài cái đã có chứ? Đã có Time New Roman rồi thì cài thêm Time New Roman vào nữa làm gì trời???

Vậy tôi muốn xài bàn phím của Windows. Để có được bàn phím này thì tôi vào Control Panel --> tùy chọn vùng và ngôn ngữ --> thẻ ngôn ngữ --> có 2 ô thì đánh dấu kiểm tại ô ở trên --> OK --> đút đĩa Windows vào để Windows copy các tập tin cần thiết. Sau đó vẫn thẻ Ngôn ngữ --> chọn Chi tiết --> Add --> chọn và thêm Vietnamse. Lúc này thì trong biểu tượng cạnh đồng hồ có thễ chuyển qua lại từ bàn phím Anh <--> Việt. Cách viết: chọn bàn phím VI:
0 là chữ đ, 1 là chữ ă, 2 là chữ â, 3 là chữ ê, 4 là chữ ô, [ là chữ ư, ] là chữ ơ
5 là dấu huyền, 6 là dấu hỏi, 7 là dấu ngã, 8 là dấu sắc, 9 là dấu nặng
muốn viết chữ hoa thì bấm thêm SHIFT, muốn viết số từ 0 đến 9 thì bấm Alt (phải) + 0 .. 9
muốn bấm "[" hoặc "]" thì bấm Alt + "[" hoặc Alt + "]"

Nếu hiển thị lung tung như thế thì tôi thà dùng thêm một font nữa (VNI hay ABC chẳng hạn) cài thêm trong máy cho chắc ăn, vì đằng nào cũng là convert font cả, chứ vì cái font này mà phải gõ bàn phím trái với thói quen gõ dấu thông thường thì xem ra người dùng gõ dấu bị đảo lộn, phải học cách gõ lại à?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu hiển thị lung tung như thế thì tôi thà dùng thêm một font nữa (VNI hay ABC chẳng hạn) cài thêm trong máy cho chắc ăn, vì đằng nào cũng là convert font cả, chứ vì cái font này mà phải gõ bàn phím trái với thói quen gõ dấu thông thường thì xem ra người dùng gõ dấu bị đảo lộn, phải học cách gõ lại à?
Ah! Cũng không phải đảo lôn gì đâu
Bạn dùng font Unicode với bộ gõ Unikey chẳng hạn, thì cứ gõ bình thường như xưa nay vẫn làm thôi
Còn cái hiện trên Listview là thứ đã được convert rồi, chẳng ảnh hưởng gì đến chuyện gõ tiếng Việt trước giờ cả
------------------
Vấn đề ở đây là:
- Lúc đầu tôi cứ lầm tưởng bạn siwtom đã làm được việc hiển thị Unicode trên Listview... Cuối cùng xem lại thì không phải vậy
- 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
Vậy việc convert sang windows-1258 có ưu điểm gì so với convert sang các bảng mã khác?
Nói chung, convert sang "cái gì" không quan trọng, điều mà tôi quan tâm ở đây là nếu file này mang sang bên Tây, không phải chỉnh sửa gì trong Control Panel, người ta có nhìn thấy chữ tiếng Việt trên Listview như ta đang nhìn thấy không? Nếu bạn siwtom trả lời là ĐƯỢC thì đó là thứ đáng xài, bằng ngược lại, không có gì đáng bàn cả
 
Upvote 0
Tôi không hiểu bạn nói font chữ là font chữ nào, dĩ nhiên, mặc định
khi cài Window font Unicode đã có sẳn trong máy, ai lại đi cài cái đã có chứ? Đã có Time New Roman
rồi thì cài thêm Time New Roman vào nữa làm gì trời???

Nếu hiển thị lung tung như thế thì tôi thà dùng thêm một font nữa (VNI hay ABC chẳng hạn) cài thêm trong
máy cho chắc ăn, vì đằng nào cũng là convert font cả, chứ vì cái font này mà phải gõ bàn phím trái với
thói quen gõ dấu thông thường thì xem ra người dùng gõ dấu bị đảo lộn, phải học cách gõ lại à?
Tôi không hiểu thái độ của bạn. Bạn có vấn đề chứ tôi đâu có vấn đề? Tôi chỉ muốn xét vấn đề của bạn
thôi, giúp được bạn thì tốt, không thì đành chịu.

Bạn nói:
"Đã có Time New Roman rồi thì cài thêm Time New Roman vào nữa làm gì trời???"
Bạn ạ, bạn có biết cái Unikey mà bạn dùng nếu nâng cấp thì nó có thêm chức năng không? Vậy thì với
phông chữ rất có thể có phiên bản mới chứ? Mà nếu không phải là phiên bản mới thì khi thao tác như tôi
nói sẽ có "cái gì đó" làm cho cái phông chữ hiện thời trở nên "đẹp" hơn. Tôi không rõ, bạn cũng không rõ
nhưng nếu thao tác như thế mà cuối cùng có được hiển thị tốt thì sao lại không làm?

Bạn nói:
"chứ vì cái font này mà phải gõ bàn phím trái với thói quen gõ dấu thông thường thì xem ra
người dùng gõ dấu bị đảo lộn, phải học cách gõ lại à?"
Chả nhẽ bạn không hiểu những gì tôi viết? Tôi thích dùng bàn phím thì tôi cài, nhưng nếu "hậu quả" của
việc cài ấy lại có được hiển thị đẹp thì bạn cũng có thể cài để có hiển thị đẹp. Sau đó bạn không cần
phải dùng bàn phím ấy. Có ai bắt bạn đâu mà bạn "mỉa mai" thế? Nếu đúng là thao tác như tôi nói là có
hiển thị tốt thì bạn thao tác như thế CHỈ ĐỂ có hiển thị tốt. Chả ai chĩa súng vào đầu bạn bắt bạn phải
dùng bàn phím Windows cả.
Bạn nói:
"Nếu hiển thị lung tung như thế thì tôi thà dùng thêm một font nữa "
Bạn ạ, ai có hiển thị lung tung? Bạn!, ở máy nào có hiển thị lung tung? Ở máy bạn! Vậy thì bạn có vấn đề
chứ tôi đâu có vấn đề? Bạn cần giải quyết vấn đề chứ tôi có phải giải quyết đâu? Tôi chỉ muốn giúp bạn
nên nêu hướng thử nghiệm. Bạn thấy đáng mất công thử thì thử. Thử thấy kết quả tốt thì tôi mừng. Còn
chuyện sau đó bạn có dùng nó hay không là do bạn quyết định, chả ai bắt bạn cả. Còn nếu hướng đi sai
thì tôi buồn vì không giúp được, còn bạn buồn vì không giải quyết được vấn đề. Thế thôi.
Ngay cả cái ListView với tiếng Việt này là tôi chỉ chia sẻ. Tôi không bắt bạn dùng mà bạn chỉ trích tôi như
thế. Bạn không biết cách làm cho Windows của mình hiển thị đúng unicode thì đó là vấn đề của bạn.
Còn tôi chưa bao giờ có vấn đề với unicode cả.
Tôi kết thúc việc trả lời bạn ở đây. Cho dù bạn có viết gì chăng nữa. siwtom đã nói "chấm hết" thì bao
giờ cũng giữ được lời hứa. Hết là hết.
 
Lần chỉnh sửa cuối:
Upvote 0
Ah! Cũng không phải đảo lôn gì đâu
Bạn dùng font Unicode với bộ gõ Unikey chẳng hạn, thì cứ gõ bình thường như xưa nay vẫn làm thôi
Còn cái hiện trên Listview là thứ đã được convert rồi, chẳng ảnh hưởng gì đến chuyện gõ tiếng Việt
trước giờ cả
------------------
Vấn đề ở đây là:
- Lúc đầu tôi cứ lầm tưởng bạn siwtom đã làm được việc hiển thị Unicode trên Listview... Cuối cùng xem
lại thì không phải vậy
- 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
Vậy việc convert sang windows-1258 có ưu điểm gì so với convert sang các bảng mã khác?
Nói chung, convert sang "cái gì" không quan trọng, điều mà tôi quan tâm ở đây là nếu file này mang sang
bên Tây, không phải chỉnh sửa gì trong Control Panel, người ta có nhìn thấy chữ tiếng Việt trên Listview
như ta đang nhìn thấy không? Nếu bạn siwtom trả lời là ĐƯỢC thì đó là thứ đáng xài, bằng ngược lại,
không có gì đáng bàn cả
Tôi đã gặp nhiều người (ông A), thậm chí kỹ sư, tất nhiên không rành về tin học, hệ điều hành, là khi nhận
được một văn bản gửi từ VN sang mà nhìn thấy toàn "đầu trâu mặt ngựa" thì chả hiểu do đâu? Có người
còn cài lại Windows vì nghĩ system có vấn đề. Có người am hiểu hơn (ông B) thì biết là tác giả đã dùng
phông chữ Việt mà máy mình không có nên "lọ mọ" lên mạng tải về và cài để đọc được văn bản.
Nếu bạn nói là có thể convert sang VNI thì nếu gặp ông A thì "toi", ông ta bó tay ngồi khóc. Còn ông B thì
mất thêm công. Còn nếu convert sang windows-1258 thì có thể dùng Times có sẵn trong system.
Mang ListView sang Tây? Không làm gì cả cũng đã có tiếng Việt rồi. Nhưng để hiển thị đẹp thì:
1. Với Win 7 không phải làm gì cả. Bàn phím cũng đã cài luôn. Chỉ có điều muốn dùng bàn phím ấy thì
phải vào Control Panel đánh dấu kiểm để "bật" nó lên, không cần đút đĩa cho Windows copy gì cả
2. Với XP. Khi cài xong thì ListView cũng hiển thị tiếng Việt. Chỉ có điều sẽ gặp phải trường hợp hiển thị
không đẹp. Lúc đó phải vào CP và đánh dấu ô "Install files for complex script and right to left languages
(including Thai)". Kinh nghiệm của tôi thì sau khi đánh dấu kiểm (vì khi cài xong Windows thì cả 2 ô đều
chưa được đánh dấu) Windows bao giờ cũng đề nghị phải đút đĩa vào để nó copy một số file. Nó copy
những gì tôi không rõ nhưng sau khi hoàn tất thì tôi luôn có chuẩn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mang ListView sang Tây? Không làm gì cả cũng đã có tiếng Việt rồi. Nhưng để hiển thị đẹp thì:
1. Với Win 7 không phải làm gì cả. Bàn phím cũng đã cài luôn. Chỉ có điều muốn dùng bàn phím ấy thì phải vào Control Panel đánh dấu kiểm để "bật" nó lên, không cần đút đĩa cho Windows copy gì cả
2. Với XP. Khi cài xong thì ListView cũng hiển thị tiếng Việt. Chỉ có điều sẽ gặp phải trường hợp hiển thị không đẹp. Lúc đó phải vào CP và đánh dấu ô "Install files for complex script and right to left languages (including Thai)". Kinh nghiệm của tôi thì sau khi đánh dấu kiểm (vì khi cài xong Windows thì cả 2 ô đều chưa được đánh dấu) Windows bao giờ cũng đề nghị phải đút đĩa vào để nó copy một số file. Nó copy những gì tôi không rõ nhưng sau khi hoàn tất thì tôi luôn có chuẩn.
Đấy đây!
Vấn đề tôi và mọi người quan tâm là chổ này đây! Hiển thị không đẹp chút cũng không đến nỗi nào, miễn là chữ ra chữ, đừng giống tiếng Miên là được rồi
Ẹc... Ẹc...
------------------------------------------
Tôi không hiểu thái độ của bạn. Bạn có vấn đề chứ tôi đâu có vấn đề? Tôi chỉ muốn xét vấn đề của bạn
thôi, giúp được bạn thì tốt, không thì đành chịu.
......................................................................
Chả nhẽ bạn không hiểu những gì tôi viết?
......................................................................
Ngay cả cái ListView với tiếng Việt này là tôi chỉ chia sẻ. Tôi không bắt bạn dùng mà bạn chỉ trích tôi như
thế. Bạn không biết cách làm cho Windows của mình hiển thị đúng unicode thì đó là vấn đề của bạn.
Còn tôi chưa bao giờ có vấn đề với unicode cả...
.....................................................................
Tôi kết thúc việc trả lời bạn ở đây. Cho dù bạn có viết gì chăng nữa. siwtom đã nói "chấm hết" thì bao
giờ cũng giữ được lời hứa. Hết là hết.
Bạn có vẻ nóng tính quá nhỉ!
Cùng là thành viên của diễn đàn, chuyện tranh luận để tìm ra vấn đề cũng là điều bình thường thôi mà (bản thân tôi cũng rất thích tranh luận /-*+/)
GPE là nơi chia sẽ kiến thức 1 cách vô tư nhất... Người biết nhiều hướng dẫn cho người biết ít... Khi người ta còn thắc mắc, mình giải thích cho người ta hiểu (làm hết khả năng, người ta vẫn không hiểu thì đành chịu)
Vậy nên tôi nghĩ chẳng có gì phải "nóng giận" cả bạn à
Tôi vẫn mong rằng bạn sẽ tiếp tục gắn bó với diễn đàn, để tôi và mọi người có thể học hỏi thêm kinh nghiệm từ bạn về những điều chưa biết trong lĩnh vực lập trình
Vậy đi nha!
Ẹc... Ẹc...
(Góp ý chút: Cách "nói" của bạn có vẻ hơi.. lạ lạ và hơi... dài dòng (giống Hai2Hai), nhiều khi đọc cũng muốn mệt luôn... He... He... Nói thật lòng theo cảm nghĩ của tôi, mong bạn đừng giận)
 
Lần chỉnh sửa cuối:
Upvote 0
Đấy đây!
Vấn đề tôi và mọi người quan tâm là chổ này đây! Hiển thị không đẹp chút cũng không đến nỗi nào, miễn là chữ ra chữ, đừng giống tiếng Miên là được rồi
Ẹc... Ẹc...
------------------------------------------

Bạn có vẻ nóng tính quá nhỉ!
Cùng là thành viên của diễn đàn, chuyện tranh luận để tìm ra vấn đề cũng là điều bình thường thôi mà (bản thân tôi cũng rất thích tranh luận /-*+/)
GPE là nơi chia sẽ kiến thức 1 cách vô tư nhất... Người biết nhiều hướng dẫn cho người biết ít... Khi người ta còn thắc mắc, mình giải thích cho người ta hiểu (làm hết khả năng, người ta vẫn không hiểu thì đành chịu)
Vậy nên tôi nghĩ chẳng có gì phải "nóng giận" cả bạn à
Tôi vẫn mong rằng bạn sẽ tiếp tục gắn bó với diễn đàn, để tôi và mọi người có thể học hỏi thêm kinh nghiệm từ bạn về những điều chưa biết trong lĩnh vực lập trình
Vậy đi nha!
Ẹc... Ẹc...
(Góp ý chút: Cách "nói" của bạn có vẻ hơi.. lạ lạ và hơi... dài dòng (giống Hai2Hai), nhiều khi đọc cũng muốn mệt luôn... He... He... Nói thật lòng theo cảm nghĩ của tôi, mong bạn đừng giận)

Em đồng ý với Thầy vấn đề này, có tranh luận (thậm chí là gay gắt) để đưa ra giải pháp tốt nhất thì dù có "trầy da, tróc vảy" cũng tranh luật.

Vấn đề Font, em nghĩ cũng không là vấn đề gì. Nếu ta viêt cho ta xài, thì ta viết "cái quái" gì cũng được. Nhưng nếu ta làm cho ai đó xài thì ta phải nghĩ đến cái máy người xài có tương thích không. Thậm chí ta cài đặt trong máy người dùng những thứ cần thiết cho chương trình của chúng ta cũng được.

Nhớ có lần tôi và Sư phụ ptm0412 đã tranh luận về vấn đề bị lỗi khi cho Minimize tất cả các của sổ bằng 1 câu lệnh. Sư phụ nói máy sư phụ bị lỗi phải khởi động lại máy, tôi thì cải làm gì có chuyện đó. Mãi sau này, tôi thử dùng câu lệnh đó sang các máy khác và gặp trường hợp lỗi đúng như Sư phụ đã nói, lúc đó tôi mới chợt hiểu rằng: Khi thực hiện các thủ tục, phải cố gắng viết cái tổng quát, cái mà đa số có thể sử dụng được. Thậm chí là làm cho mình, thì đem qua máy khác cũng sử dụng được.

Đối với những thủ tục cỏn con thì thôi vậy, nhưng đã làm một chương trình nào đó, mình phải thử trên nhiều máy khác. Nhớ có lần tôi không hiểu vì lý do gì, thử trên mọi máy thì không sao, nhưng khi chạy chương trình, gắn cái đèn chiếu vào để trình bày thì lại gặp lỗi (chắc là lỗi Solution gì gì đó).

Cho đến giờ, tôi luôn ý thức rằng, trước khi đưa ra 1 kết luận nào đó, tôi luôn thử trên nhiều máy. Hãy nghĩ đến cái ta trước rồi mới nói đến cái tôi.

Trân trọng.
 
Upvote 0
Đấy đây!
Vấn đề tôi và mọi người quan tâm là chổ này đây! Hiển thị không đẹp chút cũng không đến nỗi nào, miễn
là chữ ra chữ, đừng giống tiếng Miên là được rồi
Ẹc... Ẹc...
------------------------------------------
Bạn có vẻ nóng tính quá nhỉ!
Cùng là thành viên của diễn đàn, chuyện tranh luận để tìm ra vấn đề cũng là điều bình thường thôi mà
(bản thân tôi cũng rất thích tranh luận )
GPE là nơi chia sẽ kiến thức 1 cách vô tư nhất... Người biết nhiều hướng dẫn cho người biết ít... Khi
người ta còn thắc mắc, mình giải thích cho người ta hiểu (làm hết khả năng, người ta vẫn không hiểu thì
đành chịu)
Vậy nên tôi nghĩ chẳng có gì phải "nóng giận" cả bạn à
Tôi vẫn mong rằng bạn sẽ tiếp tục gắn bó với diễn đàn, để tôi và mọi người có thể học hỏi thêm kinh
nghiệm từ bạn về những điều chưa biết trong lĩnh vực lập trình
Vậy đi nha!
Ẹc... Ẹc...
(Góp ý chút: Cách "nói" của bạn có vẻ hơi.. lạ lạ và hơi... dài dòng (giống Hai2Hai), nhiều khi đọc cũng
muốn mệt luôn... He... He... Nói thật lòng theo cảm nghĩ của tôi, mong bạn đừng giận)
Cho dù bạn viết phần mềm như thế nào chăng nữa cũng có cái người dùng phải tự vào CP để thiết lập.
Tại sao? Tại vì có hàng ngàn phương án thiết lập nên Windows không thể tự thiết lập cho đúng ý bạn. Có
những cái bạn có thể làm thay người dùng có cái người dùng phải tự làm, tự vào CP. Bạn biết vào CP?
Thì bạn thiết lập nhiều cáii cho đúng ý bạn, cho chuẩn hơn, cho có thể tận dụng tối đa những cái mà
system chào mời. Bạn không biết làm thì bạn có lợi ít đi. Kết luận? Là phải có chút kiến thức, không cần
phải giỏi nhưng kiến thức tối thiểu phải có. Bạn mua bất cứ công cụ gì từ cái cuốc, máy cưa, máy nghe
nhạc, máy vi tính thì trước tiện bạn phải tìm đọc, có kiến thức tối thiểu để sử dụng công cụ đó. Không thì
không sử dụng được, hoặc không biết cách cầm cưa thì có ngày đứt tay.
Có cách nào để không biết gì mà vẫn sử dụng được sản phẩm do người khác cung cấp không? Xin
thưa: không có cách mầu nhiệm nào cả. Phải tự tìm đọc và có chút kiến thức. Thế thôi. Không chịu tìm
đọc, không chịu có kiến thức tối thiểu thì ráng chịu. Không biết vào CP thì cũng chả chết nhưng nếu biết
vào thì sẽ làm cho system phục vụ đúng nhu cầu của mình, sẽ làm cho sytem "tốt" hơn.
Về ListView thì tôi nghĩ đơn giản thôi. Bạn cài Windows gì, phiên bản Anh, Nga, Ba Lan thì chúng cũng
chỉ khác nhau cơ bản về giao diện người dùng. Cài trên máy VN hay Anh, Ba Lan thì vẫn là Windows,
controls cũng vẫn là của Windows, có khác gì đâu. Chuyện thử thì tôi cũng thử nhiều chứ đâu phải không
thử. Còn chuyện đẹp hay không đẹp thì làm sao tôi có thể làm thay người khác được. Tôi chỉ gợi ý thôi.
Nhưng người ta muốn tôi về máy họ và làm thay họ??? Chỉ biết ngồi mà kêu ca??? Người ta chỉ có thể
gợi ý thôi chứ làm sao mà làm thay được???
Trước đó có nhiều bài cứ một "làn điệu" Tổ hợp với Dựng sẵn thì tôi vẫn kiên nhẫn giải thích là nguyên
nhân không ở đó. Nhưng khi đọc thấy là người ta không thử tò mò làm theo hướng dẫn mà chỉ mỉa mai
thôi (bài cuối) thì tôi không còn kiên nhẫn nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn đã nói:

Tôi đã gặp nhiều người (ông A), thậm chí kỹ sư, tất nhiên không rành về tin học, hệ điều hành, là khi nhận được một văn bản gửi từ VN sang mà nhìn thấy toàn "đầu trâu mặt ngựa" thì chả hiểu do đâu? Có người còn cài lại Windows vì nghĩ system có vấn đề. Có người am hiểu hơn (ông B) thì biết là tác giả đã dùng phông chữ Việt mà máy mình không có nên "lọ mọ" lên mạng tải về và cài để đọc được văn bản.
Nếu bạn nói là có thể convert sang VNI thì nếu gặp ông A thì "toi", ông ta bó tay ngồi khóc. Còn ông B thì mất thêm công.

Và bạn lại nói:

Cho dù bạn viết phần mềm như thế nào chăng nữa cũng có cái người dùng phải tự vào CP để thiết lập. Tại sao? Tại vì có hàng ngàn phương án thiết lập nên Windows không thể tự thiết lập cho đúng ý bạn. Có những cái bạn có thể làm thay người dùng có cái người dùng phải tự làm, tự vào CP. Bạn biết vào CP? Thì bạn thiết lập nhiều cáii cho đúng ý bạn, cho chuẩn hơn, cho có thể tận dụng tối đa những cái mà system chào mời. Bạn không biết làm thì bạn có lợi ít đi. Kết luận? Là phải có chút kiến thức, không cần phải giỏi nhưng kiến thức tối thiểu phải có. Bạn mua bất cứ công cụ gì từ cái cuốc, máy cưa, máy nghe nhạc, máy vi tính thì trước tiện bạn phải tìm đọc, có kiến thức tối thiểu để sử dụng công cụ đó. Không thì không sử dụng được, hoặc không biết cách cầm cưa thì có ngày đứt tay.
Có cách nào để không biết gì mà vẫn sử dụng được sản phẩm do người khác cung cấp không? Xin thưa: không có cách mầu nhiệm nào cả. Phải tự tìm đọc và có chút kiến thức. Thế thôi. Không chịu tìm đọc, không chịu có kiến thức tối thiểu thì ráng chịu. Không biết vào CP thì cũng chả chết nhưng nếu biết vào thì sẽ làm cho system phục vụ đúng nhu cầu của mình, sẽ làm cho sytem "tốt" hơn.

Có phải quá mâu thuẫn chăng?


Còn riêng tôi, nếu tôi cài đặt chương trình cho ai đó mà trái với hệ thống (font, định dạng...) tôi sẽ hướng dẫn người đó thực hiện những cái tiện ích do mình đặt ra. Nếu thiếu font VNI chẳng hạn, tôi sẽ đính kèm theo và hướng dẫn cài đặt luôn. Thế là cài font còn hơn can thiệp vào System cái này cái nọ rồi sau đó, sử dụng chương trình khác lại cài System lại, thay vì chép thêm cái font vào, chẳng tốn thời gian mà còn quên luôn cái vụ cài đặt!

Chỉ là thể hiện quan điểm, nếu có gì mạo phạm xin bạn bỏ qua cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn đã nói:

Và bạn lại nói:

Có phải quá mâu thuẫn chăng?

Còn riêng tôi, nếu tôi cài đặt chương trình cho ai đó mà trái với hệ thống (font, định dạng...) tôi sẽ hướng
dẫn người đó thực hiện những cái tiện ích do mình đặt ra. Nếu thiếu font VNI chẳng hạn, tôi sẽ đính kèm
theo và hướng dẫn cài đặt luôn. Thế là cài font còn hơn can thiệp vào System cái này cái nọ rồi sau đó,
sử dụng chương trình khác lại cài System lại, thay vì chép thêm cái font vào, chẳng tốn thời gian mà còn
quên luôn cái vụ cài đặt!
Chỉ là thể hiện quan điểm, nếu có gì mạo phạm xin bạn bỏ qua cho.
Nếu bạn hỏi đàng hoàng như thế thì tôi trả lời như sau:
1. Không có gì mâu thuẫn cả. Ở đây cụ thể là nói về hệ điều hành Windows. Mỗi người khi ngồi vào bàn
máy nên có kiến thức tối thiểu về system mà mình sẽ làm việc, vì đó là môi trường mình sẽ làm việc giải
trí. Kiến thức tối thiểu nói ở đây là kiến thức về môi trường làm việc, tức Windows, là kiến thức chung
chung mà ông Cộng, Anh, Mỹ, Nga v...v cần phải có. Chứ cái VNI của riêng ông Cộng đâu phải là kiến
thức về Windows. Nhất là ở thời đại unicode ai ngờ rằng có ông nào đó ...
2. Phông chữ có thể gói và tự cài hộ người dùng. Có nhiều cái làm hộ được người dùng nhưng cái mà
tôi nói đến không thể làm hộ, vì như tôi đã nói trong quá trình đó phải đút đĩa vào. Vậy thì chỉ còn hướng
dẫn thôi. Tôi có hướng dẫn không?
Tôi muốn nói một điều. Bạn biết cách làm cho system của mình tốt hơn, hợp với nhu cầu của mình hơn
hay không là vấn đề của bạn. Nếu bạn hài lòng với những gì mình đang có thì xin mời. Chúng ta có thể
kết thúc ở đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo như bạn siwtom nói thì nếu dùng Win7 sẽ không cần phải làm gì. Còn nếu dùng WinXP mà chưa vào Control Panel thiết lập "cái gì đó" thì font chữ thể hiện trên Listview sẽ không đẹp, đúng không?
Vậy chúng ta bàn tiếp theo hướng thế này nhé: Dùng code VBA, xem thử người dùng có thiết lập "cái gì đó" hay chưa? Nếu chưa thiết lập, có thể cảnh báo cho người dùng biết
Theo bạn, VBA có làm được điều này không?
 
Upvote 0
Theo như bạn siwtom nói thì nếu dùng Win7 sẽ không cần phải làm gì. Còn nếu dùng WinXP mà chưa vào Control Panel thiết lập "cái gì đó" thì font chữ thể hiện trên Listview sẽ không đẹp, đúng không?
Vậy chúng ta bàn tiếp theo hướng thế này nhé: Dùng code VBA, xem thử người dùng có thiết lập "cái gì đó" hay chưa? Nếu chưa thiết lập, có thể cảnh báo cho người dùng biết
Theo bạn, VBA có làm được điều này không?

Em cũng đã thử cài trong Control Panel phần language, với máy ở cơ quan, hệ XP, khi check vào Install files for complex... thì nó không cho cài đặt hoặc nó bắt phải có đĩa Win đó. Thế thì người có hiểu biết cũng bó tay khi không có cái đĩa đó, đâu phải lúc nào cũng có sẳn đĩa? ==> Chấp nhận xài font bị lệch dấu thôi.

Cần có cái gì đó mà người dùng cảm thấy thoải mái chứ nhỉ.
 
Upvote 0
Theo bạn siwtom thì win7 không cần phải thiết lập gì cả nhưng tôi đang dùng win7 mà khi đọc chữ của bạn siwtom gõ trên Firefox 4.0.1 thì dấu vẫn bị lệch (dùng IE hoặc copy vào Office thì không bị). Bạn hoặc ai đó có thể hướng dẫn tôi khắc phục không?
 
Upvote 0
Theo bạn siwtom thì win7 không cần phải thiết lập gì cả nhưng tôi đang dùng win7 mà khi đọc chữ của bạn siwtom gõ trên Firefox 4.0.1 thì dấu vẫn bị lệch (dùng IE hoặc copy vào Office thì không bị). Bạn hoặc ai đó có thể hướng dẫn tôi khắc phục không?

Chưa hiểu lắm!
Liên quan gì đến Firefox ở đây ta?
Với lại chữ trên Listview có phải Unicode đâu chứ
 
Upvote 0
Chưa hiểu lắm!
Liên quan gì đến Firefox ở đây ta?
Với lại chữ trên Listview có phải Unicode đâu chứ
Thấy bạn siwtom nói chỉnh chỉnh gì đó trong win xp thì chữ được thể hiện đẹp nên em hỏi thử có cách nào chỉnh để chữ Unicode tổ hợp đẹp trên Firefox không ấy mà.
 
Upvote 0
Theo như bạn siwtom nói thì nếu dùng Win7 sẽ không cần phải làm gì. Còn nếu dùng WinXP mà chưa vào Control Panel thiết lập "cái gì đó" thì font chữ thể hiện trên Listview sẽ không đẹp, đúng không?
Vậy chúng ta bàn tiếp theo hướng thế này nhé: Dùng code VBA, xem thử người dùng có thiết lập "cái gì đó" hay chưa? Nếu chưa thiết lập, có thể cảnh báo cho người dùng biết
Theo bạn, VBA có làm được điều này không?
Tôi nghĩ không cần kiểm tra làm gì. Ta cứ thông báo cho người khác rồi họ tự kiểm tra. Cùng lắm là ta mở luôn cho họ cái cửa sổ đó.
Để làm việc này ta chỉ cần gọi
Mã:
call Shell("control.exe intl.cpl,,1", 1)
Nhưng kể từ Win98 có lúc Windows đặt control.exe ở thư mục Windows có lúc đặt ở Windows\System32 nên để chắc ăn ta kiểm tra:
Mã:
Sub Button1_Click()
Dim strSysDirPath As String, vRetval As Double
    strSysDirPath = String$(145, Chr$(0))
    strSysDirPath = Left$(strSysDirPath, _
    GetWindowsDirectory(strSysDirPath, _
    Len(strSysDirPath)))
                        
    If Dir(strSysDirPath & "\control.exe") = "control.exe" Then
    Else
        strSysDirPath = String$(145, Chr$(0))
        strSysDirPath = Left$(strSysDirPath, _
                             GetSystemDirectory(strSysDirPath, _
                             Len(strSysDirPath)))
    End If
    vRetval = Shell(strSysDirPath & "\control.exe intl.cpl,,1", 1)
End Sub
Thực ra nếu đã dùng kiểu mở CP ra rồi thì dùng FindWindow và FindWindowEx ta có thể tìm ra control - ở đây nó có class là Button, y hệt như những nút OK, Cancel ấy nhưng nó ở dạng trông giống như checkbox. Rồi kiểm tra xem nó có được check không. Cách này gọi là dùng "cơ bắp" chứ không phải là "dùng đầu".
Chắc chắn mọi thông tin được ghi trong Registry nhưng tôi chưa bao giờ quan tâm tới chuyện này nên cũng không rành. Mà nếu có đọc ra thông tin kiểu: Tên: %SystemRoot%\system32\intl.cpl, kiểu: REG_DWORD, data: 6 thì tôi chũng chả hiểu 6 có nghĩa là gì, 5, 4, 3, 2, 1 có nghĩa là gì.
Vấn đề không phải là: "VBA có làm được điều này không" mà là: "Tìm thông tin ở đâu". Nếu biết nó được ghi ở đâu trong Registry thì chắc chắn đọc được.
Tôi tìm thấy trong registry thông tin như ở hình chụp. Các bạn có entry như thế không? Nếu không thì rất có thể là đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo bạn siwtom thì win7 không cần phải thiết lập gì cả nhưng tôi đang dùng win7 mà khi đọc chữ của bạn siwtom gõ trên Firefox 4.0.1 thì dấu vẫn bị lệch (dùng IE hoặc copy vào Office thì không bị). Bạn hoặc ai đó có thể hướng dẫn tôi khắc phục không?
Tôi chỉ dùng IE8 thôi nên tôi không rõ bên Firefox như thế nào. Tất nhiên tôi biết là có Firefox. Bạn thử
vào View --> Encoding (hoặc đại loại Set character gì đó) và chọn Unicode (UTF-8) thử xem. Ngoài ra
bạn vào Tool --> Options --> thẻ General hoặc Content hoặc xem các thẻ khác nữa xem chỗ nào có
"Font and color" đại loại thế. Xem default font là gì. Nếu có nút chọn ngôn ngữ dùng để hiện thị trang web
thì chọn thử VN xem sao. Nếu có nút Advanced thì nhấn vào đấy xem có những thiết lập như thế nào và
thử thay đổi.
Mà chính xác thì tôi nói là sau khi cài Windows và làm các "thao tác thêm" như tôi đã liệt kê thì tôi có
phông chữ chuẩn. Tôi không dám chắc chính xác khâu nào là thủ phạm. Chỉ có điều chắc chắn là tôi
không cài thêm phông chữ unicode nào cả.
Mà tôi vừa cài xong Firefox. Bài của tôi chắc chắn là unicode tổ hợp. Nó được hiển thị trong Firefox của
tôi như ở file đính kèm.
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi Hoàng Trọng Nghĩa
Em cũng đã thử cài trong Control Panel phần language, với máy ở cơ quan, hệ XP, khi check vào Install
files for complex... thì nó không cho cài đặt hoặc nó bắt phải có đĩa Win đó. Thế thì người có hiểu biết
cũng bó tay khi không có cái đĩa đó, đâu phải lúc nào cũng có sẳn đĩa? ==> Chấp nhận xài font bị lệch
dấu thôi.
Cần có cái gì đó mà người dùng cảm thấy thoải mái chứ nhỉ.
Ít ra là trong 2, 3 bài tôi ghi rõ là "trong quá trình đó Windows đề nghị đút đĩa vào" để nó copy các tập tin
cần thiết. Bạn không đọc à? Nếu bạn không có đĩa thì bạn thử làm gì??? Bạn bỏ công ra làm gì khi tôi ghi
rõ như thế và bạn không có đĩa???
Bạn viết: "Thế thì người có hiểu biết cũng bó tay". Đúng là bó tay chấm cơm. Tôi hướng dẫn cho những
người có đĩa tức những người dùng Win có bản quyền. Còn những người dùng lậu thì phải hiểu một
điều cực kỳ đơn giản là của chùa là của không mất tiền nên được cái nào hay cái ấy, thiếu cái gì thì ráng
chịu. Vậy thì bó tay là đương nhiên. Trách mình chứ sao lại trách người?
Không có sẵn đĩa? Nếu thế thì không hôm nay thì ngày mai cài. Hay ngày kia, hay một tháng sau cũng
không có đĩa? Thế nó nằm ở đâu? Người ta tới kiểm tra thì nói là đĩa tôi để ở nhà?
Mà bạn đừng nói là bạn mất đĩa hay cty mất đĩa nhé. Khi người ta đã đến kiểm tra bản quyền thì bạn
không thể nói như thế được. Cho đến lúc giải quyết đĩa mới (có hóa đơn, gửi yêu cầu cấp đĩa mới, mua
đĩa mới???) thì bạn phải xóa Windows ra khỏi máy. Tất nhiên ở những nước không có luật như VN,
Trung Quốc v...v thì có thể khác. Ở nước ngoài nó mà phạt thì đau đấy.
Muốn thoải mái thì dùng phần mềm có bản quyền, phiên bản Full thì thoải mái thôi. Chứ ai đó dùng lậu thì
sao lại đòi bằng như người bỏ tiền ra mua?
 
Lần chỉnh sửa cuối:
Upvote 0
Theo như bạn siwtom nói thì nếu dùng Win7 sẽ không cần phải làm gì.
Còn nếu dùng WinXP mà chưa vào Control Panel thiết lập "cái gì đó" thì font chữ thể hiện trên Listview
sẽ không đẹp, đúng không?
Vậy chúng ta bàn tiếp theo hướng thế này nhé: Dùng code VBA, xem thử người dùng có thiết lập "cái gì
đó" hay chưa? Nếu chưa thiết lập, có thể cảnh báo cho người dùng biết
Theo bạn, VBA có làm được điều này không?
Tôi đã viết từ rất lâu rồi (bài #8 tjì phải). Tôi muốn mọi người tự thử xem mình có thành công như tôi hay
không. Nhưng thấy hình như chả ai thử nên tôi bỏ công ra thử nghiệm. Để có được sự chắc chắn thay
cho "có lẽ". Kết quả như sau:
1. Như tôi đã nói, tôi vào CP, "chỗ ấy chỗ ấy" và chọn ô đầu tiên. Windows yêu cầu đút đĩa vào để copy
một số tập tin. Sau đó tôi có
a. Phông chữ đẹp trong ListView (đã gửi hình chụp)
b. Kiểm tra trong Registry thì có các entry: Vietnamese, Thai ... (đã gửi hình)
c. Tôi thử thì thấy
Mã:
MsgBox Application.LanguageSettings.LanguagePreferredForEditing(msoLanguageIDVietnamese)
hiển thị TRUE

2. Tôi vào CP, "chỗ ấy chỗ ấy" và BỎ chọn ô đầu tiên. Windows xóa như "điên" một loạt tập tin rồi yêu
cầu khởi động lại máy. Sau khi khởi động lại thì tôi có
a. Phông chữ KHÔNG ĐẸP trong ListView (hình ở dưới)
b. Kiểm tra trong Registry thì KHÔNG có các entry: Vietnamese, Thai ... (hình ở dưới)
c.
Mã:
MsgBox Application.LanguageSettings.LanguagePreferredForEditing(msoLanguageIDVietnamese)
hiển thị FALSE
------------
Kết luận thì chắc mỗi người tự rút ra được chứ? Và cách kiểm tra đã "cài" hay chưa cũng rõ rồi nhỉ.
-----------
Để viết bài này dùng bàn phím Vietnamse thì tôi phải "cài lại". Lần này tôi quan sát kỹ thì thấy Windows
copy sang đĩa cứng một loạt tập tin trong đó có các tập tin phông chữ TTF. Chỉ kịp nhìn "đuôi" thôi vì nó
hiển thị nhanh quá nên cũng không biết cái nào cho VN, Thai, Do Thai ...

Kết luận thì mỗi người tự rút ra nhé. Tôi chưa bao giờ có vấn đề về việc hiển thị unicode trên các trang
web nên rất ngạc nhiên là nhiều "người khác" lại có vấn đề.

Tôi chỉ muốn nhắc lại một "chân lý". Windows hỗ trợ unicode, và hỗ trợ cả tổ hợp lẫn dựng sẵn. Nếu ta
thấy text hiển thị không chuẩn thì ắt là các thiết lập chưa chuẩn. Mỗi phần mềm khác cũng thế. Nó có thể
hỗ trợ rất nhiều thứ nhưng phải thiết lập cho đúng. Vì thế mới sinh ra cái gọi là OPTIONS.

Tôi cũng muốn nói thêm là sau khi cài đặt hỗ trợ cho tiếng Việt, Thái, Do Thái, ... thì Windows "tặng" luôn
bàn phím. Nhưng Windows không chĩa súng vào đầu bắt phải dùng bàn phím đó đâu nhé.

Một điều cần nhớ: Nếu Windows đã hỗ trợ "một cái gì đó", không nhất thiết là nói tới unicode, nhưng nếu
ta vẫn thấy cái đó "chạy" chưa chuẩn thì ắt "một số thiết lập nào đó" chưa được chuẩn. Thay vì bó tay và
ngồi "chịu khổ" thì hãy tìm tòi để thiết lập cho đúng. Rồi ngồi mà "hưởng" lộc.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã tìm được cách khắc phục lỗi hiển thị của Unicode tổ hợp trên Firefox. Bạn nào bị lỗi tương tự thi làm như sau nhé:
about:config vào thanh address
Click vào I'll be careful, I promise!
Copy gfx.font_rendering.harfbuzz.levelvào ô Filter
Double click vào dòng gfx.font_rendering.harfbuzz.level tìm thấy và nhập số 0 vào textbox >> OK

Sưu tầm từ Internet
 
Upvote 0
Tôi đã tìm được cách khắc phục lỗi hiển thị của Unicode tổ hợp trên Firefox. Bạn nào bị lỗi tương tự thi làm như sau nhé:
about:config vào thanh address
Click vào I'll be careful, I promise!
Copy gfx.font_rendering.harfbuzz.levelvào ô Filter
Double click vào dòng gfx.font_rendering.harfbuzz.level tìm thấy và nhập số 0 vào textbox >> OK

Sưu tầm từ Internet

Cám ơn Hữu Thắng nhé! Ở cái FireFox của mình thì gõ vào Search: gfx.font_rendering.harfbuzz và không cần .level (nếu có nó sẽ không lọc ra) và gõ vào số 0 thì OK!
 
Upvote 0
Ít ra là trong 2, 3 bài tôi ghi rõ là "trong quá trình đó Windows đề nghị đút đĩa vào" để nó copy các tập tin cần thiết. Bạn không đọc à? Nếu bạn không có đĩa thì bạn thử làm gì??? Bạn bỏ công ra làm gì khi tôi ghi rõ như thế và bạn không có đĩa???
Bạn viết: "Thế thì người có hiểu biết cũng bó tay". Đúng là bó tay chấm cơm. Tôi hướng dẫn cho những người có đĩa tức những người dùng Win có bản quyền. Còn những người dùng lậu thì phải hiểu một điều cực kỳ đơn giản là của chùa là của không mất tiền nên được cái nào hay cái ấy, thiếu cái gì thì ráng chịu. Vậy thì bó tay là đương nhiên. Trách mình chứ sao lại trách người?
Không có sẵn đĩa? Nếu thế thì không hôm nay thì ngày mai cài. Hay ngày kia, hay một tháng sau cũng không có đĩa? Thế nó nằm ở đâu? Người ta tới kiểm tra thì nói là đĩa tôi để ở nhà?
Mà bạn đừng nói là bạn mất đĩa hay cty mất đĩa nhé. Khi người ta đã đến kiểm tra bản quyền thì bạn không thể nói như thế được. Cho đến lúc giải quyết đĩa mới (có hóa đơn, gửi yêu cầu cấp đĩa mới, mua đĩa mới???) thì bạn phải xóa Windows ra khỏi máy. Tất nhiên ở những nước không có luật như VN, Trung Quốc v...v thì có thể khác. Ở nước ngoài nó mà phạt thì đau đấy.
Muốn thoải mái thì dùng phần mềm có bản quyền, phiên bản Full thì thoải mái thôi. Chứ ai đó dùng lậu thì sao lại đòi bằng như người bỏ tiền ra mua?

Bạn nói như là tất cả ai cũng có đĩa, riêng công ty tôi, hàng đống phòng ban, máy tính bàn thì hằng hà, nhưng có lẽ vì lý do gì gì đó mà không cho vô mạng, không có ổ đĩa (dĩ nhiên các sếp thì khác), mọi cài đặt đều thông qua IT, cài đặt thì IT dùng ổ đĩa khác cài vào. Nhân viên chỉ xài những thứ có sẳn. Chỉ việc không có mạng và ổ đĩa thôi thì như mất đi 2 cánh tay trái và phải rồi.

Vấn đề của Thầy ndu96081631 và tôi cùng nghĩ đó là khi thủ tục được chạy, nó gói luôn vụ cài đặt sẳn, còn không thì thôi, không xài, chọn giải pháp khác tốt hơn.

Tuy nhiên tôi rất thích cách chia sẻ của bạn. Nếu ai cũng "bí mật, tuyệt chiêu" thì không biết ai sẽ chia sẻ, ai sẽ góp ý để hoàn thiện cái gọi là "tuyệt chiêu" của mình. Tôi rất cám ơn bạn.

Sẳn đây tôi xin đưa lên giải pháp convert từ các kiểu mã UNI, VNI chuyển qua lại với nhau để cho ListView nhận biết, không nhất thiết là mã Window1258:

Hàm chuyển đổi qua lại giữa 2 bảng mã UNI và VNI (có sẳn tiện ích loại bỏ dấu tiếng Việt):

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)
    'TargetCode: SelectCase: 1 (Unicode), 2 (VNI Windows), 3 (Alphabet-NonDiacritic (Ky tu khong[/COLOR][COLOR=#006400] dau))[/COLOR]
    Dim ArrUNI As Variant, ArrVNI 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
    
    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")
    
    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Õ", "Î")
    
    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 = 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
                If Ch2b Then
                    inString1 = Mid(TransChar, i, 2)
                Else
                    inString1 = Mid(TransChar, i, 1)
                End If
                For j = 0 To UBound(ArrVNI)
                    If inString1 = ArrVNI(j) Then
                        Select Case TargetCode
                            Case 1: inString1 = ChrW(ArrUNI(j))
                            Case 3: 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
        Case Else
CaseElse:
        FontConverter = "#N/A"
    End Select
End Function

Thử Convert lên ListView:

Mã:
Private Sub UserForm_Initialize()
    Dim i As Long, j As Long, n As Long, iR As Long, iC As Long
    Dim sTitle, TitleArr(), sData, DataArr(), Tmp
    sTitle = Sheet2.[A1].Resize(, 5).Value
    sData = Range(Sheet2.[A2], Sheet2.[A65536].End(xlUp)).Resize(, 5).Value
    n = UBound(sData, 1)
    
    ReDim DataArr(1 To n, 1 To 5)
    iR = 0
    With CreateObject("Scripting.Dictionary")
        For i = 1 To n
            Tmp = sData(i, 1)
            If Tmp <> vbNullString And Not .Exists(Tmp) Then
                iR = iR + 1: .Add Tmp, iR
                For iC = 1 To 5
                    Select Case iC
                        Case 1, 4: DataArr(iR, iC) = sData(i, iC)
                        Case Else: DataArr(iR, iC) = FontConverter(sData(i, iC), 1, 2)
                    End Select
                Next
            Else
                DataArr(.Item(Tmp), 4) = DataArr(.Item(Tmp), 4) + sData(i, 4)
            End If
        Next
    End With
    
    With ListView1
        .ColumnHeaders.Clear: .ListItems.Clear
        For i = 1 To 5
            .ColumnHeaders.Add , , FontConverter(sTitle(1, i), 1, 2), 120
        Next
        For i = 1 To iR
            With .ListItems.Add(, , DataArr(i, 1))
                For j = 1 To 4
                    .SubItems(j) = DataArr(i, j + 1)
                Next
            End With
        Next
    End With
End Sub

Và convert ngược lại từ ListView xuống sheet:

Mã:
Private Sub CommandButton1_Click()
    Dim ListviewArr, i As Long, j As Long, iR As Long
    With ListView1
        iR = .ListItems.Count
        ReDim ListviewArr(1 To iR + 1, 1 To 5)
        For i = 1 To 5
            ListviewArr(1, i) = FontConverter(.ColumnHeaders(i), 2, 1)
        Next
        For i = 1 To iR
            ListviewArr(i + 1, 1) = .ListItems(i)
            With .ListItems(i)
                For j = 1 To 4
                    Select Case j
                        Case 0, 3: ListviewArr(i + 1, j + 1) = .SubItems(j)
                        Case Else: ListviewArr(i + 1, j + 1) = FontConverter(.SubItems(j), 2, 1)
                    End Select
                Next
            End With
        Next
    End With
    Sheet2.[J1].Resize(iR, 5).Value = ListviewArr
End Sub


NẾU CÁC BẠN KHÔNG CÓ FONT VNI-TIMES, tôi đã đính kèm, các bạn tải về giải nén và chép các tập tin trong thư mục đó vào Control Panel > Fonts.

Tới đây mình thấy quá đơn giản và hiển thị không bị "nhiễu" bởi các thủ tục cài đặt.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sẳn đây tôi xin đưa lên giải pháp convert từ các kiểu mã UNI, VNI chuyển qua lại với nhau để cho ListView nhận biết, không nhất thiết là mã Window1258:

Hàm chuyển đổi qua lại giữa 2 bảng mã UNI và VNI (có sẳn tiện ích loại bỏ dấu tiếng Việt):
..Tới đây mình thấy quá đơn giản và hiển thị không bị "nhiễu" bởi các thủ tục cài đặt.
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.
 
Upvote 0
Bạn nói như là tất cả ai cũng có đĩa, riêng công ty tôi, hàng đống phòng ban, máy tính bàn thì hằng hà, nhưng có lẽ vì lý do gì gì đó mà không cho vô mạng, không có ổ đĩa (dĩ nhiên các sếp thì khác), mọi cài đặt đều thông qua IT, cài đặt thì IT dùng ổ đĩa khác cài vào. Nhân viên chỉ xài những thứ có sẳn. Chỉ việc không có mạng và ổ đĩa thôi thì như mất đi 2 cánh tay trái và phải rồi.

Vấn đề của Thầy ndu96081631 và tôi cùng nghĩ đó là khi thủ tục được chạy, nó gói luôn vụ cài đặt sẳn, còn không thì thôi, không xài, chọn giải pháp khác tốt hơn.

Tuy nhiên tôi rất thích cách chia sẻ của bạn. Nếu ai cũng "bí mật, tuyệt chiêu" thì không biết ai sẽ chia sẻ, ai sẽ góp ý để hoàn thiện cái gọi là "tuyệt chiêu" của mình. Tôi rất cám ơn bạn.

Sẳn đây tôi xin đưa lên giải pháp convert từ các kiểu mã UNI, VNI chuyển qua lại với nhau để cho ListView nhận biết, không nhất thiết là mã Window1258:

Hàm chuyển đổi qua lại giữa 2 bảng mã UNI và VNI (có sẳn tiện ích loại bỏ dấu tiếng Việt):

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)
    'TargetCode: SelectCase: 1 (Unicode), 2 (VNI Windows), 3 (Alphabet-NonDiacritic (Ky tu khong[/COLOR][COLOR=#006400] dau))[/COLOR]
    Dim ArrUNI As Variant, ArrVNI 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
    
    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")
    
    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Õ", "Î")
    
    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 = 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
                If Ch2b Then
                    inString1 = Mid(TransChar, i, 2)
                Else
                    inString1 = Mid(TransChar, i, 1)
                End If
                For j = 0 To UBound(ArrVNI)
                    If inString1 = ArrVNI(j) Then
                        Select Case TargetCode
                            Case 1: inString1 = ChrW(ArrUNI(j))
                            Case 3: 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
        Case Else
CaseElse:
        FontConverter = "#N/A"
    End Select
End Function

Thử Convert lên ListView:

Mã:
Private Sub UserForm_Initialize()
    Dim i As Long, j As Long, n As Long, iR As Long, iC As Long
    Dim sTitle, TitleArr(), sData, DataArr(), Tmp
    sTitle = Sheet2.[A1].Resize(, 5).Value
    sData = Range(Sheet2.[A2], Sheet2.[A65536].End(xlUp)).Resize(, 5).Value
    n = UBound(sData, 1)
    
    ReDim DataArr(1 To n, 1 To 5)
    iR = 0
    With CreateObject("Scripting.Dictionary")
        For i = 1 To n
            Tmp = sData(i, 1)
            If Tmp <> vbNullString And Not .Exists(Tmp) Then
                iR = iR + 1: .Add Tmp, iR
                For iC = 1 To 5
                    Select Case iC
                        Case 1, 4: DataArr(iR, iC) = sData(i, iC)
                        Case Else: DataArr(iR, iC) = FontConverter(sData(i, iC), 1, 2)
                    End Select
                Next
            Else
                DataArr(.Item(Tmp), 4) = DataArr(.Item(Tmp), 4) + sData(i, 4)
            End If
        Next
    End With
    
    With ListView1
        .ColumnHeaders.Clear: .ListItems.Clear
        For i = 1 To 5
            .ColumnHeaders.Add , , FontConverter(sTitle(1, i), 1, 2), 120
        Next
        For i = 1 To iR
            With .ListItems.Add(, , DataArr(i, 1))
                For j = 1 To 4
                    .SubItems(j) = DataArr(i, j + 1)
                Next
            End With
        Next
    End With
End Sub

Và convert ngược lại từ ListView xuống sheet:

Mã:
Private Sub CommandButton1_Click()
    Dim ListviewArr, i As Long, j As Long, iR As Long
    With ListView1
        iR = .ListItems.Count
        ReDim ListviewArr(1 To iR + 1, 1 To 5)
        For i = 1 To 5
            ListviewArr(1, i) = FontConverter(.ColumnHeaders(i), 2, 1)
        Next
        For i = 1 To iR
            ListviewArr(i + 1, 1) = .ListItems(i)
            With .ListItems(i)
                For j = 1 To 4
                    Select Case j
                        Case 0, 3: ListviewArr(i + 1, j + 1) = .SubItems(j)
                        Case Else: ListviewArr(i + 1, j + 1) = FontConverter(.SubItems(j), 2, 1)
                    End Select
                Next
            End With
        Next
    End With
    Sheet2.[J1].Resize(iR, 5).Value = ListviewArr
End Sub


NẾU CÁC BẠN KHÔNG CÓ FONT VNI-TIMES, tôi đã đính kèm, các bạn tải về giải nén và chép các tập tin trong thư mục đó vào Control Panel > Fonts.

Tới đây mình thấy quá đơn giản và hiển thị không bị "nhiễu" bởi các thủ tục cài đặt.

Chưa cần xem code mới chỉ liếc qua khai báo biến đã thấy là không chuyện nghiệp.
Mà thôi cũng chả xem code làm gì, đau đầu quá. Tốt nhất là xem kết quả.
Tôi không biết cách bắt ListView hiển thị đúng hay đấy là dụng ý của tác giả?
Code hoàn toàn là của tác giả, không bị sửa một dấu phẩy nào.
Nếu có gì xin chỉ giáo.
 

File đính kèm

Upvote 0
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: 44
  • Test.xls
    Test.xls
    31.5 KB · Đọc: 70
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
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

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

Back
Top Bottom