Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Ẩn form a và hiện form b (đều có popup và modal)
#11
Mình thấy có một sự bất logic của công việc của bạn. Dùng một lệnh mở form 1 rồi cho form 1 ẩn đi và mở form 2. VBA có một nguyên tắc là 1 đối tượng đang nhận tiêu điểm sẽ không xử lý được một số trạng thái của chính nó, mặc dù cú pháp lệnh là không sai. Vì vậy tại Event Form_load của một form lệnh Me.visible = False sẽ không được thực thi (Giống như một người không thể tự cởi truồng mình ở giữa chợ  018  )
Thực ra, bạn đâu cần phải mở form1 trước form2 rồi ẩn form1 tiếp tục mở form2, bạn có thể mở form2 trước rồi mở form1 sau với dạng ẩn (xử lý bằng lệnh của ongke0711)
Hoặc đưa tạo sub đưa lệnh:
       Docmd.OpenForm "Form1", , , , , acHidden
   Docmd.OpenForm "Form2"
Rồi đưa sub đó vào thẳng menu gọi form1.
Tất nhiên bạn có thể tạo 1 form 3 như ongke0711 làm form statup rồi chạy lệnh sau đó cho form3 tự close. lúc này lệnh sẽ nằm ở event OnUnload của form3. Bạn có thể dùng form3 làm form quảng cáo trong một thời gian ngắn.
Chúc bạn thành công.
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#12
Một góp ý khác về logic xử lý của bạn. Tôi thì hay dùng cách này:
Khi mở form Login sẽ kiểm tra bản quyền, nếu hợp lệ thì tiếp tục Load form Login, nếu không thì đóng nó lại mở Form "Đăng ký bản quyền". Đơn giản vậy thôi

Private Sub Form_Open(Cancel As Integer)
    If CoBanQuyen = False Then
        DoCmd.OpenForm "Form2", , , , , acDialog
        DoCmd.Close acForm, Me.Name
    Else
        'Tiep tục load form
    End If
End Sub
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#13
to tranthanhan, ko phải chạy lệnh mở form1 rồi ẩn form1 mở form2 mà logic của nó là thế này, form login là form startup khi form này load tiến hành check bàn quyển, nếu hợp lệ giữ nguyên form để người dùng đăng nhập, nếu ko hợp lệ tiến hành ẩn form login và mở form đăng ký.
To ongke, vì 1 số lí do dài dòng nên mình chỉ có thể dùng visible chứ ko dùng close được đó bạn.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#14
(26-08-18, 12:53 PM)mrsiro Đã viết: ...
vì 1 số lí do dài dòng nên mình chỉ có thể dùng visible chứ ko dùng close được đó bạn.

Nếu Access không hỗ trợ vụ ẩn modal form đang load thì bạn nghĩ giải pháp khác.
Không có giải pháp nào ngoài việc phải Invisible sao?
- Bạn có thể truyền các tham số trong form Login vô biến toàn cục.
- Bạn có thể truyền tham số qua OpenArgs
Như vậy thì khi Form đóng rồi bạn vẫn có thể tham chiếu đến các thông tin cần thiết.
Bạn chia sẽ giải thuật gì của bạn mà buộc phải Invisible cái form Login? Mọi người sẽ góp ý logic xử lý khác hợp lý hơn nếu có.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#15
lí do nó là thế này. thật ra cũng ko có gì to tát. Tại form login mình thiết kế user pass và 1 button đăng nhập, trước đây có thêm button thoát với lênh docmd.quit. Sau này mình thiết kế lại form thì bỏ nút thoát này, khi đó phát sinh vấn đề làm sao để người dùng thoát chương trình khi ko muốn đăng nhập, vì thế mình cho mở close button trên form này trong phần properties của form (trước đây khi còn nút thoát, close button và min max button đều bị disable).
Và mình viết thêm ở sự kiện unload của form là docmd.quit, mục đích khi người dùng ấn close button thì thoát luôn ứng dụng.
Vì thế cho nên tại form login chỉ có thể cho visible rồi hiện form đăng kí, chứ nếu dùng docmd.close thì thoát luôn ứng dụng.
[Hình: 20186c4c4d38-1625-4dc5-971f-adf885e2edee.png]
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#16
Bạn có thể tải demo của mình tại  Form Login để cho các bạn ngâm cứu . Ở đây mình thiết kế sau khi login form sẽ được ẩn dưới nền chứ không close.
Mình thiết kế sẳn phân quyền trên menu. Với form này bạn có thể xử lý cho từng quyền user, thay đổi mật khẩu cho từng user cũng như khóa user (demo có 3 quyền user nhưng bạn có thể xử lý nhiều hơn)
Ngoài ra có thể khóa phím + mở khóa shift, kiểm tra ID CPU máy để không cho di chuyển phần mềm đi nơi khác.
Tất cả user đều có mật khẩu mặt định là [1111]
Mật khẩu xử lý shift là [thuthuataccess] không quan tâm user
Để có thể chạy trên bất kỳ máy nào lệnh kiểm tra CPU đã được thêm ' để chuyển nhành chú thích
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#17
Hehe..thì ra cái vấn đề nằm ở cái nút Close. Đóng Form là thoát ứng dụng. Có nhiều cách để xử lý v/đ này của bạn. Tôi đưa ra 3 cách:

