กระทู้เก่าบอร์ด อ.Yeadram
        
           3,665   15		  
          
					  
		    URL.หัวข้อ / 
		    URL
        
        รบกวนอาจารย์ช่วยแก้ไขโค้ดซ่อนปุ่ม[X]หน่อยค่ะ      
    
      หนูได้โค้ดนี้มาจากเน็ตเพื่อจะซ่อนปุ่ม [X]ของ Access
แต่มันซ่อนผิดตำแหน่งค่ะ คือแทนที่มันจะซ่อน[X] แต่มันไปซ่อนปุ่ม[-]แทนค่ะ ไม่ทราบว่าต้องแก้ไขอย่างไรคะ
==========
-Call ShowAccessCloseButton(False) เมื่อต้องการให้ซ่อน
-Call ShowAccessCloseButton(true) เมื่อต้องการให้โชว์
==========
    
    
  แต่มันซ่อนผิดตำแหน่งค่ะ คือแทนที่มันจะซ่อน[X] แต่มันไปซ่อนปุ่ม[-]แทนค่ะ ไม่ทราบว่าต้องแก้ไขอย่างไรคะ
Option Explicit
  
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_SYSMENU = &H80000
  
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Public Const SWP_FRAMECHANGED = &H20
  
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long _
    ) As Long
  
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 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
  
  
Function ShowAccessCloseButton(Show As Boolean) As Long
  
  Dim hwnd As Long
  Dim nIndex As Long
  Dim dwNewLong As Long
  Dim dwLong As Long
  
  hwnd = hWndAccessApp
  nIndex = GWL_STYLE
  
  Const wFlags = SWP_NOSIZE + SWP_NOZORDER + SWP_FRAMECHANGED + SWP_NOMOVE
  Const FLAGS_COMBI = WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SYSMENU
  
  dwLong = GetWindowLong(hwnd, nIndex)
  
  If Show Then
    dwNewLong = (dwLong Or FLAGS_COMBI)
  Else
    dwNewLong = (dwLong And Not FLAGS_COMBI)
  End If
  
  Call SetWindowLong(hwnd, nIndex, dwNewLong)
  Call SetWindowPos(hwnd, 0&, 0&, 0&, 0&, 0&, wFlags)
  
End Function
==========
-Call ShowAccessCloseButton(False) เมื่อต้องการให้ซ่อน
-Call ShowAccessCloseButton(true) เมื่อต้องการให้โชว์
==========
				15 Reply in this Topic. Dispaly 1  pages and you are on page number 1 
				
        
    2 @R14764    
        
  
      จริงๆ ตรงซ่อนปุ่ม 3 ปุ่มในPoperty  มันก็มีให้เลือกอยู่แล้วนะครับ แต่ต้องเลือก 2 จุด    
    
  
        
    3 @R14766    
        
  
      เรียน อ.Un การเซ็ทที่คุณสมบัติ มันจะซ่อนได้เฉพาะของฟอร์มหรือของรายงานเท่านั้นค่ะ  
แต่กรณีนี้ ต้องการซ่อนที่ขอบหน้าต่างใหญ่ของ Access เลยค่ะ
    
  แต่กรณีนี้ ต้องการซ่อนที่ขอบหน้าต่างใหญ่ของ Access เลยค่ะ
        
    4 @R14773    
        
  
      โค๊ดคุณ มาลี ใช้งานได้ดีนะครับ ไม่มีปัญหา ไม่เคยเขียนซ้อนปุ่มแบบนี้เหมือนกัน เพิ่งรู้ว่าต้องใช้ค่านี้ ขอบคุณครับ    
    
  
        
    5 @R14793    
        
  
      ผมลองกับ Access 2007 แล้วเป็นอย่างที่คุณมาลี ว่าไว้เลยครับ    
    
  
        
    6 @R14797    
        
  
      @ อาจารย์ PichaiTC ครับ เท่าที่ผมเดาปัญหาน่าจะเกิดจากอย่างนี้ครับ
MS Access ตั้งแต่ 2007 ขึ้นไป จะใช้เมนูเป็นแบบ Ribbon ซึ่งหากเราใช้ OS Windows XP เหมือนกับว่า Menu bar ของ WinXP จะไม่รองรับ สังเกตุได้จากมีรัน MS Access เวอร์ชั่น 2007 ขึ้นไป (ใช้เมนูเป็น Ribbon แล้ว) ปุ่มทั้ง 3 ที่ว่าจะมี Style ไม่เหมือนของ WinXP แต่หากรันบน OS Windows vista ขึ้นไป Menu Bar มันจะรองรับ Style Ribbon แล้ว ทำให้ใช้ได้
ซึ่งเมื่อใช้ API Call ค่ามาตรฐานของปุ่มทั้ง 3 บน MS Access 2007 ขึ้นไปที่รัยบน Windows XP จะเกิดปัญหาอย่างที่พบครับ เหมือนเป็นบักก็ว่าได้
ปัญหานี้ในเว็บก็มีคนถามกันพอสมควรว่าใช้แล้ว ปุ่ม x ไม่ซ่อน และเท่าที่ผมดูก็ยังไม่เห็นคำตอบที่ใช้ได้จริง แต่จะด้วยความบังเอิญ หรือฝีมือของคุณมาลี ก็ไม่รู้ (555 ล้อเล่น) ก็สามารถแก้ปัญหาแบบตรงไปตรงมาเลยครับ คือ ปิด Ribbon ไปก่อน แล้วค่อยใช้ฟังก์ชั่น ก็ทำให้ใช้งานฟังก์ชั่นทำงานได้ตามต้องการ ดังนี้:
If SysCmd(acSysCmdAccessVer) >= 12 Then 'แก้เป็นอย่างนี้ดีกว่า 11
DoCmd.ShowToolbar "Ribbon", acToolbarNo
Else
DoCmd.ShowToolbar "Menu Bar", acToolbarNo
End If
Call ShowAccessCloseButton(False)
แต่ข้อจำกัดคือเราก็จะใช้งานเมนู Ribbon ไม่ได้
ปล. คนที่ใช้ OS Windows Vista ขึ้นไป หรือใช้ MS Access ต่ำกว่า 2007 จะไม่พบปัญหานี้นะครับ
    
  MS Access ตั้งแต่ 2007 ขึ้นไป จะใช้เมนูเป็นแบบ Ribbon ซึ่งหากเราใช้ OS Windows XP เหมือนกับว่า Menu bar ของ WinXP จะไม่รองรับ สังเกตุได้จากมีรัน MS Access เวอร์ชั่น 2007 ขึ้นไป (ใช้เมนูเป็น Ribbon แล้ว) ปุ่มทั้ง 3 ที่ว่าจะมี Style ไม่เหมือนของ WinXP แต่หากรันบน OS Windows vista ขึ้นไป Menu Bar มันจะรองรับ Style Ribbon แล้ว ทำให้ใช้ได้
ซึ่งเมื่อใช้ API Call ค่ามาตรฐานของปุ่มทั้ง 3 บน MS Access 2007 ขึ้นไปที่รัยบน Windows XP จะเกิดปัญหาอย่างที่พบครับ เหมือนเป็นบักก็ว่าได้
ปัญหานี้ในเว็บก็มีคนถามกันพอสมควรว่าใช้แล้ว ปุ่ม x ไม่ซ่อน และเท่าที่ผมดูก็ยังไม่เห็นคำตอบที่ใช้ได้จริง แต่จะด้วยความบังเอิญ หรือฝีมือของคุณมาลี ก็ไม่รู้ (555 ล้อเล่น) ก็สามารถแก้ปัญหาแบบตรงไปตรงมาเลยครับ คือ ปิด Ribbon ไปก่อน แล้วค่อยใช้ฟังก์ชั่น ก็ทำให้ใช้งานฟังก์ชั่นทำงานได้ตามต้องการ ดังนี้:
If SysCmd(acSysCmdAccessVer) >= 12 Then 'แก้เป็นอย่างนี้ดีกว่า 11
DoCmd.ShowToolbar "Ribbon", acToolbarNo
Else
DoCmd.ShowToolbar "Menu Bar", acToolbarNo
End If
Call ShowAccessCloseButton(False)
แต่ข้อจำกัดคือเราก็จะใช้งานเมนู Ribbon ไม่ได้
ปล. คนที่ใช้ OS Windows Vista ขึ้นไป หรือใช้ MS Access ต่ำกว่า 2007 จะไม่พบปัญหานี้นะครับ
        
    7 @R14813    
        
  
      เคยใช้วิธีเซ็ตให้เมนูมัน Maximize เต็มจอแบบล้นขอบออกไปครับมองไม่เห็นปุ่มไรเลยนอกจากเมนูที่เราสร้างขึ้น    
    
  
        
    8 @R14814    
        
  
      ขอตัวอย่างบ้างได้ไหมครับ
ฝากเอาไว้ ที่ gmail access เลยครับ
ขอบคุณมาก
    
  ฝากเอาไว้ ที่ gmail access เลยครับ
ขอบคุณมาก
        
    9 @R14862    
        
  
      จากที่ลองใช้ จะติดปัญหาตรงที่ ไม่สามารถ Minimize ได้ครับ พอจะมีทางแก้หรือเปล่าครับ    
    
  
        
    10 @R14884    
        
  
      จริงๆ แล้ว ฟังก์ชั่นนี้เป็นแค่การซ้อนปุ่มเท่านั้น ไม่ได้เป็นการปิดคำสั่งการใช้งานจริง การปิดหรือการย่อหน้าต่างก็ยังทำได้หลายวิธี เช่น การคลิ๊กๆที่ Title Bar หรือการคลิ๊กขวาที่ Title Bar หรืออาจสร้างปุ่มบนฟอร์มแล้วใช้คำสั่งประมาณนี้แทน
Application.RunCommand acCmdAppMaximize
Application.RunCommand acCmdAppMinimize
Application.RunCommand acCmdAppRestore
    
  Application.RunCommand acCmdAppMaximize
Application.RunCommand acCmdAppMinimize
Application.RunCommand acCmdAppRestore
        
    11 @R14888    
        
  
      ขอบคุณครับคุณ TTT 
แล้วเราแก้ไข Code นี้ให้มันโชว์แค่ตัว Minimize ไม่ได้เลยใช่หรือเปล่าครับ
    
  แล้วเราแก้ไข Code นี้ให้มันโชว์แค่ตัว Minimize ไม่ได้เลยใช่หรือเปล่าครับ
        
    12 @R14889    
        
  
      อืม... เท่าที่ดูจากโค๊ดในบรรทัด
Const FLAGS_COMBI = WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SYSMENU
สามารถเปลี่ยนได้แค่นี้ครับ
ซ่อนแค่ปุ่ม Minimize:
Const FLAGS_COMBI = WS_MINIMIZEBOX
ซ่อนแค่ปุ่ม Maximize:
Const FLAGS_COMBI = WS_MAXIMIZEBOX
ซ่อนปุ่ม Mini และ Max
Const FLAGS_COMBI = WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
ซ่อนทั้ง 3 ปุ่ม (จริงๆจากโค๊ดเขียนแค่ตัวนี้ก็ได้เหมือนกัน)
Const FLAGS_COMBI = WS_SYSMENU
ฉนั้น แบบซ่อนปุ่ม [X] Close ตัวเดียวไม่มีครับ
ปล. เท่าที่เคยเห็นมีแค่วิธีการสร้าง Class Module ให้ไป Disable ปุ่ม [x] ให้ใช้งานไม่ได้เท่านั้น (เห็นปุ่มแต่ใช้งานไม่ได้) สำหรับการซ่อนปุ่ม [x] อย่างเดียวยังไม่รู้เหมือนกันครับ
    
  Const FLAGS_COMBI = WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SYSMENU
สามารถเปลี่ยนได้แค่นี้ครับ
ซ่อนแค่ปุ่ม Minimize:
Const FLAGS_COMBI = WS_MINIMIZEBOX
ซ่อนแค่ปุ่ม Maximize:
Const FLAGS_COMBI = WS_MAXIMIZEBOX
ซ่อนปุ่ม Mini และ Max
Const FLAGS_COMBI = WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
ซ่อนทั้ง 3 ปุ่ม (จริงๆจากโค๊ดเขียนแค่ตัวนี้ก็ได้เหมือนกัน)
Const FLAGS_COMBI = WS_SYSMENU
ฉนั้น แบบซ่อนปุ่ม [X] Close ตัวเดียวไม่มีครับ
ปล. เท่าที่เคยเห็นมีแค่วิธีการสร้าง Class Module ให้ไป Disable ปุ่ม [x] ให้ใช้งานไม่ได้เท่านั้น (เห็นปุ่มแต่ใช้งานไม่ได้) สำหรับการซ่อนปุ่ม [x] อย่างเดียวยังไม่รู้เหมือนกันครับ
        
    13 @R14891    
        
  
      รบกวนขอ Code Disable ปุ่ม [x] จะได้ไหมครับ ขอบคุณครับ  
    
    
   
    
        
    14 @R14893    
        
  
      ตัวอย่างมาจากเว็บ Microsoft เอง แต่ผมหาลิ้งค์ไม่เจอ เอาเป็นผมเขียนเองแล้วกันนะครับ
- สร้าง Class Module ใหม่ (Class Module ไม่ใช่ Module) ใส่โค๊ดดังนี้:
- เซฟ Class Module สมมุติชื่อ CloseCommand
- บนฟอร์ม อาจใช้ที่ Event > On Activate
Dim Dc As CloseCommand
Set Dc = New CloseCommand
Dc.Enabled = False ' Disable ปุ่ม [x]
 
- บนฟอร์ม ที่ Event > On Deactivate
Dim Dc As CloseCommand
Set Dc = New CloseCommand
Dc.Enabled = True ' Enable ปุ่ม [x]
ประมาณนี้ครับ
    
  - สร้าง Class Module ใหม่ (Class Module ไม่ใช่ Module) ใส่โค๊ดดังนี้:
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
 
Private Declare Function GetMenuItemInfo Lib "user32" Alias _
   "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As _
   Long, lpMenuItemInfo As MENUITEMINFO) As Long
 
Private Type MENUITEMINFO
    cbSize As Long
    fMask As Long
    fType As Long
    fState As Long
    wID As Long
    hSubMenu As Long
    hbmpChecked As Long
    hbmpUnchecked As Long
    dwItemData As Long
    dwTypeData As String
    cch As Long
End Type
 
Const MF_GRAYED = &H1&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060& 
 
Public Property Get Enabled() As Boolean
    Dim hwnd As Long
    Dim hMenu As Long
    Dim result As Long
    Dim MI As MENUITEMINFO
    
    MI.cbSize = Len(MI)
    MI.dwTypeData = String(80, 0)
    MI.cch = Len(MI.dwTypeData)
    MI.fMask = MF_GRAYED
    MI.wID = SC_CLOSE
    hwnd = Application.hWndAccessApp
    hMenu = GetSystemMenu(hwnd, 0)
    result = GetMenuItemInfo(hMenu, MI.wID, 0, MI)
    Enabled = (MI.fState And MF_GRAYED) = 0
End Property
 
Public Property Let Enabled(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 Property
- เซฟ Class Module สมมุติชื่อ CloseCommand
- บนฟอร์ม อาจใช้ที่ Event > On Activate
Dim Dc As CloseCommand
Set Dc = New CloseCommand
Dc.Enabled = False ' Disable ปุ่ม [x]
- บนฟอร์ม ที่ Event > On Deactivate
Dim Dc As CloseCommand
Set Dc = New CloseCommand
Dc.Enabled = True ' Enable ปุ่ม [x]
ประมาณนี้ครับ
        
    15 @R14894    
        
    
      ขอบคุณมากครับ ใช้ได้ดีเลยครับ  
    
    
   
    
      Time: 0.0614s
    
      
		
ตอนนี้หนูดัดแปลงใช้ร่วมกับคำสั่งซ่อนเมนู ปรากฏว่าได้ผลดี ดังนี้ค่ะ
If SysCmd(acSysCmdAccessVer) > 11 Then
DoCmd.ShowToolbar "Ribbon", acToolbarNo
Else
DoCmd.ShowToolbar "Menu Bar", acToolbarNo
End If
Call ShowAccessCloseButton(False)
ไม่ทราบว่ามันเกี่ยวข้องกันอย่างไร แต่ใช้แล้วมันได้ผลตามที่ต้องการ
คือซ่อนเมนูแล้ว ตามด้วยซ่อนปุ่มทั้ง3ปุ่ม แบบไม่เหลืออะไรมาหลอนอีกเลยค่ะ