ป้องกันการปิดโปรแกรม?
กระทู้เก่าบอร์ด อ.Yeadram

 14,086   36
URL.หัวข้อ / URL
ป้องกันการปิดโปรแกรม?

ถ้าเราไม่ต้องการให้ user ปิดโปรแกรมโดยที่ไม่ได้ตั้งใจเราต้องทำอย่างไรครับ...
...แบบว่า user จะไปคลิ๊ก X ที่มุมขวาบนแล้ว จะให้มี msgbox ขึ้นมาถามว่า are u sure ถ้าไม่ sure ก็ไม่ต้องปิด... อะไรประมาณนี้หนะครับ

ทำได้ไหมครับ

36 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R07484
2 @R07485
ขอบคุณ... จะลองทำดู
3 @R07571
OK ครับลองแล้ว ใช้ได้ดี
....ขอบคุณมากเลยครับ
4 @R07575
หนูลองเข้าไปศึกษาดูเหมือนกันค่ะ แต่ไม่ค่อยเข้าใจเพราะเป็นภาษาอังกฤษ พยายามลองทำดูแล้วแต่ไม่สำเร็จ เลยหยุดพักไว้ก่อน
ท่านใดจะช่วยแปลเป็นภาษาไทยให้ได้ก็จะดีไม่น้อย หรือคุณแดนจะกรุณาเอาไฟล์ตัวอย่างที่ทำ OK แล้วมาแจกให้เพื่อนสมาชิกได้ลองแกะทำตามดูบ้าง ก็จะดียิ่งขึ้นไปอีกค่ะ

5 @R07579
เป็นภาษาไทยนะครับ... ไม่ใช่ภาษาอังกฤษ
จริงๆแล้ว code ตามลิงค์ที่คุณสันติสุขให้มา นั้นเอาไปใช้ได้เลยครับ ไม่ต้องศึกษาเลย... แต่ต้องมีความรู้พื้นฐานการใช้งาน MsAccess ก่อนหนะครับ
6 @R07581
ลองเข้าไปดูใหม่ที่ http://support.microsoft.com/?id=300688
ตามที่อาจารย์สันติสุขแนะนำ ก็ยังยืนยันว่าไม่พบภาษาไทย ดูเหมือนว่าจะต้องสร้าง module มาทำงานร่วมกับฟอร์มด้วยหรือไงนี่แหละ แต่ที่ไปต่อไม่ได้ก็เพราะไม่ทราบวิธีนำมาใช้ค่ะ



7 @R07583
ขออนุญาติ เอาภาพภาษาไทยมาให้ครับ


8 @R07585
คลิกโมดูลเมื่อต้องการสร้างโมดูลใหม่
พิมพ์รหัสต่อไปนี้ลงในส่วน Declarations:
Option Compare Database
Option Explicit

Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, _
    ByVal bRevert As Long) As Long

Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As _
    Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long

Const MF_GRAYED = &H1&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060&

Public Function SetEnabledState(blnState As Boolean)
    Call CloseButtonState(blnState)
    Call ExitMenuState(blnState)
End Function

'ถ้าใช้ MS ACCESS 2007 ขึ้นไป ใช้ ExitMenuState ไม่ได้
'Disable the Menu Option
Sub ExitMenuState(blnExitState As Boolean)
    Application.CommandBars("File").Controls("Exit").Enabled = blnExitState
End Sub

'Disable the Close Button Option
Sub CloseButtonState(boolClose As Boolean)
    Dim hWnd As Long
    Dim wFlags As Long
    Dim hMenu As Long
    Dim result As Long
       
    hWnd = Application.hWndAccessApp
    hMenu = GetSystemMenu(hWnd, 0)
    If Not boolClose Then
        wFlags = MF_BYCOMMAND Or MF_GRAYED
    Else
        wFlags = MF_BYCOMMAND And Not MF_GRAYED
    End If
    
    result = EnableMenuItem(hMenu, SC_CLOSE, wFlags)
End Sub


สร้างฟอร์มใหม่ที่ มีลักษณะดังต่อไปนี้:

Form: frmSetCloseState
   -------------------------
   Caption: Set Close State

   Command button
   ------------------------
   Name: cmdEnable
   Caption: Enable
   OnClick: Event Procedure

   Command button
   ------------------------
   Name: cmdDisable
   Caption: Disable
   OnClick: Event Procedure

ในมุมมองออกแบบ คลิกขวาเปิดใช้งานปุ่มคำสั่ง แล้วคลิกสร้างเหตุการณ์บนเมนูที่ปรากฏ
คลิกตัวสร้างโค้ดคลิกตกลงแล้ว พิมพ์รหัสต่อไปนี้ในโมดูผลลัพธ์:
Private Sub cmdEnable_Click()
    Call SetEnabledState(True)
End Sub

เพิ่มรหัสต่อไปนี้สำหรับการปิดใช้งานปุ่มคำสั่ง
Private Sub cmdDisable_Click()
    Call SetEnabledState(False)
End Sub


copyมาให้แล้วครับ สำหรับ ภาษาไทย
9 @R07586
คือเวลาที่เข้าไปเวปของ Microsoft มันเก่งตรงมันจะตรวจว่าเราอยู่ประเทศไหน (มั้ง) ถ้าเราตั้งว่าอยู่ไทย มันก็จะแสดงหน้าเพจที่แปลเป็นไทย (ด้วยโปรแกรมของเขาเอง) ถ้าเราอยู่ที่อื่น มันก็จะแสดงเป็นภาษาอื่น ... แต่ในความเห็นผม ผมหัวสูง อ่านภาษาไทย(ที่มันแปลแล้ว)ปวดหัวทุกที
10 @R07587
ใช้คำสั่งนี้ก็ได้ครับ ผมใช้อยู่

