Microsoft Access 掲示板

ポップアップフォームで移動後の位置を自動で取得したい

5 コメント
views
4 フォロー

よろしくお願いいたします。

ACCESSのポップアップフォームをドラッグして移動した際に、移動した事を検知したいと考えています。
イベントでは見つけられなかったのですが、方法などございましたら教えてください。
よろしくお願いいたします。

チョコ
作成: 2022/12/08 (木) 02:23:48
通報 ...
1

基本的には無理かと。
Win API を駆使すれば可能かもしれませんが、難易度はかなり高そう。

2
hiroton 2022/12/08 (木) 17:59:48 a043c@f966d

いっそタイトルバー無くしてフォームのMouseMoveイベント使ってフォームをドラッグ移動できるようにするとか

3

 なるほど、その手がありましたね。
下記で、方法を紹介してます。

タイトルバー以外をドラッグしてフォームを移動させる - hatena chips

4

上記リンク先は64ビット非対応なので、64ビットにも対応したものに下記得ました。

フォーム上にラベルとコマンドボタンを配置します。
フォームプロパティの「境界線スタイル」を「なし」に設定してタイトルバーを非表示にします。

フォームのモジュールに下記のコードを設定します。

Option Compare Database
Option Explicit
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As Long
Private Declare PtrSafe Sub ReleaseCapture Lib "user32.dll" ()

Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2

Private Sub コマンド1_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Private Sub ラベル0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button And acLeftButton Then
        ReleaseCapture
        Call SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub

Private Sub ラベル0_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print "ドラッグ移動しました", Me.WindowLeft, Me.WindowTop
End Sub

上記でラベル部分をクリックしてドラッグするとフォームを移動できます。
マウスボタンを開放すると、イミディエイトウィンドウに、移動後のフォームの位置が出力されます。
Accessウィンドウのクライアントエリアの左上を原点とする座標位置になります。

5
チョコ 2022/12/13 (火) 17:54:19 7a4e5@dab18

なるほど、そり記事は見たのですが思いつきませんでした。
ありがとうございました。