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:
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
Web KT

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

Back
Top Bottom