Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.
Bởi vậy mới nói là nó còn tùy thuộc vào màn hình người dùng đang chạy nữa ---> Màn hình sư phụ không bị nhưng màn hình em đang dùng thì lại có vấn đề (màn hình em đang dùng thuộc dạng màn hình rộng, độ phân giải hiện hành = 1280 x 800)
Em cũng thấy nó như vậy. Qua sử dụng em thấy điều chỉnh độ phân giải màn hình cũng có nhược điểm, do không tương thích, và có những máy độ phân giải giống như của Thầy 1280*800 khi chỉnh về 800*600 thì nó không bun ra hết màn hình mà nó co nhỏ 1 chút xíu.....
Chứ còn viết code kiểu thay đổi kích thước các control, em cho là không mấy hiệu quả ---> Chỉ mới có nhiêu đó control mà code của sư phụ đã dài thòng lòng rồi ---> Em đang nghĩ với 1 form có chừng 5 page + vài chục control thì... Ẹc... Ẹc... vã mồ hôi
Tôi đang nghĩ đến 1 dạng rút gọn code bằng vòng lặp duyệt qua từng control, nhưng còn đang bí chỗ này: Làm cách nào để biết Form đang ở trạng thái maximize?
Nếu gán được 1 biến FormState dạng boolean đại khái là form maximized thì true, ngược lại thì False, ta có thể làm như sau:
PHP:
Sub CtrlResize2()
With Fm1
Msize = .Width
Mrate2 = Msize / 600
FormState = "bí chỗ này"
For Each Ctl In .Controls
With Ctl
On Error Resume Next
.Top = .Top * IIf( FormState = True, 1 / Mrate2, Mrate2)
.Left = .Left * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Height = .Height * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Width = .Width * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Font.Size = .Font.Size * IIf(FormState = True, 1 / Mrate2, Mrate2)
End With
Next
End With
End Sub
Tôi đang nghĩ đến 1 dạng rút gọn code bằng vòng lặp duyệt qua từng control, nhưng còn đang bí chỗ này: Làm cách nào để biết Form đang ở trạng thái maximize?
Nếu gán được 1 biến FormState dạng boolean đại khái là form maximized thì true, ngược lại thì False, ta có thể làm như sau:
PHP:
Sub CtrlResize2()
With Fm1
Msize = .Width
Mrate2 = Msize / 600
FormState = "bí chỗ này"
For Each Ctl In .Controls
With Ctl
On Error Resume Next
.Top = .Top * IIf( FormState = True, 1 / Mrate2, Mrate2)
.Left = .Left * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Height = .Height * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Width = .Width * IIf(FormState = True, 1 / Mrate2, Mrate2)
.Font.Size = .Font.Size * IIf(FormState = True, 1 / Mrate2, Mrate2)
End With
Next
End With
End Sub
Sư phụ ơi, nếu minhthien đã phát hiện ra code zoom như ở trên thì em nghĩ không cần vòng lập nào ---> Đã kiểm tra, khi form zoom là toàn bộ control trên form cũng tự động chỉnh kích thước tương ứng ---> Quá khỏe!
Vấn đề còn lại là dựa vào độ phân giải màn hình để tìm tỉ lệ zoom thích hợp
Sư phụ ơi, nếu minhthien đã phát hiện ra code zoom như ở trên thì em nghĩ không cần vòng lập nào ---> Đã kiểm tra, khi form zoom là toàn bộ control trên form cũng tự động chỉnh kích thước tương ứng ---> Quá khỏe!
Vấn đề còn lại là dựa vào độ phân giải màn hình để tìm tỉ lệ zoom thích hợp
Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!
Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0 ' chỗ này cho bằng không để làm gì?'
H2 = UserForm1.Height ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1 ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub
Còn nữa:
PHP:
Private Sub UserForm_Resize()
If Me.Height <= H2 Then
Application.WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized ' xlNormal'
End If
End Sub
1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)
2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?
Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.
Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!
Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!
Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0 ' chỗ này cho bằng không để làm gì?'
H2 = UserForm1.Height ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1 ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub
Còn nữa:
PHP:
Private Sub UserForm_Resize()
If Me.Height <= H2 Then
Application.WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized ' xlNormal'
End If
End Sub
1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)
2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?
Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.
Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!
Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!
Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0 ' chỗ này cho bằng không để làm gì?'
H2 = UserForm1.Height ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1 ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub
Còn nữa:
PHP:
Private Sub UserForm_Resize()
If Me.Height <= H2 Then
Application.WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized ' xlNormal'
End If
End Sub
1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)
2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?
Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.
Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!
Đúng là hơi nhức đầu, nhưng "IP IẾC" gì đó nó có tác dụng của nó Thầy ơi, bởi một cái nó làm cho Form ở XL97 và XL2000 trở lên Thầy à.
Thầy nhìn dòng code trong module dưới đây thì sẽ thấy tác dụng của nó.
PHP:
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", sCaption) 'XL97
Else
hWndForm = FindWindow("ThunderDFrame", sCaption) 'XL2000
End If
Theo em nghĩ là vậy, không biết Thầy và mọi người nghĩ sao.
MinhThien coi kỹ đoạn code íp iếc, nó đặt điều kiện If Me.Height <= H2, chả có liên quan gì đến vẹc sông vẹc siếc cả. Biến H2 này lại chưa hề gán giá trị gì, cũng không khai báo, nên giá trị mặc định của nó không có (empty). Vậy Me.Height <= H2 luôn luôn False!
MinhThien coi kỹ đoạn code íp iếc, nó đặt điều kiện If Me.Height <= H2, chả có liên quan gì đến vẹc sông vẹc siếc cả. Biến H2 này lại chưa hề gán giá trị gì, cũng không khai báo, nên giá trị mặc định của nó không có (empty). Vậy Me.Height <= H2 luôn luôn False!
Í quên, em nói lộn rồi, cái form Min, Max đó đúng ra chỉ cần code này thôi:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
End Sub
Nhưng nó lại muốn khi nó resize thì cái windowstate tức là cửa sổ trong excel nó sẽ lớn hay nhỏ tương ứng khi nó zoom lớn hay zoom nhỏ thôi ạ!
Thầy thử nhé, thầy cứ để nguyên code như vậy, sau đó Thầy thử sẽ thấy:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0
H2 = UserForm1.Height
UserForm1.Height = H1
End Sub
Private Sub UserForm_Resize()
If Me.Height <= H2 Then
Application.WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlMinimized 'xlMaximized 'xlNormal
End If
End Sub
MinhThien chắc không đọc kỹ, hoặc đọc mà không hiểu gì cả. Đã nói là H2 chưa khai báo! chưa gán giá trị! nó empty! Thì dùng If so Form width với nó làm quái gì. Lúc nào cũng False!
MinhThien chắc không đọc kỹ, hoặc đọc mà không hiểu gì cả. Đã nói là H2 chưa khai báo! chưa gán giá trị! nó empty! Thì dùng If so Form width với nó làm quái gì. Lúc nào cũng False!
Uh ha, em xóa nó luôn cũng chạy không cần H hiếc gì hết! Nhưng tại sao tác giả của code này lại sử dụng chúng nhỉ? Lúc đầu em nghĩ cái Form ở trạng thái ban đầu ví dụ Normal được gán cho H1, khi Max thì trạng thái đó cũng cho là H1 luôn nên tác giả mới viết như vậy.
Uh ha, em xóa nó luôn cũng chạy không cần H hiếc gì hết! Nhưng tại sao tác giả của code này lại sử dụng chúng nhỉ? Lúc đầu em nghĩ cái Form ở trạng thái ban đầu ví dụ Normal được gán cho H1, khi Max thì trạng thái đó cũng cho là H1 luôn nên tác giả mới viết như vậy.
Bạn nên khai báo biến cho H1 và H2 là được, không phải vô lý mà người viết code lại viết như vậy đâu.
Public H1
Public H2
Sau đây là một ví dụ về Zoom, bạn tham khảo. Có lẽ phải cải tiến thêm code cho độ phân giải theo bác NDU nói trong ví dụ sau mới đúng, tuy nhiên hướng giải quyết đã có chỉ cần làm sao cho mình chủ động cái Form của mình mở lên thì độ phân giải máy tính tự điều chỉnh khi Form_Active. Thoát ra thì trở lại bình thường. Vấn đề này chắc các Sư phụ thêm vào.
Bạn nên khai báo biến cho H1 và H2 là được, không phải vô lý mà người viết code lại viết như vậy đâu.
Public H1
Public H2
Sau đây là một ví dụ về Zoom, bạn tham khảo. Có lẽ phải cải tiến thêm code cho độ phân giải theo bác NDU nói trong ví dụ sau mới đúng, tuy nhiên hướng giải quyết đã có chỉ cần làm sao cho mình chủ động cái Form của mình mở lên thì độ phân giải máy tính tự điều chỉnh khi Form_Active. Thoát ra thì trở lại bình thường. Vấn đề này chắc các Sư phụ thêm vào.
Vẫn bị một lỗi Learning_Excel ơi, đôi khi Min rồi Max, các control bị zoom ngược lại, Khi Nomal thì zoom lớn, khi Max bị zoom nhỏ!
Không biết khắc phục như thế nào? Chắc do mỗi lần Form_Resize chế độ Boolean vẫn hoạt động nên bị tình trạng xáo trộn khi Min (trong khi boolean cho 2 kết quả False or True còn Min, Max, Normal lại đến 3 động tác nên gây "hiệu ứng nghịch" chăng?)
Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.