• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Phân phối mảng byte từ chuỗi (assign to array)

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4763
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 517 time

Phân phối mảng byte từ chuỗi (assign to array)

Gửi bàigửi bởi truongphu » T.Sáu 18/11/2011 5:47 pm

Tên bài viết: Phân phối mảng byte từ chuỗi (assign to array)
Tác giả: truongphu
Cấp độ bài viết: Căn bản
Tóm tắt: Phân phối mảng byte từ chuỗi (assign to array)


Ta thường thấy khi dùng các hàm API unicode (Alias "XxxW"), thông điệp chuỗi phải ở dạng mảng byte vì thế xuất hiện các function chuyển chuỗi unicode sang mảng byte, đại loại như sau:

  1. Public Type Unicode
  2.     H As Byte:  L As Byte
  3. End Type
  4.  
  5. Public Function UniStr2BytesArray(SrcStr As String) As Unicode()
  6.     Dim TmpUnicode() As Unicode, Seed&:    Seed = 0:  Dim SrcStrLength&:    SrcStrLength = LenB(SrcStr)
  7.     ReDim TmpUnicode(SrcStrLength / 2)
  8.     Do Until Seed >= SrcStrLength / 2
  9.         TmpUnicode(Seed).H = CByte(AscB(MidB(SrcStr, Seed * 2 + 1, 1)))
  10.         TmpUnicode(Seed).L = CByte(AscB(MidB(SrcStr, Seed * 2 + 2, 1)))
  11.         Seed = Seed + 1
  12.     Loop
  13.         UniStr2BytesArray = TmpUnicode
  14. End Function


Vd:

Mã: Chọn hết

Dim ZZ As Unicode
ZZ = UniStr2BytesArray("Câu L" & ChrW(&H1EA1) & "c B" & ChrW(&H1EĐ) & " VB")
Call TextOut(hDC, 24, 2, ZZ(0), UBound(AA)


Như thế khá "rườm rà", có lẽ code từ thời xưa Win95 nên các "tiền bối" thiếu hổ trợ.

Bây giờ, ta nên dùng gọn như sau:
  1. Dim ZZ() As Byte
  2. ZZ = "Câu L" & ChrW(&H1EA1) & "c B" & ChrW(&H1EĐ) & " VB"
  3. Call TextOut(hDC, 24, 2, ZZ(0), (UBound(AA)+1)/2)


Đấy, chỉ 3 dòng lệnh chạy trực tiếp thay vì tốn công khai báo Type, viết function rồi gọi lệnh áp dụng.
Bạn lưu ý (UBound(AA)+1)/2) là độ dài của chuỗi unicode = Len("Câu L" & ChrW(&H1EA1) & "c B" & ChrW(&H1EĐ) & " VB").

Hàm API unicode không cần độ dài chuỗi thì dễ hơn, vd:

  1. Call SendMessage(hWnd, WM_SETTEXT, 0&, ZZ(0))


Và khi áp dụng, nhớ rằng đấy là hàm API unicode, còn API ANSI (Alias "XxxA") thì không dùng được, vì mảng byte trường hợp nầy chỉ chứa toàn ASC(ký tự) và kết thúc = 0


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
Zeroplus
Guru
Guru
Bài viết: 546
Ngày tham gia: T.Bảy 16/04/2011 11:31 pm
Đến từ: Gò Dầu - Tây Ninh
Has thanked: 6 time
Been thanked: 98 time
Liên hệ:

Re: Phân phối mảng byte từ chuỗi (assign to array)

Gửi bàigửi bởi Zeroplus » T.Sáu 18/11/2011 6:12 pm

Cháu cũng xin bổ sung là với các hàm API unicode (Alias "XxxW") thì cũng có thể không cần chuyển sang ByteArray, ta chỉ cần chỉnh trong hàm API từ kiểu String sang kiểu long rồi đưa đối số vào là địa chỉ của chuỗi string. Ngắn hơn tý :D

Ví dụ :
'Hàm API xóa thư mục, hỗ trợ unicode
Private Declare Function RemoveDirectory Lib "kernel32.dll" Alias "RemoveDirectoryW" (ByVal lpPathName As Long) As Long ' Do lpPathName là biến con trỏ nên đưa địa chỉ của chuỗi vào

Call RemoveDirectory(StrPtr("C:\Folder"))


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách