-
Lỗi font Unicode trong ComboBox
ongke0711 > 23-08-19, 12:08 PM
Chào các bạn,
Tôi bị vấn đề này cũng lâu rồi mà chưa biết cách xử lý.
Đó là khi gõ tiếng Việt Unicode trong khung Combobox thì có chữ bị lỗi như hình. Chữ: Đạn, Băng
- Table dùng font Unicode dựng sẳn.
- Bộ gõ cũng Unicode dựng sẳn. Kiểu gõ: Telex hay VNI đều bị lỗi.
- Thao tác bỏ dấu ngay khi gõ ký tự chứ không bỏ dấu khi gõ hết từ. Nếu bỏ dấu sau cùng thì không bị lỗi nhưng cách đó lại không quen thuộc với phần lớn mọi người.
Các bạn giúp kiểm tra thử với phiên bản Access cao hơn xem có còn bị lỗi này không nhé? (Tôi dùng Access 2013) hoặc có thủ thuật nào vượt được cái lỗi này thì hướng dẫn giùm. Cảm ơn trước.
(ComboBox trong UserForm của Excel thì không bị lỗi này)
Link demo: http://www.mediafire.com/file/zu45z51jdq...accdb/file
-
RE: Lỗi font Unicode trong ComboBox
Noname > 23-08-19, 05:59 PM
Không chỉ riêng Access mà cả khi search google, gõ Excel mình cũng bị tình trạng này.
Nguyên nhân là do tính năng Auto Complete . Xử các lỗi tương tự trong trình duyệt, Office .... bằng cách timd cách tắt Auto Complete đi.
Trong trường hợp Combobox, ta tắt bằng cách trong Properties, tab Data, Cho giá trị thuộc tính Auto Expand = No -
RE: Lỗi font Unicode trong ComboBox
tranthanhan1962 > 23-08-19, 07:19 PM
Đây không phải là lỗi access hay lỗi bộ gõ mà là do bàn phím tiếng Anh hiện nay không có các ký tự tiếng Việt nên phải gõ 2 phím để tạo một ký tự, Đối với các bộ gõ tiếng Việt, khi bạn gõ các dấu thanh, dấu mũ và dấu móc, phần mềm này sẽ thực hiện hai thao tác. Đầu tiên, nó sẽ xóa ký tự thứ nhất. Sau đó, nó mới đặt dấu cho ký tự còn lại. Ví dụ, khi bạn gõ aa (telex), bộ gõ sẽ xóa ký tự a thứ nhất, sau đó nó đặt dấu mũ cho ký tự a còn lại, và bạn sẽ nhận được ký tự â, hoặc a+6 phần mềm sẽ xóa 2 ký tự a và 6 rồi thay thế bằng ký tự â, combobox có chứ năng tự động điền, vì vậy nếu trong danh sách của nó chỉ có một chữ "trần" thì khi bạn đánh sẽ không có lỗi xảy ra, nhưng nếu có chữ trần và chữ trang, thì khi gõ chữ tra nó sẽ thự điền đến chữ tra của chữ trang và xác định giá trị tra vào combobox, bạn có thể kiểm tra khi đánh chữ tra nó sẽ quét đen 3 ký tự t, r, a cũa chữ trang và bạn gõ thêm một ký tự a hoặc 1 thì nó biến thành chữ traa hoặc traâ, Nếu bạn sử dụng windows 10 sẽ có bàn phím vietnamesse mỗi lần gõ có một ký tự như:1=ă, 2=â, 3=ô...nhưng trước hết hãy làm quen với nó. Nếu sau này có sản xuất bàn phím tiếng việt thì sẽ ok hơn -
RE: Lỗi font Unicode trong ComboBox
ongke0711 > 23-08-19, 09:05 PM
Vậy thì đành phải chấp nhận cái lỗi này vậy, nó cũng gây phiền phức khi gõ ký tự để tìm kiếm nhanh trong comboBox.
Nếu thiết lập Auto Expand: No như bác Noname có nói thì nó không bị lỗi nữa nhưng lại không tự động tìm kiếm tương đương trong comboBox, cũng hơi phiền.
Để tôi xem có chỉnh sửa gì được trong cái code FAYTComboBox lúc trước để dùng được Auto Expand=No không.
Cảm ơn các bác đã góp ý.
------------------------------------------------------------------------------------
Đã làm theo cách đơn giản nhất nhưng khắc phục được lỗi ký tự là:
- Auto Expand = No
- Xổ danh sách xuống (DropDown) ngay khi ComboBox GotFocus.
Cách này có cái nhược điểm là đối với giao diện, trải nghiệm người dùng sẽ không thoải mái lắm khi mở Form và lướt qua các Control trên Form, cứ con trỏ chuột đi vào combobox là nó xổ danh sách xuống. -
RE: Lỗi font Unicode trong ComboBox
tranthanhan1962 > 23-08-19, 11:01 PM
windows 10 tiếng việt có hỗ trợ bàn phím tiếng việt: trong đó tệ nhất là Vietnammese Nunber Key-based (gõ kiểu VNI) lỗi từa lưa, Vietnamese Telex (gõ kiểu Telex) tương đối Ok hơn, phải nói kiểu bàn phím Vietnamese tương đối tiến bộ hơn cả (thay thế các ký tự kiểu việt nam bằng 1 phím). Nhưng chính cái này lại làm khó cho người sử dụng đã quen cách gõ VNI hoặc Telex, phải học lại cách gõ mới. Nhưng nếu quen rồi thì rất sướng, hiện nay tôi cũng thử dùng cách này thấy tương đối OK, và trị được lỗi khi gõ ký tự trên combobox, nhất là khi đã quen thì gõ rất nhanh, vì mỗi ký tự chỉ gõ một lần, tuy nhiên vẫn còn khuyết điểm là gõ dấu ngay sau ký tự có dấu, và gõ sai dấu phải xóa dấu sai rồi mới gõ lại dấu khác, chữ nào sai thì phải sửa ngay chỗ sai chứ không sửa được từ cuối từ.
Cách gõ: ă-1, â-2,ê-3,ô-4, ̀-5, ̉ -6, ̃-7, ́-8, ̣ -9, đ-0, ư-[, ơ-].
Với cách này khi cần gõ chữ trần chỉ cần gõ t+r+2 sẽ ra ngay chữ trâ, nên nếu có chữ trang, tranh trong row source combobox vẫn không bị dính vào và sẽ không bị lỗi, ngoài khuyết điểm phải làm quen với kiểu gõ mới còn vấn đề không sửa dấu được ở cuối từ và nếu bàn phím không có phím số riêng thì phải đỗi lại bộ gõ US khi gõ dấu vì các phím số bị biến hết thành phím ký tự rất bất tiện.
Ví dụ: với kiểu VNI thì muốn gõ a1 chỉ cần gõ a+1+1, kiểu telex gõ aa chỉ cần gõ a+a+a, nhưng với kiểu gõ Vietnamese thì phải chuyển bộ gõ khi gõ 11 vì nếu không sẽ ra
chữ ăă, hoặc gõ 87 sẽ ra ́̃ -
RE: Lỗi font Unicode trong ComboBox
ongke0711 > 23-08-19, 11:39 PM
Em chưa cài Windows 10 nên chưa trải nghiệm bàn phím kiểu mới này. Thấy kiểu gõ chữ bớt đi 1 ký tự vậy là nhanh rồi. Học cách gõ mới cũng nhanh. Máy tính bàn có bàn phím số riêng biệt thì thích hợp nhất rồi. -
RE: Lỗi font Unicode trong ComboBox
tranthanhan1962 > 24-08-19, 08:12 AM
Ngày xưa, Việt Nam có máy đánh chữ tiếng Việt, vậy mà bây giờ cứ phải dùng bàn phím tiếng Anh, phải cài bộ gõ này nọ. Chán thật! -
RE: Lỗi font Unicode trong ComboBox
lehongduc > 24-08-19, 09:33 PM
Chào các Bạn,
Theo tôi, khi thiết kế ứng dụng với combobox chúng ta cần hết sức quan tâm đến việc nạp nguồn dữ liệu cho combobox (RowSource) sao cho hợp lý, việc đó phải thỏa mãn yêu cầu là chỉ nạp những gì ta cần, đừng bao giờ nạp lên toàn bộ dữ liệu. Tại sao như vậy? Các Bạn thử tưởng tượng với một Danh sách khách hàng có hàng chục nghìn người, hoặc chỉ cần 5 nghìn thôi, sẽ làm cho ứng dụng chậm chạp đến bực bội.
Sau đây tôi xin đề xuất giải pháp như sau:
1. Thay vì nạp lên hết (Mã Khách hàng, hoặc Tên Khách hàng chẳng hạn), ta sẽ lọc danh sách theo dạng thức nào đó, chẳng hạn như:
+ Có ký tự đầu hoặc 2, 3 ký tự đầu là ...
+ Danh sách có từ xác định nào đó trong đó.
Thí dụ:
+ Nạp tên khách hàng bắt đầu bằng "TRẦN"
+ Nạp tên khách hàng có từ "HOA" trong tên.
2. Ta sẽ gán RowSource cho combobox khi được sổ xuống bằng việc bấm phím F4 với sự kiện là KeyDown.
Sau đây thí dụ minh họa:
Như vậy vừa tiết kiệm tài nguyên của máy tính, vừa đẩy nhanh tốc độ lấy danh sách ra.Mã:Private Sub TenKH_KeyDown(KeyCode As Integer, Shift As Integer)
Dim RwSrc As String, St As String, nStart As Integer
Dim sObj
Select Case KeyCode
Case vbKeyF4
nStart = Me.TenKH.SelStart
Me.TenKH.SelLength = Me.TenKH.Width - nStart
St = Trim(Me.TenKH.SelText)
'Chuyen con tro ve dau cau
Me.TenKH.SelStart = 0
Me.TenKH.SelLength = nStart
St = Trim(Me.TenKH.SelText)
If Len(St) > 0 Then
RwSrc = "SELECT DISTINCTROW DSKhachhang.TenKH, DSKhachhang.MSKH FROM DSKhachhang"
RwSrc = RwSrc & " WHERE((DSKhachhang.TenKH) Like '*" & St & "*')"
RwSrc = RwSrc & " ORDER BY DSKhachhang.MSKH;"
Me.TenKH.RowSource = RwSrc
End If
End Select
End Sub
Các Bạn nghĩ mà xem: trong khi ta chỉ cần tìm tên khách hàng họ "TRẦN" hoặc có từ "HOA" trong tên, sao lại dại dột nạp tất tần tật cả nghìn cái tên, thậm chí là cả chục nghìn cái tên cho cái combobox đó.
Mời các Bạn xem video minh họa tại link sau:
-
RE: Lỗi font Unicode trong ComboBox
lehongduc > 24-08-19, 10:09 PM
-
RE: Lỗi font Unicode trong ComboBox
ongke0711 > 26-08-19, 04:56 PM
Sau khi tổng hợp gợi ý của bác NoName, anh LeHongDuc và anh TranThanhAn1962, tôi đã sửa lại cái Class "Tìm kiếm ngay khi gõ - Find As You Type " trong comboBox thành "Tìm kiếm sau khi bấm - Find As You Press"
Lý do là: chỉ riêng cho comboBox, Textbox thì không bị vụ này.
- Đối với tiếng Anh (hoặc tiếng Việt không dấu) thì ngay khi gõ ký tự nào thì nó tìm kiếm ngay cụm từ đó không sai và hiển thị trên combobox cũng không sai (sự kiện OnChange).
- Đối với tiếng VIệt có dấu thanh thì gõ một ký tự chưa đủ để tìm (vd chữ "đ") mà khi vừa gõ 1 ký tự thì sự kiện OnChange nó bắt luôn dẫn đến ký tự bị ngắt ra và hiển thị sai luôn (vd: dđạn)
Do đó phải né sự kiện OnChange và chuyển sang chỉ thực hiện tìm kiếm chuỗi gõ vào sau khi bấm một cái nút nào đó (Press) để việc gõ các ký tự tiếng Việt được trọn vẹn.
Demo dưới đây tôi kết hợp 2 cách tìm kiếm trong combobox của anh LeHongDuc và cái class FAYTCombo của tôi vô luôn để tuỳ trường hợp mà sử dụng.
Cách 1: là của anh LeHongDuc dùng cho ComboBox có số lượng record lớn như anh đã đề cập. Không cần load lên toàn bộ records làm chậm hệ thống mà chỉ lọc record nào cần tìm thôi.
Cách 2: là tôi dùng class cũng cho nhẹ hệ thống và dùng cho combobox nào có số lượng record ít ít (500 dòng), load toàn bộ lên cũng không ảnh hưởng gì.
Riêng cách anh LeHongDuc gợi ý, tôi có chỉnh sửa chút thành một thủ tục trong module và gọi lên cho gọn code trong Form. Và cũng có một thay đổi nhỏ là tôi dùng hàm Instr() thay cho Like trong câu lệnh SQL để tìm nhanh hơn. (Theo tôi được biết là source code (C/C++) của hàm Instr() ngắn hơn rất nhiều lần so với code của hàm Like do đó việc chạy hàm Like để xử lý sẽ tốn tài nguyên hơn so với Instr)
Code cho Form:
Link demo: http://www.mediafire.com/file/81kzs3tmsz...2.mdb/file