Tất nhiên bỏ Unload Me. Tôi vừa viết vừa xem phim mà.
Bạn kể chuyện thuộc dòng "Chuyện lạ đó đây"
Của tôi:
frm = 459844
UserForm1 = 459816
frm = 459844
UserForm1 = 459816
frm = 459844
UserForm1 = 459816
frm = 459844
UserForm1 = 459816
frm = 459844
UserForm1 = 459816
frm = 459844
UserForm1 = 459816
-----------------
1. Trước tiên nói về Long Data. Tôi không hiểu ý bạn.
Windows hoặc không tìm thấy cửa sổ đạt tiêu chí tìm kiếm hoặc tìm thấy và trả về handle của nó. Mỗi cửa sổ có một handle, là số Long unique. Vậy trong system có bao nhiêu của sổ thì có bấy nhiêu "window handle". Dĩ nhiên trong system không thể có hàng TỶ cửa sổ được tạo.
Mà khi cửa sổ được tạo thì Windows gán cho nó 1 giá trị LONG, vậy thì cái "vượt quá mức Long Data" phải hiểu như thế nào?
2. Bạn hơi kiệm lời. Bạn đã test như thế nào?
Phải là: click Button "Show Form" trên sheet --> click Button trên frm và UserForm1 vài lần để test --> click nút X để Unload frm và UserForm1.
Trong toàn bộ qui trình như ở trên thì bạn có kết quả như của tôi. Còn nếu bạn lặp lại qui trình đó vài lần thì bạn phải hiểu như sau:
- MỖI khi cửa sổ được tạo thì nó được gán cho 1 số gọi là "windiw handle". Cũng cùng cửa sổ đó nhưng thực hiện 1 loạt thao tác: mở (tạo) --> đóng (hủy) --> mở (tạo) --> đóng (hủy) ...
thì mỗi lần tạo handle sẽ khác và mỗi lần hủy thì handle trước đó được gán cho cửa sổ sẽ được giải phóng - tức là con số có giá trị như thế đã "tự do".
Ta xét ví dụ. myForm
myForm được tạo --> 1 số LONG gọi là "window handle" được gán cho cửa sổ myForm, vd. đó là 12345 --> con số 12345 này kể từ lúc này sẽ "bận", nó không được gán cho bất cứ cửa sổ nào trong tương lai sẽ được tạo (nên nhớ rằng các phần mềm khác trong system cũng có thể tạo cửa sổ), bởi handle phải unique - Nó cũng như Mã Nhân Viên ấy. Nếu MNV không unique thì làm sao có thể dùng đó để định danh nhân viên được???. Nếu cửa sổ nào đó sau đó được tạo thì Windows sẽ dùng con số LONG khác với 12345 để gán cho nó.
Nếu vào 1 lúc nào đó ta đóng (hủy) myForm thì handle của nó, tức con số 12345 được "giải phóng, tự do, không bận nữa". Và từ thời điểm này Windows có thể sẽ dùng con số 12345 để gán cho 1 cửa sổ khác được tạo vì không "sợ" trùng với handle của các cửa sổ khác nữa (cửa sổ có handle = 12345 đã được hủy rồi mà), tức vẫn thỏa đặc tính unique của window handle.
Bây giờ bạn lại tạo myForm (tức Show) thì cửa sổ myForm lại được gán cho 1 LONG gọi là window handle. Giá trị được gán bây giờ không nhất thiết phải y như giá trị được gán ở lần tạo trước.
Vâng, bây giờ thì em đã hiểu vì sao có sự khắc biệt về số khi mỗi lần thoát (bấm nút đỏ X). Số đó như 1 ID chứ không phải do cái gì chạy mà có để nó quản lý cửa sổ đang mở và chỉ duy nhất, không có số trùng.
Cám ơn Thầy đã giải thích cặn kẻ.
Còn một thắc mắc về mặt thẩm mỹ nữa là, em biết rằng tùy thuộc vào độ rộng của form mà mình có thể cho các khoảng trắng dài hay ít lại để cho nó tương đối chạy chữ từ nút thoát trên Caption về đầu của caption. Thế nhưng mình canh ở cửa sổ máy này thì chuyển qua cửa sổ của máy khác nó lại không như ý, hoặc mình làm các thủ tục cho form để nó Min, Max, Normal thì khi nó Max tức form show toàn màn hình thì dòng chữ nó chạy chỉ phân nửa cái caption, trông nó thật không đẹp mắt.
Em đã thử làm theo phương thức dựa vào sự kiện Resize của form, nhưng kể ra cách này cũng chỉ là "tạm bợ", không biết các Thầy có cao kiến gì không ạ?
Code của em:
[GPECODE=vb]Dim isZoom As Boolean, ZoomRate As Double, GetText As String
Dim OldWidth As Double, PrevStyle&
Private Sub UserForm_Initialize()
OldWidth = Width
GetText = Sheet1.Range("D11").Value
isZoom = True
End Sub
Private Sub UserForm_Resize()
Dim rpt As Long
ZoomRate = Width / OldWidth
rpt = Len(GetText) * (ZoomRate - 1)
fCaption = GetText & String(IIf(rpt < 0, 0, rpt), " ")
End Sub
Private Sub UserForm_Activate()
hWnd = FindWindow("ThunderDFrame", vbNullString)
If isZoom Then
PrevStyle = GetWindowLong(hWnd, GWL_STYLE)
SetWindowLong hWnd, GWL_STYLE, PrevStyle Or WS_SIZEBOX Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
isZoom = False
End If
'Debug.Print "F1: " & hWnd
fCaption = GetText
StartTimer
End Sub
[/GPECODE]