Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


865 / 2272 ツリー ←次へ | 前へ→

【9742】フォームを新規作成し、フォーム詳細のOnMouseDownにイベントプロシージャを... たくゾ〜 07/8/8(水) 22:53 質問[未読]
【9743】新規作成フォームにOnMouseDownプロシジャを... 小僧 07/8/9(木) 10:49 回答[未読]
【9746】Re:新規作成フォームにOnMouseDownプロシジ... たくゾ〜 07/8/9(木) 23:49 お礼[未読]
【9749】Re:新規作成フォームにOnMouseDownプロシジ... たくゾ〜 07/8/13(月) 12:00 質問[未読]
【9752】Re:新規作成フォームにOnMouseDownプロシジ... 小僧 07/8/13(月) 19:10 回答[未読]
【9753】Re:新規作成フォームにOnMouseDownプロシジ... たくゾ〜 07/8/13(月) 21:58 お礼[未読]

【9742】フォームを新規作成し、フォーム詳細のOn...
質問  たくゾ〜  - 07/8/8(水) 22:53 -

引用なし
パスワード
   はじめて投稿させていただきます。よろしくお願い致します。

題名:フォームを新規作成し、フォーム詳細のOnMouseDownにイベントプロシージャを入れてXYを取得したい

【やりたい事】
1)フォームを作る : Set ctl_frm = CreateForm()
2)ラベルを作る  : CreateControl("test", acLabel, acDetail, , , 100 , 100, 100, 100)
3)新規フォームの詳細で、マウスボタンを押した場所に、ラベルを移動する
  ctl_frm.Section(acDetail).OnMouseDown = "= Detail_MouseDown(Button,Shift,X,Y)"

1)2)は動作するのですが、3)が動きません。


◆標準モジュール

1)3)

Sub make_Form()
Dim ctl_frm As Form
  Set ctl_frm = CreateForm()
  With ctl_frm
    .Caption = "test"
    .Width = 11907       '[twip]
    .Section(acDetail).Height = 8505
(省略)
    .Section(acDetail).OnMouseDown = "= Detail_MouseDown(Button,Shift,X,Y)"
                         ↑3)【上手に動かした】
  End With
  DoCmd.Save , ctl_frm.Caption
  DoCmd.OpenForm ctl_frm.Name, acNormal
  DoCmd.Restore
End Sub

-------------------------------------------------------------------

2)

Sub make_Label()
Dim ctl_Label As Label
Dim i, L_max As Integer

DoCmd.OpenForm "test", acDesign
L_max = 1
For i = 0 To L_max
  Set ctl_Label = CreateControl("test", acLabel, acDetail, , , 100 + 200 * i, 100, 100, 100)
  ctl_Label.Name = "L" & Format(i, "000")
  With ctl_Label
    .SpecialEffect = 1
    .BackStyle = 1
(省略)
    .OnClick = "= Label_onClick()"
    .OnMouseDown = "= Label_OnMouseDown()"
    .OnMouseUp = "= Label_OnMouseUp()"
  End With
Next
  DoCmd.Save , ctl_frm.Caption
  DoCmd.OpenForm ctl_frm.Name, acNormal
  DoCmd.Restore
End Sub

-------------------------------------------------------------------

【9743】新規作成フォームにOnMouseDownプロシジャ...
回答  小僧  - 07/8/9(木) 10:49 -

引用なし
パスワード
   ▼たくゾ〜 さん:]
こんにちは。

まず…。
こちらの掲示板では容認されておりますが、
他所掲示板ではマルチポストを認めていない事もあります。

掲示板を利用する上でのマナーですので
こちらか、向こうかどちらかを削除、またはCloseする形にしましょう。


> 題名:フォームを新規作成し、フォーム詳細のOnMouseDownに
> イベントプロシージャを入れてXYを取得したい

こちらについてですが、

Sub Make_Form2()
Const F_Name = "test"
Dim Temp_Name As String

  With CreateForm()
    Temp_Name = .Name
    .HasModule = True
    .Caption = F_Name
    .Width = 11907       '[twip]
    .Section(acDetail).Height = 8505
    .Section(acDetail).OnMouseDown = "[Event Procedure]"
  End With
  
  With VBE.ActiveVBProject.VBComponents.Item("Form_" & Temp_Name).CodeModule
    .InsertLines 4, "Private Sub 詳細_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)"
    .InsertLines 5, ""
    .InsertLines 6, "Msgbox ""座標X:"" & x & "" 座標Y:"" & y "
    .InsertLines 7, ""
    .InsertLines 8, "End Sub"
  End With
  
  DoCmd.Save acForm, Temp_Name
  DoCmd.Close acForm, Temp_Name
  DoCmd.Rename F_Name, acForm, Temp_Name
  DoCmd.OpenForm F_Name, acNormal
  DoCmd.Restore
  
End Sub


のようなコードで新規に作成したフォームの
OnMouseDown イベントが発生する事が確認できるかと思われます。


> 3)新規フォームの詳細で、マウスボタンを押した場所に、ラベルを移動する

についてはご自身で工夫されてみて下さい。

【9746】Re:新規作成フォームにOnMouseDownプロシ...
お礼  たくゾ〜  - 07/8/9(木) 23:49 -