Dim Msg, Style, Title, Response, MyString
           
    Msg = "ใส่ข้อความที่ต้องการแจ้งให้ทราบ"
    Style = vbYesNo + vbCritical + vbDefaultButton1
    Title = "ใส่ข้อความที่แสดงบนหัวข้อความ"
       
     Response = MsgBox(Msg, Style, Title)
      
      If Response = vbYes Then
        MyString = "Yes"
        DoCmd.Quit                             ' Exit Program    
        End If

หรือ
if (msgbox ("คุณต้องการออกจากโปรแกรมใช่ไหม ?",vbCritical+vbYesno,"โปรดยืนยัน")) = vbYes Then
Docmd.Quit
End If
11 @R07588
ของคุณ Sak แก้ไขนิดหน่อยก็ใช้ได้ครับ

นำ Code ใส่ไว้ที่ Form_Unload

Dim Msg, Style, Title, Response, MyString
            
    Msg = "ใส่ข้อความที่ต้องการแจ้งให้ทราบ"
    Style = vbYesNo + vbCritical + vbDefaultButton1
    Title = "ใส่ข้อความที่แสดงบนหัวข้อความ"
       
     Response = MsgBox(Msg, Style, Title)
    
     If Response = vbYes Then
        MyString = "Yes"
        DoCmd.Quit                             ' Exit Program     
     else
        Cancel=true
     End If

12 @R07589
จริงๆ ถ้าเราไม่ต้องให้ ตอบ No แล้วมีเงื่อนไขอย่างอื่นต่อ คำสั่ง else ที่เพิ่มเข้ามาไม่จำเป็นต้อง ใส่ ก็ได้นิครับ
13 @R07590
ของคุณ Sak นั้นก็ใช้ได้ แต่ถ้าเรามี 10 ฟอร์ม 3 รายงาน คำถามคือเราต้องใส่โค้ดนี้กี่ที่ ? แล้วทุกครั้งที่ปิดแต่ละฟอร์ม มันก็จะถามเสมอ คนที่ใช้งานประจำ ใช้แล้วจะไม่สะดวกแน่นอนครับ
14 @R07591
ถ้าเราไม่ต้องการให้ user ปิดโปรแกรมโดยที่ไม่ได้ตั้งใจเราต้องทำอย่างไรครับ...
...แบบว่า user จะไปคลิ๊ก X ที่มุมขวาบนแล้ว จะให้มี msgbox ขึ้นมาถามว่า are u sure ถ้าไม่ sure ก็ไม่ต้องปิด... อะไรประมาณนี้หนะครับ

ก้อเลย apply มาใช้กับเหตุการณ์ Form_unload
เผื่อว่า user ไป click ปุ่มปิด Access window
แล้ว form ที่เปิดอยู่ จะถูก close โดยไม่ตั้งใจ จึงเพิ่ม else เข้าไป เพื่อยกเลิก
ได้ ในกรณีผู้ใช้ตอบ No
   
15 @R07592
เรียน อ.สันติสุข ครับ ผมไม่ได้ใช้คำสั่งนี้ในทุกฟอร์มที่ทำครับก็เลยไม่ค่อยมีปัญหาเท่าไร ใช่้แต่เฉพาะ ฟอร์มหลัก เท่านั้น ครับ แต่ทำไว้เป็น Function Module เลยก็ดีครับ แบบที่ อ.แนะนำ จะสะดวกกว่า เวลาจะใช้ก็แค่ Call เรียก สะดวกดีครับ
16 @R07593
เรียนคุณ ditasilk ขอบคุณครับที่แนะนำ ผมจะลองไปปรับใช้ดูครับ
17 @R07594
พอดีจะเสนออีกวิธี เพื่อแก้ปัญหา การใส่ code ทุกฟอร์ม
1 สร้่าง ฟอร์มเปล่า หรือ ฟอร์มทีมี Background เป็น image file ก็ได้
   สมมุติชื่อ frmstartup
2 เหตุการณ์ form_activate ให้ maximized =docmd.maximized
3 เหตุการ์ Form_Unload ให้ใส่ code คุณ sak R07588 เข้าไป
4 ทุกครั้ง ที่จะออกจาก Access window
   frmstartup จะถูก unload จะขึ้นข้อความมาถาม ว่าจะออกจาก โปรแกรมหรือไม่ ถ้า yes ก็ออก แต่ถ้า no จะคืนสถานะเดิม


ไม่ต้องไปใส่ทุกฟอร์ม ไม่ต้องถามบ่อย น่าจะไหวนะครับ
18 @R07607
จะขอ disable ปุ่ม Maximize/Restore down(ปุ่มที่อยู่ตรงกลาง) ด้วยได้ไหมครับ
19 @R07612
เห็นแต่โค้ดที่ซ่อนปุ่ม Minimize, Restore/Maximize, Close ทั้ง 3 ปุ่มไปเลย

    Private Const GWL_EXSTYLE = (-20)
    Private Const GWL_STYLE = (-16)

    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_SYSMENU = &H80000

    Private Const HWND_TOP = 0
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_FRAMECHANGED = &H20
    Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED

    Private Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) _
    As Long
    Private Declare Function GetWindowLong Lib "user32" _
    Alias "GetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long


    Sub HideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle And Not WS_SYSMENU
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub


    Sub UnHideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle Or WS_SYSMENU
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub

จะซ่อนก็เรียก call HideAccessCloseButton จะไม่ซ่อนก็เรียก call UnHideAccessCloseButton ครับ
20 @R07614
OK ครับ เก๋กุ๊ดมากๆ....
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2922s