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 đỡ.
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 đỡ.
Tôi nghĩ thế này:
- Đặt vài biến thể hiện kích thước cũ của form
- Khi thay đổi kích thước form, ta tính xem tỷ lệ thay đổi là bao nhiêu (bằng cách lấy kích thước mới chia kích thước cũ)
- Dùng vòng lập duyệt qua các control (trừ UserForm) rồi nhân kích thước các control theo tỷ lệ vừa tính ở trên
---------------
Nói thì nói vậy nhưng tôi nghĩ cái CommandButton đang được vẽ vừa vặn, giờ tự nhiên to lên gấp 10 lần thì nhìn chả giống cái gì cả
Mà cho hỏi: Tại sao lại có nhu cầu tăng zoom form chi vậy?
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 đỡ.
Điều chỉnh kích cở form bằng tay (Kéo ra rồi kéo vào) tương ứng vị trí và kích cở các control sẽ thay theo đến 1 mức nhất định nào đó được không anh?
Nếu đúng như vậy em sẽ gửi ví dụ cho anh nghiên cứu nhé. Nhưng cái này phải đụng đến class anh à.
Tôi nghĩ thế này:
- Đặt vài biến thể hiện kích thước cũ của form
- Khi thay đổi kích thước form, ta tính xem tỷ lệ thay đổi là bao nhiêu (bằng cách lấy kích thước mới chia kích thước cũ)
- Dùng vòng lập duyệt qua các control (trừ UserForm) rồi nhân kích thước các control theo tỷ lệ vừa tính ở trên
---------------
Nói thì nói vậy nhưng tôi nghĩ cái CommandButton đang được vẽ vừa vặn, giờ tự nhiên to lên gấp 10 lần thì nhìn chả giống cái gì cả
Mà cho hỏi: Tại sao lại có nhu cầu tăng zoom form chi vậy?
Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?
Điều chỉnh kích cở form bằng tay (Kéo ra rồi kéo vào) tương ứng vị trí và kích cở các control sẽ thay theo đến 1 mức nhất định nào đó được không anh?
Nếu đúng như vậy em sẽ gửi ví dụ cho anh nghiên cứu nhé. Nhưng cái này phải đụng đến class anh à.
Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?
Cám ơn bạn rất nhiều, bạn gửi File lên cho mình tham khảo nhé!
Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?
Tôi nghĩ cái này có liên quan đến độ phân giải màn hình
Vậy thay vì thay đổi kích thước form sao bạn không viết 1 code thay đổi độ phân giải màn hình (khi Form load) ---> Tôi cho rằng giải pháp này dể hơn
Code để thay đổi độ phân giải màn hình có đầy trên mạng, chỉ cần nhập từ khóa VBA code to change screen resolution
Thưa Thầy, em cũng tìm được code để có các nút Min, Max, Normal trong Form qua diễn đàn, thế nhưng khi Max thì các control không zoom theo tỉ lệ. Thầy giúp em nhé!
With Me
.Width = Application.Width
.Height = Application.Height
End With
Rồi tới các controls như đoạn code trên. Cũng phải tính dựa trên cái tỷ lệ MyRate:
MyRate = Application.Width / 800
Ghi chú: Xem file không làm được đâu. Phải biết form thiết kế trên màn hình bao nhiêu, kích thước từng control trong màn hình đó là bao nhiêu, . . . Rồi khi chuyển sang máy khác, màn hình khác mới thay bằng tỷ lệ. 800 ở trên là con số tạm tính, giả định là đang thiết kế ở màn hình 800 x 600, các control đã có kích thước vừa mắt khi max.
À, thiết kế khi max saocho các controls có kích thước và vị trí cân xứng trong màn hình max.
Quan điểm của tôi là chọn giải pháp đơn giản hơn để giải quyết vấn đề
Rắc rối mà minhthien gặp phải là khi mở form trên 1 máy tính có độ phân giải khác với độ phân giải trên máy tính thiết kế thì các control trên form có thể bị lệch
Vậy chỉ cần khi load form, kiểm tra xem độ phân giải hiện hành có đúng chuẩn hay không, nếu khác thì chạy code thay đổi độ phân giải ---> Sau khi đóng form (hoặc đóng file) ta trả mọi thứ về như lúc đầu
Code chuyển độ phân giải cũng khá đơn giản
PHP:
Private Declare Function GetDesktopWindow Lib "User32" () As Long
Private Declare Function GetWindowRect Lib "User32" (ByVal hWnd As Long, rectangle As RECT) As Long
Private Declare Function ChangeDisplaySettings Lib "User32" Alias _
"ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function EnumDisplaySettings Lib "User32" Alias _
"EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Type DEVMODE
dmDeviceName As String * CCDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
PHP:
Type RECT
x1 As Long
y1 As Long
x2 As Long
y2 As Long
End Type
PHP:
Function Change_SR(iWidth As Single, iHeight As Single)
Dim DevM As DEVMODE, EDS As Boolean, i As Long
Do
EDS = EnumDisplaySettings(0&, i&, DevM)
i = i + 1
Loop Until EDS = False
DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
DevM.dmPelsWidth = iWidth
DevM.dmPelsHeight = iHeight
ChangeDisplaySettings DevM, 0
End Function
PHP:
Function Get_SR() As String
Dim R As RECT
Application.Volatile
GetWindowRect GetDesktopWindow(), R
Get_SR = (R.x2 - R.x1) & "x" & (R.y2 - R.y1)
End Function
----------------
Đây là cái "sườn" ---> Để chạy code ta thêm đoạn nữa:
PHP:
Sub ChangeScreenResolution()
Dim NewSR
On Error GoTo ExitSub
NewSR = LCase(Application.InputBox("Go do phan giai vao day" & vbLf & _
"Vi du: 1025X768", Type:=2))
Change_SR CLng(Split(NewSR, "x")(0)), CLng(Split(NewSR, "x")(1))
ExitSub:
End Sub
- Chạy code này, sẽ xuất hiện InputBox cho nhập vào độ phân giải, ví du nhập: 1280x800
- Hàm Get_SR dùng để lấy giá trị độ phân giải hiện hành ---> Cái này dùng cho trường hợp ta muốn trả giá trị độ phân giải về nguyên gốc đương nhiên ta phải lưu giữ giá trị ban đầu
-----------------
Theo tôi, giải pháp này khoẻ hơn rất nhiều so với việc đi chỉnh kích thước của từng Control (mà chắc gì đã chính xác và thẩm mỹ)
Mọi thứ đã có sẳn, ráp vào file là chuyện của bạn
Quan điểm của tôi lại khác. Viết 1 ứng dụng không nên xen vào hoặc thay đổi hệ thống. Dù cho sau đó trả về cài đặt gốc đi nữa.
Lý do là người dùng không phải chỉ chạy 1 ứng dụng của mình! Thí dụ Form của MinhThien thiết kế đòi set về 1024 x 768, nhưng khi chạy đồng thời ứng dụng Corel, người ta muốn 1152 x 864 cơ! Chả lẽ bắt người ta làm đồng thời cái gì đó 1 cách khó chịu?
Hoặc 1 ứng dụng trời ơi khác đòi set về 800 x 600, thương ai bỏ ai đây?
Đã tìm ra Hàm lấy Screen Width của hệ thống. Vui lòng tải lại file dưới đây.
Quan điểm của tôi lại khác. Viết 1 ứng dụng không nên xen vào hoặc thay đổi hệ thống. Dù cho sau đó trả về cài đặt gốc đi nữa.
Lý do là người dùng không phải chỉ chạy 1 ứng dụng của mình! Thí dụ Form của MinhThien thiết kế đòi set về 1024 x 768, nhưng khi chạy đồng thời ứng dụng Corel, người ta muốn 1152 x 864 cơ! Chả lẽ bắt người ta làm cái gì đó đồng thời 1 cách khó chịu?
Đã tìm ra Hàm lấy Screen Width của hệ thống. Vui lòng tải lại file dưới đây.
Như em đã nói, code em đưa ở trên vẫn có khả năng trả mọi thứ về như cũ ---> Vậy thì cho dù sư phụ có chạy đồng thời nhiều ứng dụng, trong đó có 1 vài ứng dụng bắt buộc phải có độ phân giải khác thì... cũng chẳng hề gì (Wb Deactive ta sẽ trả về nguyên gốc)
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
(Em đang chơi 1 vài Game, chương trình của nó tự thay đổi độ phân giải màn hình, đến khi kết thúc, nó trả về như củ ---> em thấy đâu có ảnh hưởng gì)
Ẹc
Chơi game thì cắm đầu vào chơi, chứ làm việc thì chạy qua chạy lại liên tục. Mỗi lần chạy qua chạy lại nó chớp giựt màn hình 1 phát! Máy yếu yếu thì ngồi chờ ít nhất 1 vài giây. Có những PM trời ơi còn bắt set về 800 x 600 nữa cơ. Mà chẳng chịu trả về mới đau.
Tuy nhiên, ndu nói không phải không có lý. Để khắc phục cái sự tranh luận này, hãy viết bằng VB. VB dùng 1 đơn vị tính là % màn hình hệ thống. Khoẻ re.
Ẹc
Chơi game thì cắm đầu vào chơi, chứ làm việc thì chạy qua chạy lại liên tục. Mỗi lần chạy qua chạy lại nó chớp giựt màn hình 1 phát! Máy yếu yếu thì ngồi chờ ít nhất 1 vài giây. Có những PM trời ơi còn bắt set về 800 x 600 nữa cơ. Mà chẳng chịu trả về mới đau.
Tuy nhiên, ndu nói không phải không có lý. Để khắc phục cái sự tranh luận này, hãy viết bằng VB. VB dùng 1 đơn vị tính là % màn hình hệ thống. Khoẻ re.
Ah... còn 1 rắc rối nữa sư phụ à: Lúc Zoom form có 1 vài control bị che khuất, đúng ra là nó trôi tuốt xuống dưới cùng nên chẳng tải nào dùng được (cụ thể trong file sư phụ là cái CommnadButton)
Em nghĩ liệu có nên tạo cho form 2 cái Scrollbar không nhỉ?
Cái đó anh có thấy. Không phải bị trôi tuột đi đâu, mà là cái Listbox nó phản ứng rất kỳ cục với code trong sự kiện initialize. Những control khác thì không kỳ cục. Nếu pause code vài giây chạy tiếp thì lại được.
Nó không giảm kích thước và che khuất cái button đó. Nhưng với sự kiện Form_Resize thì lại ổn. Chả biết trên máy khác thì thế nào?
Quan điểm của tôi là chọn giải pháp đơn giản hơn để giải quyết vấn đề
Rắc rối mà minhthien gặp phải là khi mở form trên 1 máy tính có độ phân giải khác với độ phân giải trên máy tính thiết kế thì các control trên form có thể bị lệch
Vậy chỉ cần khi load form, kiểm tra xem độ phân giải hiện hành có đúng chuẩn hay không, nếu khác thì chạy code thay đổi độ phân giải ---> Sau khi đóng form (hoặc đóng file) ta trả mọi thứ về như lúc đầu
Code chuyển độ phân giải cũng khá đơn giản
-----------------
Theo tôi, giải pháp này khoẻ hơn rất nhiều so với việc đi chỉnh kích thước của từng Control (mà chắc gì đã chính xác và thẩm mỹ)
Mọi thứ đã có sẳn, ráp vào file là chuyện của bạn
Em cũng dùng code trên để chỉnh độ phân giải màn hình cho ứng dụng của em cả ở VB và Access nhưng vấn đề đang gặp của em mà chưa tìm ra cách đó là trước khi chạy phải kiểm tra độ phân giải màn hình, lưu độ phân giải màn hình đó vào 1 biến, khi thoát khỏi chương trình thì Reset nó lại....
Em cũng dùng code trên để chỉnh độ phân giải màn hình cho ứng dụng của em cả ở VB và Access nhưng vấn đề đang gặp của em mà chưa tìm ra cách đó là trước khi chạy phải kiểm tra độ phân giải màn hình, lưu độ phân giải màn hình đó vào 1 biến, khi thoát khỏi chương trình thì Reset nó lại....
Code tôi đưa ở trên có hàm kiểm tra độ phân giải hiện hành mà bạn (hàm Get_SR)---> Trước khi chạy code, dùng nó mà kiểm tra rồi lưu giá trị vào đâu đó
----------------------
Cái đó anh có thấy. Không phải bị trôi tuột đi đâu, mà là cái Listbox nó phản ứng rất kỳ cục với code trong sự kiện initialize. Những control khác thì không kỳ cục. Nếu pause code vài giây chạy tiếp thì lại được.
Nó không giảm kích thước và che khuất cái button đó. Nhưng với sự kiện Form_Resize thì lại ổn. Chả biết trên máy khác thì thế nào?
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)
nếu màn hình dạng wide thì phải lấy thêm 1 tỷ lệ nữa cho các controls là:
MRate3 = Fm1.Height/450
(450 là chiều cao trong màn hình thiết kế 1024 x 768)
Vậy cái gì liên quan đến bề ngang như Width và Left, thì nhân với MRate2, cái gì liên quan đến bề đứng như Height và Top thì nhân với MRate3.
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 đỡ.
Search trên mạng có code này hướng dẫn ZOOM, thế nhưng áp dụng cho EXCEL lại bị lỗi! Các Thầy test thử xem sao nhé!
PHP:
Public Sub zoom(frm As Form)
ResWidth = Screen.Width / Screen.TwipsPerPixelX
ResHeight = Screen.Height / Screen.TwipsPerPixelY
ScreenRes = ResWidth & "x" & ResHeight
zoomn = ResWidth / 1024 ''(1024 x 768 là do phân giai màn hình khi thiet ke)
zoomd = ResHeight / 768
Dim MYCONTROL As Control
For Each MYCONTROL In frm.Controls
If Not TypeOf MYCONTROL Is Line Then
MYCONTROL.Left = MYCONTROL.Left * zoomn
If Not TypeOf MYCONTROL Is ComboBox Then
MYCONTROL.Height = MYCONTROL.Height * zoomd
End If
MYCONTROL.Top = MYCONTROL.Top * zoomd
MYCONTROL.Width = MYCONTROL.Width * zoomn
MYCONTROL.Font.Size = MYCONTROL.Font.Size * zoomn
Else
MYCONTROL.X1 = MYCONTROL.X1 * zoomn
MYCONTROL.Y1 = MYCONTROL.Y1 * zoomn
MYCONTROL.X2 = MYCONTROL.X2 * zoomn
MYCONTROL.Y2 = MYCONTROL.Y2 * zoomn
End If
Next
frm.Width = frm.Width * zoomn
frm.Height = frm.Height * zoomd
End Sub
Private Sub Form_Load()
Call zoom(UserForm1)
End Sub
Search trên mạng có code này hướng dẫn ZOOM, thế nhưng áp dụng cho EXCEL lại bị lỗi! Các Thầy test thử xem sao nhé!
PHP:
Public Sub zoom(frm As Form)
ResWidth = Screen.Width / Screen.TwipsPerPixelX
ResHeight = Screen.Height / Screen.TwipsPerPixelY
ScreenRes = ResWidth & "x" & ResHeight
zoomn = ResWidth / 1024 ''(1024 x 768 là do phân giai màn hình khi thiet ke)
zoomd = ResHeight / 768
Dim MYCONTROL As Control
For Each MYCONTROL In frm.Controls
If Not TypeOf MYCONTROL Is Line Then
MYCONTROL.Left = MYCONTROL.Left * zoomn
If Not TypeOf MYCONTROL Is ComboBox Then
MYCONTROL.Height = MYCONTROL.Height * zoomd
End If
MYCONTROL.Top = MYCONTROL.Top * zoomd
MYCONTROL.Width = MYCONTROL.Width * zoomn
MYCONTROL.Font.Size = MYCONTROL.Font.Size * zoomn
Else
MYCONTROL.X1 = MYCONTROL.X1 * zoomn
MYCONTROL.Y1 = MYCONTROL.Y1 * zoomn
MYCONTROL.X2 = MYCONTROL.X2 * zoomn
MYCONTROL.Y2 = MYCONTROL.Y2 * zoomn
End If
Next
frm.Width = frm.Width * zoomn
frm.Height = frm.Height * zoomd
End Sub
Private Sub Form_Load()
Call zoom(UserForm1)
End Sub
Vấn đề này đã lâu, không biết các Thầy có giải quyết được chưa ah!!!!. Em có tạo một form khi bung toàn màn hình thì lại mất commandButton "Thoát". Có Thầy nào làm được chưa ah!!!????? KHông biết Anh Nghĩa đã làm được chưa?????
Vấn đề này đã lâu, không biết các Thầy có giải quyết được chưa ah!!!!. Em có tạo một form khi bung toàn màn hình thì lại mất commandButton "Thoát". Có Thầy nào làm được chưa ah!!!????? KHông biết Anh Nghĩa đã làm được chưa?????
Các Thầy có thể chỉnh code để hiện form Maximum và Minimum chứ không có Normal, vì em thấy có Normal cũng không trở về form theo thiết kế ban đầu. như anh Nghĩa nòi:
Hoàng Trọng Nghia:Lúc đầu ta thiết kế ở dạng Normal, tức là khi Max thì nó full màn hình, còn Nomal thì nó trở về với dạng thiết kế, trừ khi Form đang load mà ta resize thủ công kéo giản form thì nó normal theo kích thước đó trong lúc nó vẫn đang load, nếu unload thì nó cũng quay lại kích cỡ ban đầu chứ không giữ lại như các cửa sổ khác. Còn với Form ăn theo cửa sổ Application, khi mở ra, đồng ý là nó gần như full và khi ta max nó có giản ra vài milimet, khi normal thì cũng giảm vài milimet,
Trong bài này, tôi dùng thủ tục Zoom/Resize Form (code trong Form) của Anh Nguyễn Duy Tuân và thủ tục SetStyles của Thầy ndu96081631 (code trong Module) để trình bày form này, bạn có thể Min, Normal, Max và Resize UserForm, thậm chí bạn có thể đặt Icon trên caption của Form với thủ tục SetStyles.
sao em thêm mấy control khác, khi bung form lại mất một số control, như nút "thêm , sửa . xóa . thoát. Mán hình mấy em 14 Inch, độ phân giải 1280x800. Mong anh xem giúp.
sao em thêm mấy control khác, khi bung form lại mất một số control, như nút "thêm , sửa . xóa . thoát. Mán hình mấy em 14 Inch, độ phân giải 1280x800. Mong anh xem giúp.
Kakakaa, bạn không bị như thế mới là lạ đó, tỷ lệ form với tỷ lệ màn hình nó không tương thích nên khi nó zoom lên sẽ có một số nó chạy tuốt luốt xuống dưới chứ sao! Nhất là Frame và ListBox càng bị! Muốn được show toàn màn hình những control đó phải có code điều chỉnh và cân đối, canh giữa nữa chứ! Muốn thủ tục điều chỉnh không? Đóng học phí 1 tháng nhé! Kakakaka.
Trước tiên bạn làm 1 form với Size 400x600 (tạm gọi là size chuẩn hen) rồi tất cả các control bạn sắp xếp sao cho cân đối toàn bộ trên đó. (mé mé cho tức chơi nè kakaka)
Đóng học phí một chầu nhậu với vài anh em GPE hen! Mà đã đóng học phí thì phải nhắn tin riêng chứ hả? Show ra tự nhiên mình đóng học phí người khác lại hưởng không đâu được nè! Kakakaka
Đoạn code này chỉnh cho CommanButton, Frame, ListBox cân đối theo Form phải không ANH NGHĨA????
Mã:
ĩ''Thuat toan nam tai day!
Dim i As Long
For i = 1 To 4
With Me("CommandButton" & i)
.Top = Me.InsideHeight - .Height - 12
End With
Next
Frame1.Height = CommandButton1.Top - Frame1.Top - 12
ListBox1.Height = CommandButton1.Top - ListBox1.Top - 12
End Sub
Em thử thì Oke rồi(màn hình 14 inch)Vậy Không biết Form này có cân đối với màn hình 15.6 inch không Anh NGHĨA.
Với cái file này, khi bạn bấm nút Normal, bạn có thể nắm mép (cạnh) của Form (sẽ có mũi tên 2 chiều) các bạn co giản độ rộng, cao của form, các bạn sẽ thấy, các Control của form đều canh rất cân đối theo tỷ lệ của form lớn nhỏ tùy ý.
Đoạn code này chỉnh cho CommanButton, Frame, ListBox cân đối theo Form phải không ANH NGHĨA????
Mã:
'[COLOR=#ff0000][B]Thuat toan nam tai day! [/B][/COLOR]
Dim i As Long
For i = 1 To 4
With Me("CommandButton" & i)
.Top = Me.InsideHeight - .Height - 12
End With
Next
Frame1.Height = CommandButton1.Top - Frame1.Top - 12
ListBox1.Height = CommandButton1.Top - ListBox1.Top - 12
End Sub
sao em thêm mấy control khác, khi bung form lại mất một số control, như nút "thêm , sửa . xóa . thoát. Mán hình mấy em 14 Inch, độ phân giải 1280x800. Mong anh xem giúp.
Anh Nghĩa ơi, file em đưa chỉ có 4 CommandButton, 1 Frame, 1 ListBox. Vậy File có 8 CommandButton và 2 ListBox thì chỉnh code cân đối với Form làm sao Anh Nghĩa. Mong Anh chỉ giáo.
Em xin đưa file, Anh xem giúp em với, nhờ Anh chỉnh Code để Cân đối với Form. Còn trường hợp em đặt tên các CommandButton không phải là 1,2,3,4 mà là Cmd_Them,Cmd_Sua, Cmd_Xoa, Cmd_Thoat thì chỉnh cod làm sao hả Anh????
Em xin đưa file, Anh xem giúp em với, nhờ Anh chỉnh Code để Cân đối với Form. Còn trường hợp em đặt tên các CommandButton không phải là 1,2,3,4 mà là Cmd_Them,Cmd_Sua, Cmd_Xoa, Cmd_Thoat thì chỉnh cod làm sao hả Anh????
Vậy bạn đưa file lên là nút gì vậy? Sao toàn CommandButton không à! Vị trí có dúng như thế không? Số lượng thực tế thế nào để điều chỉnh chứ không lại đưa file lên mà hỏi nữa! Đưa Form thực tế đi bạn.
Lúc trước em đặt tên là : Cmd_sua,Cmd_Ghi, Cmd_Thoat, nhưng em đã chỉnh lại là CommandButton1, CommandButton2, CommandButton3 để chỉnh cân đối Form(nhưng không biết chỉnh). và 3 CommandButton này đặt nằm ngang với ListBox2 thì chỉnh code làm sao, mong Anh Chỉ giáo. Em hỏi ngoài là nếu tên mấy commandbutton không phải là số mà là tên chữ thì code như thế nào???
Lúc trước em đặt tên là : Cmd_sua,Cmd_Ghi, Cmd_Thoat, nhưng em đã chỉnh lại là CommandButton1, CommandButton2, CommandButton3 để chỉnh cân đối Form(nhưng không biết chỉnh). và 3 CommandButton này đặt nằm ngang với ListBox2 thì chỉnh code làm sao, mong Anh Chỉ giáo. Em hỏi ngoài là nếu tên mấy commandbutton không phải là số mà là tên chữ thì code như thế nào???
Nếu chỉ bố trí như thế thì, như tôi đã nói, tạo cái form chuẩn 402x600 rồi sắp xếp toàn bộ control lên đó sao cho hợp lý nhất, vậy thì cái cần điều chỉnh chỉ có mỗi cái ListBox2, còn mấy thứ khác không thay đổi.
Mã:
''Thuat toan nam tai day!
With ListBox2
.Height = Me.InsideHeight - .Top [COLOR=#ff0000][B]- 6[/B][/COLOR]
End With
Với 6 hay 12 hoặc nhỏ nhất là 0 (nếu là 0 thì khỏi trừ nha) tùy bạn muốn cái đáy của listbox nó cách đáy của Form như thế nào thôi.
Ôi trời ơi, cơ bản nó cũng giống với ListBox thôi, sao bạn không tự phân tích và làm? Khi bạn có khái niệm thực hiện thì với mọi Form bạn có thể điều khiển được.
''Thuat toan nam tai day!
Dim i As Byte
MultiPage1.Height = Me.InsideHeight - MultiPage1.Top - 6
With CommandButton1
.Top = MultiPage1.Height - 2 * .Height
For i = 2 To 6
Me("CommandButton" & i).Top = .Top
Next
ListBox1.Height = .Top - ListBox1.Top - 6
ListBox2.Height = .Top - ListBox2.Top - 6
End With
''Thuat toan nam tai day!
Dim i As Byte
MultiPage1.Height = Me.InsideHeight - MultiPage1.Top - 6
With CommandButton1
.Top = MultiPage1.Height - 2 * .Height
For i = 2 To 6
Me("CommandButton" & i).Top = .Top
Next
ListBox1.Height = .Top - ListBox1.Top - 6
ListBox2.Height = .Top - ListBox2.Top - 6
End With
So với bài trên thì bài này chính xác hơn nè! BMVNAH, tìm mãi cho cái InsideHeight nó "hiện hồn" về trong sự kiện Resize mà chả được (nó update chậm hơn so với Height) nên tạm dùng Height ở bài đó nhưng khó có thể đúng vì nếu MultiPage mà thay đổi Font Size là đuối. Giờ mới hoàn toàn yên tâm với code dưới đây:
Mã:
''Thuat toan nam tai day!
MultiPage1.Height = Me.InsideHeight - MultiPage1.Top - 6
[COLOR=#ff0000][B] DoEvents[/B][/COLOR]
Dim i As Byte
With CommandButton1
.Top = [COLOR=#0000ff]MultiPage1.Pages([/COLOR][COLOR=#ffa07a]MultiPage1.SelectedItem.Index[/COLOR][COLOR=#0000ff]).InsideHeight[/COLOR] - .Height - 6
For i = 2 To 6
Me("CommandButton" & i).Top = .Top
Next
ListBox1.Height = .Top - ListBox1.Top - 6
ListBox2.Height = .Top - ListBox2.Top - 6
End With
Chỉ cần thêm một tiểu xảo màu đỏ là "tự tin trong những ngày ấy"!
Anh Nghĩa chỉ em cách làm chữ chìm trong Form tàu Biển của Anh với. (#51) như chữ "Bên nhận phiếu vận chuyển", "Bên giao phiếu vận chuyển", "Người giao", "Người nhận"..v......v
Mong mọi người và Anh Nghĩa chỉnh dùm code ở page4, tại sao khi bung toàn màn hình thì các textBox1 ,2, 3 lại nằm trên các Label. Em xin gửi file đính kèm mong mọi người giúp em(Em dốt lắm-Mong mọi người chỉ rỏ)
Mong mọi người và Anh Nghĩa chỉnh dùm code ở page4, tại sao khi bung toàn màn hình thì các textBox1 ,2, 3 lại nằm trên các Label. Em xin gửi file đính kèm mong mọi người giúp em(Em dốt lắm-Mong mọi người chỉ rỏ)
Thật sự bạn quá ỷ lại và nếu không thì cái đầu bạn chả có linh hoạt để xử lý hay tính toán những con toán đại số đơn giản gì cả! Chỉ biết kêu gào giúp đỡ mà không biết vận dụng toán học vào việc nghĩ làm sao để dịch chuyển những cái đối tượng cần thiết.
Tôi chả có For ... Next gì cả để cho bạn dễ hình dung để sau này còn biết cách mà vận dụng, chứ kêu gào như thế tôi mệt mỏi lắm!
ĐỌC CÁC GHI CHÚ TẠI PHẦN CODE PHÍA DƯỚI CHO THẬT KỸ NHA BẠN.
Mã:
[B][COLOR=#0000ff] '''Thuật toán nằm tại đây![/COLOR][/B]
[COLOR=#0000ff] '''Tính chiều cao và chiều rộng của MultiPage1 sao cho fit với UserForm:[/COLOR]
MultiPage1.Width = Me.InsideWidth
MultiPage1.Height = Me.InsideHeight
[COLOR=#0000ff] '''Chạy tiếp sự kiện để cập nhật chiều cao bên trong (chiều cao "lọt lòng") của MultiPage1:[/COLOR]
DoEvents
[COLOR=#0000ff] '''Tính chiều cao bên trong của MultiPage1:[/COLOR]
Dim MtpInsideHeight As Single
MtpInsideHeight = MultiPage1.Pages(MultiPage1.SelectedItem.Index).InsideHeight
[COLOR=#0000ff] '''Căn cứ vào MtpInsideHeight tính chiều cao của các ListBox (đặc điểm chung là đáy của chúng sát đáy của [/COLOR][COLOR=#0000FF]MultiPage1, nên chúng được tính giống nhau)[/COLOR][COLOR=#0000ff]:[/COLOR]
ListBox1.Height = MtpInsideHeight - ListBox1.Top - 6
ListBox2.Height = MtpInsideHeight - ListBox2.Top - 6
ListBox3.Height = MtpInsideHeight - ListBox3.Top - 6
ListBox5.Height = MtpInsideHeight - ListBox5.Top - 6
ListBox6.Height = MtpInsideHeight - ListBox6.Top - 6
ListBox7.Height = MtpInsideHeight - ListBox7.Top - 6
[COLOR=#008000][B] '''TÍNH CÁC CONTROL TRONG PAGE4:
[/B][/COLOR] [COLOR=#ff0000] '''Cứ cái gì sát đáy của [/COLOR][COLOR=#ff0000]MultiPage1 [/COLOR][COLOR=#ff0000]thì tính trước, dần dần tính tiếp lên trên:[/COLOR]
[COLOR=#0000ff] '''Căn cứ vào MtpInsideHeight tính chiều cao của CmdSua:[/COLOR]
CmdSua.Top = MtpInsideHeight - CmdSua.Height - 6
With tb1
[COLOR=#0000ff] '''Căn cứ vào MtpInsideHeight tính chiều cao của TextBox tb1:[/COLOR]
.Top = MtpInsideHeight - .Height - 6
[COLOR=#0000ff] '''Vì Top của các TextBox còn lại đều bằng Top[/COLOR]
[COLOR=#0000ff] '''của tb1 [/COLOR][COLOR=#0000FF]nên phải quy chúng có Top bằng nhau[/COLOR][COLOR=#0000ff]:[/COLOR]
tb2.Top = .Top
tb3.Top = .Top
With lblTb1
[COLOR=#0000ff] '''Căn cứ vào Top của tb1, tính Top của các Label,[/COLOR]
[COLOR=#0000ff] '''chỉ cần dịch chuyển chiều cao Label lên phía trên[/COLOR]
[COLOR=#0000ff] '''so với TextBox tb1 là được:[/COLOR]
.Top = tb1.Top - .Height
[COLOR=#0000ff] '''Vì Top của các Label còn lại đều bằng Top[/COLOR]
[COLOR=#0000ff] '''của Label lblTb1 [/COLOR][COLOR=#0000FF]nên phải quy chúng có Top bằng nhau[/COLOR][COLOR=#0000ff]:[/COLOR]
lblTb2.Top = .Top
lblTb3.Top = .Top
[COLOR=#0000ff] '''Căn cứ vào Top của Label lblTb1 tính chiều cao của ListBox4:[/COLOR]
ListBox4.Height = .Top - ListBox4.Top - 2
End With
End With
Đó, code như thế đó, có khó gì không mà sao không suy nghĩ cho nó logic?
hôm nay CN các thành viên thường đi nhậu hoặc thư giãn bên gia đình , bạn cứ vào spam suốt ngày thì ai giải quyết ?
bạn làm ẩu mà không biết tự kiểm tra lấy thì chả ai muốn giúp
xem dòng này
Mã:
With CmdGhi2
.Top = MtpInsideHeight [COLOR=#ff0000][SIZE=6][B]=[/B][/SIZE][/COLOR] .Height - 6
Sao em làm theo cách của Anh Nghĩa thì zoom các control cân đối theo form, nhưng khi em gán code MultiPage_Change thì có sự khác biệt. Em xin đưa 2 file mong các AC xem giúp:
Với file MUltiPageNoChange thì rất Cân đối theo Form(ListBox1 và ListBox2 sát với các CommandButton)
Với file MultiPageChange thì khác, nếu mở lần đầu thì sát nhưng lần thứ 2, 3 thì không sát với CommandButton. (nếu mở Nhập-> Xuất -> Nhập -> xuất thì có sự khác biệt)
File MultiPageNoChange thì chuẩn rồi, nhưng sao em gán sự kiện MultiPage1_Change vào(Flie MultiPageChange) để tạo list cho ComboBox thì có sự khác biệt(không chuẩn về vấn đề cân đối Form). Mong các AC chỉ giáo.
Ở File Change, bạn mở Form thì hiện Page"Nhập", bạn sẻ thấy ListBox1 sát với các Nút "Sửa","Xóa" "Ghi vào Sheet", bạn nhấp chọn Page"Xuất" rồi quay lại chọn Page"Nhập" thì lúc này ListBox1 cách các nút "Sửa", "Xóa", "Ghi vào Sheet" một khoảng cở 8mm. Còn vấn đề trình bày, thì theo cá nhân mình rất thích cái đẹp, cân đối.
Ở File Change, bạn mở Form thì hiện Page"Nhập", bạn sẻ thấy ListBox1 sát với các Nút "Sửa","Xóa" "Ghi vào Sheet", bạn nhấp chọn Page"Xuất" rồi quay lại chọn Page"Nhập" thì lúc này ListBox1 cách các nút "Sửa", "Xóa", "Ghi vào Sheet" một khoảng cở 8mm. Còn vấn đề trình bày, thì theo cá nhân mình rất thích cái đẹp, cân đối.
Đẹp, tôi vẫn thấy xấu quá, và không tiện lợi chút nào.
Ah, còn nguyên nhân là do các list box ngay trên đó, List box luôn thay đổi chiều cao chút, đặc biệt khi có dòng dữ liệu trong nó --> bạn nên đặt nó vào 1 cái Frame, hay Panel nào đó thì sẽ khắc phục được.
Mình thấy khi mở lại Page"Nhập" đâu có dòng dữ liệu nào đâu mà nó cũng thay đổi, bạn thấy Form mình xấu, thế bạn có thể chỉ cho mình làm cho nó đẹp hay đưa mẫu nào đẹp để mình học hỏi chăng!!!!
Mình thấy khi mở lại Page"Nhập" đâu có dòng dữ liệu nào đâu mà nó cũng thay đổi, bạn thấy Form mình xấu, thế bạn có thể chỉ cho mình làm cho nó đẹp hay đưa mẫu nào đẹp để mình học hỏi chăng!!!!
Chưa cần có dữ liệu listbox đã luôn tự đổi kích thước rồi, nên bạn cần chú ý chút hoặc cho vào frame như tôi nói, hoặc là bạn phải tự tính lại chiều cao cho nó hợp lý
thế thì bạn bỏ thử MultiPage1_Change đi cũng được, vì change là có thay đổi nên nó tác động tới chiều cao list box, vì chiều cao list box tự bản thân nó cũng thay đổi chiều cao khi mỗi lần load rồi, nó phải tính lại cho phù hợp dữ liệu nên có sai số
Một cách để đảm bảo chiều cao của ListBox là bạn chọn trong thuộc tính của nó có mục IntergralHeight, hiện tại nó là True, nhưng nếu bạn đổi là False thì không bị thay đổi chiều cao của nó nữa.
Tuy nhiên, nó có thể sẽ bị khuất dòng cuối cùng. Để khắc phục điểm này, trong dữ liệu ta thêm 1 dòng rỗng ở dưới.
Tôi cũng nhắc nhở bạn lần cuối cùng là không được gửi bài hối thúc liên tục khi chưa có người giúp đỡ. Nếu như thế tôi tạm thời ban nick bạn trong 1 tuần lễ!