กระทู้เก่าบอร์ด อ.Yeadram
14,322 36
URL.หัวข้อ /
URL
ป้องกันการปิดโปรแกรม?
ถ้าเราไม่ต้องการให้ user ปิดโปรแกรมโดยที่ไม่ได้ตั้งใจเราต้องทำอย่างไรครับ...
...แบบว่า user จะไปคลิ๊ก X ที่มุมขวาบนแล้ว จะให้มี msgbox ขึ้นมาถามว่า are u sure ถ้าไม่ sure ก็ไม่ต้องปิด... อะไรประมาณนี้หนะครับ
ทำได้ไหมครับ
...แบบว่า user จะไปคลิ๊ก X ที่มุมขวาบนแล้ว จะให้มี msgbox ขึ้นมาถามว่า are u sure ถ้าไม่ sure ก็ไม่ต้องปิด... อะไรประมาณนี้หนะครับ
ทำได้ไหมครับ
36 Reply in this Topic. Dispaly 2 pages and you are on page number 1
1 @R07484
http://support.microsoft.com/?id=300688
2 @R07485
ขอบคุณ... จะลองทำดู
3 @R07571
OK ครับลองแล้ว ใช้ได้ดี
....ขอบคุณมากเลยครับ
....ขอบคุณมากเลยครับ
4 @R07575
หนูลองเข้าไปศึกษาดูเหมือนกันค่ะ แต่ไม่ค่อยเข้าใจเพราะเป็นภาษาอังกฤษ พยายามลองทำดูแล้วแต่ไม่สำเร็จ เลยหยุดพักไว้ก่อน
ท่านใดจะช่วยแปลเป็นภาษาไทยให้ได้ก็จะดีไม่น้อย หรือคุณแดนจะกรุณาเอาไฟล์ตัวอย่างที่ทำ OK แล้วมาแจกให้เพื่อนสมาชิกได้ลองแกะทำตามดูบ้าง ก็จะดียิ่งขึ้นไปอีกค่ะ
ท่านใดจะช่วยแปลเป็นภาษาไทยให้ได้ก็จะดีไม่น้อย หรือคุณแดนจะกรุณาเอาไฟล์ตัวอย่างที่ทำ OK แล้วมาแจกให้เพื่อนสมาชิกได้ลองแกะทำตามดูบ้าง ก็จะดียิ่งขึ้นไปอีกค่ะ
5 @R07579
เป็นภาษาไทยนะครับ... ไม่ใช่ภาษาอังกฤษ
จริงๆแล้ว code ตามลิงค์ที่คุณสันติสุขให้มา นั้นเอาไปใช้ได้เลยครับ ไม่ต้องศึกษาเลย... แต่ต้องมีความรู้พื้นฐานการใช้งาน MsAccess ก่อนหนะครับ
จริงๆแล้ว code ตามลิงค์ที่คุณสันติสุขให้มา นั้นเอาไปใช้ได้เลยครับ ไม่ต้องศึกษาเลย... แต่ต้องมีความรู้พื้นฐานการใช้งาน MsAccess ก่อนหนะครับ
6 @R07581
ลองเข้าไปดูใหม่ที่ http://support.microsoft.com/?id=300688
ตามที่อาจารย์สันติสุขแนะนำ ก็ยังยืนยันว่าไม่พบภาษาไทย ดูเหมือนว่าจะต้องสร้าง module มาทำงานร่วมกับฟอร์มด้วยหรือไงนี่แหละ แต่ที่ไปต่อไม่ได้ก็เพราะไม่ทราบวิธีนำมาใช้ค่ะ
ตามที่อาจารย์สันติสุขแนะนำ ก็ยังยืนยันว่าไม่พบภาษาไทย ดูเหมือนว่าจะต้องสร้าง 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มาให้แล้วครับ สำหรับ ภาษาไทย
พิมพ์รหัสต่อไปนี้ลงในส่วน 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
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
นำ 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
...แบบว่า 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 จะคืนสถานะเดิม
ไม่ต้องไปใส่ทุกฟอร์ม ไม่ต้องถามบ่อย น่าจะไหวนะครับ
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 ครับ
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 ครับ เก๋กุ๊ดมากๆ....
Time: 0.3337s