• 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
User avatar
truongphu
VIP
VIP
Posts: 4764
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

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

Postby truongphu » Fri 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:

Code: Select all

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:
[vb]Dim ZZ() As Byte
ZZ = "Câu L" & ChrW(&H1EA1) & "c B" & ChrW(&H1EĐ) & " VB"
Call TextOut(hDC, 24, 2, ZZ(0), (UBound(AA)+1)/2)[/vb]

Đấ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:

[vb]Call SendMessage(hWnd, WM_SETTEXT, 0&, ZZ(0))[/vb]

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

User avatar
Zeroplus
Guru
Guru
Posts: 546
Joined: Sat 16/04/2011 11:31 pm
Location: Gò Dầu - Tây Ninh
Has thanked: 6 times
Been thanked: 98 times
Contact:

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

Postby Zeroplus » Fri 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"))


Return to “[VB] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests