一定期間更新がないため広告を表示しています
スポンサーサイト
- 2022/06/17
- -
- -
- -
- 記事URL https://plus-sys.jugem.jp/?eid=
Twitterはじめました。プラプラ | Twitter
【Access】Access2010でフォームのみ表示(制限ありの検証なしの暫定版)。
- 2014/07/24
- AccessTips
- comments(0)
- trackbacks(0)
- 記事URL https://plus-sys.jugem.jp/?eid=475
Accessのシステムってぱっと見た目でわかりますね。
何故なら、Access本体のメニューバーがあるから。
別にあってもいい(というか、あったほうが便利)と思うのですが、たまにVBチックにフォームのみを表示をしてほしい。という要望があります。
このフォームのみ表示ですが、従来のAccess2003では簡単に実現できました。
起動時にAccess本体を最小化するだけです。(ちなみにフォームはPOPUPに設定しておかないと、画面上に表示されません。あと、APIを使います。)
ただ、Access2010(+Windows7)だと簡単にはいきません。
タスクバーのアプリケーションアイコンをクリックすると、Accessの枠が復元されてしまいます。
下記、今回のケースと同等のお悩みかと思います。
Access2010でフォームのみを表示し、Access本体のウィンドウを表示しない方法はないでしょうか?
対応策の一例としては
Accessウィンドウを表示しない方法 Access2007以降版
Access本体をフォームと同サイズに調整し、その中でフォームを最大化して表示するという手法です。
なるほど、なるほど。ですが、他にも方法がないかなあ。
ということで、ちょっと考えてみました。
Access2010では、タスクバーのアプリケーションアイコンをクリックするとAccess本体が復元されてしまいます。で、あれば、復元されてもすぐに最小化すればいいんじゃないの?
と思ったのですが、Aceessには「アプリケーションが最大化された時」というイベントがありません。(アプリケーションを最大化するというコマンドならありますが。)
最大化を知るためには、Windowsのメッセージをフックする必要があるようです。
ならば、フォームをサブクラス化し、Windowsからの最大化命令(メッセージ)を監視し、最大化されれば、即最小化しちゃいましょう。(なんつー、大掛かりな。。。)
実装的には、起動時に最大化監視用のフォームを非可視でシステム終了まで起動しておきます。
<監視用のフォーム>
<フォームのイベント>
Private Sub Form_Open(Cancel As Integer)
'サブクラス化
OldWndProc = GetWindowLong(Application.hWndAccessApp, GWL_WNDPROC)
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Close()
'サブクラスを破棄する
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, OldWndProc
End Sub
<標準モジュール>
'*以下のソースは、
[VB6] ウィンドウプロシージャのサブクラス化サンプル v0.3を参考にさせていただきました。
Option Compare Database
Option Explicit
'指定されたウィンドウプロシージャにメッセージ情報を渡す関数の宣言
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'指定されたウィンドウの属性を取得する関数の宣言
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
'指定されたウィンドウの属性を変更する関数の宣言
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
' Access自身を最小化設定する為のAPI 宣言
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, _
ByVal nCmdShow As Long) As Long
Public Const SW_SHOWMINIMIZED = 2
Private Const WM_SIZE = &H5
Private Const SIZE_MAXHIDE = 4
Private Const SIZE_MAXIMIZED = 2
Private Const SIZE_MAXSHOW = 3
Private Const SIZE_MINIMIZED = 1
Private Const SIZE_RESTORED = 0
Public OldWndProc As Long
Public Const GWL_WNDPROC = -4
Const WM_SYSCOMMAND As Integer = &H112
Const SC_CLOSE As Long = 61536
'アプリケーションの最大化を監視する
Public Function WndProc(ByVal hwindow As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'メッセージ処理
Select Case message
'サイズ変更イベント
Case WM_SIZE
Select Case wParam
'ウィンドウ最大化時
Case SIZE_MAXIMIZED
'Accessアプリケーションを最小化する
Call ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)
End Select
'アプリケーション終了
Case WM_SYSCOMMAND
If wParam = SC_CLOSE Then
'終了ボタン以外からのアプリケーション終了は無効とする
MsgBox "システム終了ボタンからアプリケーションを終了してください。", 48, p_strAPPRICATION_TITLE
Exit Function
End If
End Select
'デフォルトメッセージ処理
WndProc = CallWindowProc(OldWndProc, hwindow, message, wParam, lParam)
End Function
<その他>
あと、システムの終了処理で、監視フォームを閉じることが必要です。
これで、それっぽく動くのですが、暫定版と名うったのは、エラー処理をしていないことはさることながら、ちょっとくせが強いためです。
サブクラス化の副作用として、サブクラス化を終了せずにアプリケーションを終了すると強制終了してしまいます。これはちょっと厳しい。とりあえずの対応策として、終了処理をキャンセルする処理も入れました。
あくまでも、システム内の終了処理ボタンで監視フォームを閉じてから、アプリケーションを終了させる必要があります。
あと、2画面を用いて、サブモニタに表示させることも難しいです。
フォームをサブモニタへ移動させても、再度開き直すとメインモニタに戻ってしまいます。(これは、Access2003の時も同じかもしれませんん。未確認)
等々ありますので、参考程度にどうぞ。
何故なら、Access本体のメニューバーがあるから。
別にあってもいい(というか、あったほうが便利)と思うのですが、たまにVBチックにフォームのみを表示をしてほしい。という要望があります。
このフォームのみ表示ですが、従来のAccess2003では簡単に実現できました。
起動時にAccess本体を最小化するだけです。(ちなみにフォームはPOPUPに設定しておかないと、画面上に表示されません。あと、APIを使います。)
ただ、Access2010(+Windows7)だと簡単にはいきません。
タスクバーのアプリケーションアイコンをクリックすると、Accessの枠が復元されてしまいます。
下記、今回のケースと同等のお悩みかと思います。
Access2010でフォームのみを表示し、Access本体のウィンドウを表示しない方法はないでしょうか?
対応策の一例としては
Accessウィンドウを表示しない方法 Access2007以降版
Access本体をフォームと同サイズに調整し、その中でフォームを最大化して表示するという手法です。
なるほど、なるほど。ですが、他にも方法がないかなあ。
ということで、ちょっと考えてみました。
要は復元(最大化)されても、最小化すればいいんじゃないの
Access2010では、タスクバーのアプリケーションアイコンをクリックするとAccess本体が復元されてしまいます。で、あれば、復元されてもすぐに最小化すればいいんじゃないの?
と思ったのですが、Aceessには「アプリケーションが最大化された時」というイベントがありません。(アプリケーションを最大化するというコマンドならありますが。)
最大化を知るためには、Windowsのメッセージをフックする必要があるようです。
ならば、フォームをサブクラス化し、Windowsからの最大化命令(メッセージ)を監視し、最大化されれば、即最小化しちゃいましょう。(なんつー、大掛かりな。。。)
実装的には、起動時に最大化監視用のフォームを非可視でシステム終了まで起動しておきます。
<監視用のフォーム>
<フォームのイベント>
Private Sub Form_Open(Cancel As Integer)
'サブクラス化
OldWndProc = GetWindowLong(Application.hWndAccessApp, GWL_WNDPROC)
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Close()
'サブクラスを破棄する
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, OldWndProc
End Sub
<標準モジュール>
'*以下のソースは、
[VB6] ウィンドウプロシージャのサブクラス化サンプル v0.3を参考にさせていただきました。
Option Compare Database
Option Explicit
'指定されたウィンドウプロシージャにメッセージ情報を渡す関数の宣言
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'指定されたウィンドウの属性を取得する関数の宣言
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
'指定されたウィンドウの属性を変更する関数の宣言
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
' Access自身を最小化設定する為のAPI 宣言
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, _
ByVal nCmdShow As Long) As Long
Public Const SW_SHOWMINIMIZED = 2
Private Const WM_SIZE = &H5
Private Const SIZE_MAXHIDE = 4
Private Const SIZE_MAXIMIZED = 2
Private Const SIZE_MAXSHOW = 3
Private Const SIZE_MINIMIZED = 1
Private Const SIZE_RESTORED = 0
Public OldWndProc As Long
Public Const GWL_WNDPROC = -4
Const WM_SYSCOMMAND As Integer = &H112
Const SC_CLOSE As Long = 61536
'アプリケーションの最大化を監視する
Public Function WndProc(ByVal hwindow As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'メッセージ処理
Select Case message
'サイズ変更イベント
Case WM_SIZE
Select Case wParam
'ウィンドウ最大化時
Case SIZE_MAXIMIZED
'Accessアプリケーションを最小化する
Call ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)
End Select
'アプリケーション終了
Case WM_SYSCOMMAND
If wParam = SC_CLOSE Then
'終了ボタン以外からのアプリケーション終了は無効とする
MsgBox "システム終了ボタンからアプリケーションを終了してください。", 48, p_strAPPRICATION_TITLE
Exit Function
End If
End Select
'デフォルトメッセージ処理
WndProc = CallWindowProc(OldWndProc, hwindow, message, wParam, lParam)
End Function
<その他>
あと、システムの終了処理で、監視フォームを閉じることが必要です。
これで、それっぽく動くのですが、暫定版と名うったのは、エラー処理をしていないことはさることながら、ちょっとくせが強いためです。
サブクラス化の副作用として、サブクラス化を終了せずにアプリケーションを終了すると強制終了してしまいます。これはちょっと厳しい。とりあえずの対応策として、終了処理をキャンセルする処理も入れました。
あくまでも、システム内の終了処理ボタンで監視フォームを閉じてから、アプリケーションを終了させる必要があります。
あと、2画面を用いて、サブモニタに表示させることも難しいです。
フォームをサブモニタへ移動させても、再度開き直すとメインモニタに戻ってしまいます。(これは、Access2003の時も同じかもしれませんん。未確認)
等々ありますので、参考程度にどうぞ。
Twitterはじめました。プラプラ | Twitter
スポンサーサイト
- 2022/06/17
- -
- -
- -
- 記事URL https://plus-sys.jugem.jp/?eid=
Twitterはじめました。プラプラ | Twitter
<< 【iOSアプリ】「パチンコCR哲也〜雀聖と呼ばれた男〜」が、な、なんとセールで300円です!
【デジモノ】インターリンクのグローバル固定IPがお安くなりました!自宅版やモバイルSIMをまとめてご紹介。 >>
【デジモノ】インターリンクのグローバル固定IPがお安くなりました!自宅版やモバイルSIMをまとめてご紹介。 >>
[関連エントリ 最新5]-
[Google PR]
[最新エントリ 5]-
- コメント
- コメントする(お気軽にどうぞ)
- この記事のトラックバックURL
- トラックバック
- カテゴリー
-
- Vista (15)
- AccessTips (74)
- 雑記 (68)
- セキュリティー (23)
- おもしろいサービス (5)
- tool (12)
- あまっちゃお (4)
- コンピュータ (66)
- CakePHP (25)
- VAIOTypeP[バイオタイプピー] (12)
- SQLServer (25)
- iPad (36)
- Apple Watch (5)
- AWS認定 (1)
- Azure (4)
- e-mobile (8)
- iOSアプリ (18)
- iPhone (2)
- iPhoneX (2)
- ipod touch (3)
- kindle (18)
- Monaca (1)
- Nexus7 (11)
- VAIO PRO (1)
- VAIO X[バイオ エックス] (1)
- VAIO Z (5)
- Windows10 (1)
- Windows8 (7)
- Windows9 (1)
- XPERIA Z1 (1)
- XperiaZ (6)
- 【全記事一覧】 (1)
- おすすめ本まとめ (2)
- クラウド (1)
- セール (3)
- デジモノ (24)
- 本(BOOK) (9)
- 腕時計 (1)
- プロフィール
- links
- recent comment
-
- 【Access】コンボボックス対応版。超簡単な帳票フォームでの矢印上下キー行移動。
⇒ 山田 裕樹 (04/28) - 【Access】vbaでhmacが正しく計算できた!!
⇒ まさ (06/01) - 【Access】AccessReportMailメール送信時のポートを25から587へ
⇒ わら (05/31) - 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
⇒ sazi (09/08) - 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
⇒ カメちゃん (07/31) - 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
⇒ 花姉 (03/17) - 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
⇒ 亀 (02/06) - 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
⇒ 管理人 (01/31) - 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
⇒ あ (01/31) - 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
⇒ K (11/13)
- 【Access】コンボボックス対応版。超簡単な帳票フォームでの矢印上下キー行移動。
- recent trackback
-
- 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
⇒ awgs Foundry (10/29) - 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
⇒ XMLがキライ。 (04/09) - Vistaから、LinkStation(NAS)にアクセスできません。
⇒ そのほかいろいろ (09/06)
- 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
- sponsored links