• Ẩn form a và hiện form b (đều có popup và modal)
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    tranthanhan1962 > 26-08-18, 11:02 AM

    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.
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    ongke0711 > 26-08-18, 12:23 PM

    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
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    mrsiro > 26-08-18, 12:53 PM

    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.
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    ongke0711 > 26-08-18, 01:31 PM

    (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ó.
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    mrsiro > 26-08-18, 02:43 PM

    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]
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    tranthanhan1962 > 26-08-18, 02:44 PM

    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
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    ongke0711 > 26-08-18, 03:37 PM

    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
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    mrsiro > 27-08-18, 09:19 AM

    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
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    ongke0711 > 27-08-18, 09:51 AM

    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
    ...
  • RE: Ẩn form a và hiện form b (đều có popup và modal)

    mrsiro > 27-08-18, 06:10 PM

    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