* C1:
Bạn đổi kiểu thiết kế khác đi. Không dùng nút Close của form mà tự thiết kế gần giống vậy, vẫn đảm bảo đẹp mà. Khi thiết kế Form - Border Style: None.

[Hình: 43555511374_7910cea62d_o.png]



* C2: Nút Close có thể Quit hay Close tuỳ trường hợp
- Dùng thiết kế hiện tại của bạn. 
- Sửa code của nút Close trên form. Tạo thêm 1 biến tính hiệu (Flag) để khi sự kiện Form_Close (hoặc Unload) kích hoạt sẽ kiểm tra biến tín hiệu này -> sau đó thực hiện Quit hay Close tuỳ theo nó.
- Khai báo trên Form 1 (frmLogin)


Mã PHP:
Option Compare Database
Option Explicit

Dim blnQuit 
As Boolean 

Mã PHP:
Private Sub Form_Close()
    If blnQuit True Then
        DoCmd
.Quit
    End 
If
End Sub 

Mã PHP:
Private Sub Form_Open(Cancel As Integer)

    Dim CoBanQuyen As Boolean
    
    CoBanQuyen 
False  'Thay đổi tham số test này tuỳ theo code check bản quyền'

    If CoBanQuyen False Then
        DoCmd
.OpenForm "Form2", , , , , acDialog
        blnQuit 
False
        DoCmd
.Close acForm"Form1"
    Else
        blnQuit True
    End 
If 


* C3:

Một giải pháp khác là vẫn giữ thiết kế như bạn đang làm thêm cái nút lệnh (cmdHidden) khi bấm là ẩn Form 1 và hiện Form 2 như bạn đã test thành công, cho nút đó ẩn đi.

Khi form Login mở, khi không có bản quyền thì sẽ gọi cái nút lệnh đó (nó gần giống như Sendkey vậy)


Private Sub Form_Open(Cancel As Integer)
    If CoBanQuyen = False Then
        Call cmdHidden_Click
    Else
        'Tiep tục load form
    End If
End Sub

- Chú ý code của nút ẩn form phải là Public Sub

Public Sub cmdHidden_Click()
    DoCmd.OpenForm "Form2", , , , , acDialog
    Me.Visible = False
End Sub
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn mrsiro , tieu_ngao
#18
Cám ơn ongke, mình đã giải quyết xong.
Mình xin phép hỏi thêm vấn đề này.

Tai form login, nút đăng nhập onclick mình thiết kế như sau:

Mã:
If nz(me.txtpass,0) = 0 then
msgbox "nhập pass"
me.txtpass.setforcus
end if



Tại txtpass, sự kiện keydown mình thiết kế như sau:
Mã:
if keycode = 13 then
dangnhap_click
end if

nếu txtpass null thì gọi sự kiện dangnhap_click. Lúc này msgbox hiện lên (ok), nhưng lại txtpass lại ko được forcus.
Còn nếu forcus đang ở nút đăng nhập mà mình ấn enter thì code chạy tốt, hoặc ấn click vào nút đăng nhập thì code chạy tốt.
Không biết lí do là tại vì sao.

http://www.mediafire.com/file/qmkpifp8y6...3.mdb/file
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#19
Khi con trỏ đang ở control nào thì nó không thể tự SetFocus cho chính nó. Thường thì phải dùng thủ thuật là dời con trỏ qua một control khác rồi mới SetFocus trở lại.
VD: 
If keycode=13 Then
  cmdDangNhap.SetFocus
  dangnhap_Click
End If

Một góp ý là nên bẫy lỗi toàn bộ một lần tại nút Đăng nhập, khỏi bẫy chỗ txtPass. Còn bẫy lỗi Null hoặc chuỗi zero length thì dùng như bên dứoi:

If Len(Nz(Me.txtPass,0)) = 0 Then
...
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan
#20
bạn hiểu sai ý mình rồi

Mã:
đây là sự kiện onlick của nút đăng nhập
If nz(me.txtpass,0) = 0 then
msgbox "nhập pass"
me.txtpass.setforcus
end if

Mã:
đây là tại sự kiện keydown của txtpass
if keycode = 13 then
dangnhap_click
end if
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] Cách tạo Cbo để lọc các mặt hàng trong Sub Form samacxanh 3 265 17-10-18, 10:33 AM
Bài mới nhất: vulhu06
  [Help] Điều khiển 1 form từ form khác tranthanhan1962 2 200 30-09-18, 05:57 PM
Bài mới nhất: tranthanhan1962
  Lỗi truyền tham số từ Form vào query cannguyen 2 135 20-09-18, 06:49 PM
Bài mới nhất: cannguyen
  [Hỏi] Load dữ liệu từ table lên form bằng lăng 2 187 19-09-18, 04:56 PM
Bài mới nhất: bằng lăng
  [Help] Form bị thừa một khoảng so với thiết kế NguyenDungAnh 3 248 16-09-18, 02:46 PM
Bài mới nhất: NguyenDungAnh

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line