引用なし
パスワード
   ▼小僧 さん:
ご指摘、ありがとうございます。

>まず…。
>他所掲示板ではマルチポストを認めていない事もあります。

マナー違反とは気付かず、失礼いたしました。
他サイトの削除をしようとしたのですが、メール送信時エラーで申請できないため、本題を修正Closeしました。以後気をつけます。


>Sub Make_Form2()
ありがとうございます。
大変勉強になりました。思っていた通りの動きで感動しました。


>> 3)新規フォームの詳細で、マウスボタンを押した場所に、ラベルを移動する
>についてはご自身で工夫されてみて下さい。

ありがとうございます。
工夫します。

【9749】Re:新規作成フォームにOnMouseDownプロシ...
質問  たくゾ〜  - 07/8/13(月) 12:00 -

引用なし
パスワード
   ▼小僧 さん:

たびたびすみません。
たくゾ〜です。

>> 3)新規フォームの詳細で、マウスボタンを押した場所に、ラベルを移動する
>についてはご自身で工夫されてみて下さい。
>    .InsertLines 6, "Msgbox ""座標X:"" & x & "" 座標Y:"" & y "
>    .InsertLines 7, ""

お教えいただきましたコードを、

.InsertLines 6, "Me.L001.Left = X"
.InsertLines 7, "Me.L001.Top = Y"

としまして、画面上は動く事を確認したのですが、
終了して、再度フォームを開くと、元の位置になってしまいます。

フォームのSaveをしても保存されません。
デザインビューで開き直してから 値を代入するとエラーになります。

移動したラベルを 固定したいのですが良い方法はございますでしょうか。

【9752】Re:新規作成フォームにOnMouseDownプロシ...
回答  小僧  - 07/8/13(月) 19:10 -

引用なし
パスワード
   ▼たくゾ〜 さん:
こんにちは。

>移動したラベルを 固定したいのですが良い方法はございますでしょうか。

適当な標準モジュールに

Public L1X As Long
Public L1Y As Long


と宣言しておき、

Sub Make_Form3()
Const F_Name = "test"
Dim Temp_Name As String
Dim ctl_Label As Access.Label
Dim i As Long


  With CreateForm()
    Temp_Name = .Name
    .HasModule = True
    .Caption = F_Name
    .Width = 11907       '[twip]
    .Section(acDetail).Height = 8505
    .Section(acDetail).OnMouseDown = "[Event Procedure]"
    .Form.OnLoad = "[Event Procedure]"
    .Form.OnUnload = "[Event Procedure]"
  End With
  
  
  For i = 0 To 1
    Set ctl_Label = CreateControl(Temp_Name, acLabel, acDetail, , , 100 + 200 * i, 100, 100, 100)
    ctl_Label.Name = "L" & Format(i, "000")
  
    With ctl_Label
      .SpecialEffect = 1
      .BackStyle = 1
    End With
  Next
  
  With VBE.ActiveVBProject.VBComponents.Item("Form_" & Temp_Name).CodeModule
    .InsertLines 4, "Private Sub Form_Load()"
    .InsertLines 5, "Me.L001.Left = L1X"
    .InsertLines 6, "Me.L001.Top = L1Y"
    .InsertLines 7, "End Sub"
    .InsertLines 8, ""
    .InsertLines 9, "Private Sub Form_Unload(Cancel As Integer)"
    .InsertLines 10, "L1X = Me.L001.Left"
    .InsertLines 11, "L1Y = Me.L001.Top"
    .InsertLines 12, "End Sub"
    .InsertLines 13, ""
    .InsertLines 14, "Private Sub 詳細_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)"
    .InsertLines 15, "Me.L001.Left = X"
    .InsertLines 16, "Me.L001.Top = Y"
    .InsertLines 17, "End Sub"
  End With
  
  DoCmd.Save acForm, Temp_Name
  DoCmd.Close acForm, Temp_Name
  DoCmd.Rename F_Name, acForm, Temp_Name
  DoCmd.OpenForm F_Name, acNormal
  DoCmd.Restore
  
End Sub


の様なコードを書くと、MDBを閉じるまでは座標を保持できるかと思われますが、

h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=9652;id=access
(直リンク禁止ですので補完して下さい)

の上部で紹介している通り、
Public変数に値を保持させるコードは余り良いとは言えないかと思われます。

やはり基本通りテーブルに値を入れる様なコードにするか、
常に開いているフォームに不可視のテキストボックスを作って
そこに値を入れておく方が安定するかと思われます。

【9753】Re:新規作成フォームにOnMouseDownプロシ...
お礼  たくゾ〜  - 07/8/13(月) 21:58 -

引用なし
パスワード
   ▼小僧 さん:
何度もありがとうございます。

>Public変数に値を保持させるコードは余り良いとは言えないかと思われます。
>やはり基本通りテーブルに値を入れる様なコードにするか、
>常に開いているフォームに不可視のテキストボックスを作って

貧乏性なのか、フォームに値を保存できる箱があるのに、他にテーブルを設けるのが
勿体無い気がしてまして、余計な質問をしてしまい申し訳御座いませんでした。

ご教授いただきました内容を熟慮して、良い方法を考えたいと思います。


また、ご指導方よろしくお願い致します。

865 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free