• 締切済み

マウスでコントロールを移動させたくない

お世話になります。 客先の要望で、マウスで移動させたくないコントロールがありどのようにしたらよいか悩んでいます。 以下のような方法を考えていたのですが・・・ 1.移動元のコントロールを退避しておく 2.移動させたくないコントロールのMouseDownイベントで  元のコントロールにSetFocusする コンボボックスにMouseDownイベントが無く実現不可能となってしまいました。 何か良い方法はございませんでしょうか?

みんなの回答

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.8

Private Sub Combo1_LostFocus() If (IsMouseDown()) Then Combo1.SetFocus End If End Sub Private Function IsMouseDown() As Boolean IsMouseDown = (GetKeyState(VK_LBUTTON) And &H80) Or (GetKeyState(VK_RBUTTON) And &H80) End Function

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.7

コンボボックスのStyleプロパティによって、フックすべき場所が異なる。 Style=2なら、コンボボックスをフックするだけで、マウスイベントが拾えるが、2以外なら、コンボボックス内部にテキストボックスオブジェクトが創成される。 その内部オブジェクトのイベントも拾う必要がある。 下はマウスイベントの取得サンプル(for Style=2) これフォームモジュールにはる Option Explicit Private Sub Form_Load()   Call setSubClass(Me.Combo1.hWnd) End Sub Private Sub Form_Unload(Cancel As Integer)   Call freeSubClass(Me.hWnd) End Sub これ標準モジュールにはる Option Explicit Private Const GWL_WNDPROC = (-4) Public Const WM_LBUTTONDOWN = &H201 Public Const WM_LBUTTONUP = &H202 Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam 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 pPlocWnd  As Long Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long   Select Case uMsg     Case WM_LBUTTONDOWN       Form1.List1.AddItem "マウスダウン:" & Now     Case WM_LBUTTONUP       Form1.List1.AddItem "マウスアップ:" & Now   End Select PGMEND:   WindowProc = CallWindowProc(pPlocWnd, hWnd, uMsg, wParam, lParam) End Function 'サブクラス化 Public Function setSubClass(inWnd As Long) As Long   Call freeSubClass(inWnd)      pPlocWnd = SetWindowLong(inWnd, GWL_WNDPROC, AddressOf WindowProc) End Function 'サブクラス化解除 Public Function freeSubClass(inWnd As Long) As Boolean   If pPlocWnd <> 0 Then     Call SetWindowLong(inWnd, GWL_WNDPROC, pPlocWnd)     pPlocWnd = 0   End If   freeSubClass = True End Function

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=561476
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.6

コンボボックスのスタイルは? VBのイベントに頼らずに、フックをしてやればよい

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.5

#2です。 >現行のCOBOLはオフコンで動いています。 >項目の移動をすべてハードタブまたは確定キーで移動しており、 >当然ながらマウスは使用していません。 これを忠実にシミュレートして、 マウスをハード的につながなければ良いのでは・・・。 そういう問題じゃないですね。 すいません。

tomotomo0906
質問者

お礼

いえいえ 私もそう思いました! 当然ながら却下されてしまいましたが・・・。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

答えられそうもないですが、見た人が問題自身を理解できるのかとおもいまして。 >動きを少しでも忠実に再現して欲しいという要望 どういうケースでしょうか。 >マウスクリックでフォーカスを移したくないということです。 どういう弊害があるのでしょうか。 入力禁止と言うことではないでしょうね。 >EnableをFalseにすることも考えたのですが、それでは工数がかかりすぎるとのことで却下されてしまいました。 プログラム工数がそんなになぜ増えるのでしょうか。 >COBOL言語でのオペレーションをそのまま引き継げません(#3のご回答の一部) これで苦労されているのですか。 客先の現在のCOBOL言語でのオペレーションはどういう風のものですか。

tomotomo0906
質問者

補足

ありがとうございます。 >COBOLのオペレーション 現行のCOBOLはオフコンで動いています。 項目の移動をすべてハードタブまたは確定キーで移動しており、当然ながらマウスは使用していません。 マウスを使ってコントロール間の移動をさせたくないということです。 >弊害 確定時の入力チェックを強化すれば良いだけの話なので特にはあげられないのですが・・・・・。 >プログラム工数がそんなになぜ増えるのでしょうか。 実はこの動作をさせたいPGは350本あり、このオペレーション以外の部分では既に出来上がっています。納期もかなり近づいていますのでもう少し共通的に簡単にできないものかということでした。 このような補足でよろしいでしょうか?

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.3

なるほど、そうでしたか。 でも残念ながら、COBOLはノイマン型の逐次実行タイプの言語です。 引き換えVBは、イベントドブリンタイプになります。よってCOBOL言語でのオペレーションをそのまま引き継げません。というか言語仕様的にムリです。 ここは、お客様とのご相談になると思います。もしオペレーション的にCOBOL言語と同等に使用したいのであれば、前述した様にEnableを操作するしかないです。 コストを優先させるのであれば、操作系は変わらざるを得ません。つまり明細を入力して、登録ボタンを押したときに入力漏れや入力相関のチェックが動作して、完全にならないと登録できないようにするとかですね。 方法としたらこんなものです。言語仕様が違いすぎます。

tomotomo0906
質問者

お礼

PAPA0427さま アドバイスありがとうございます。 やはりそうですよね・・・・。 私もVB暦長いですがここまでこだわられるお客様も始めてなので正直戸惑っています。 もう少しがんばって上司、お客さまを説得してみます。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.2

tomotomo0906さん、こんにちは。 ちょっとよくわからないのですが、 そのコントロールの種類は、コンボボックスですか? >マウスで移動させたくないコントロールがありどのようにしたらよいか 「マウスで移動させたくない」というのは、 マウスクリックでフォーカスを移したくないということなんでしょうか。 (つまり、タブキーでのフォーカスを移すのは許可するということ?) ・・・それとも、コントロールをユーザーが ドラッグ操作で移動できる仕様にしているのでしょうか。

tomotomo0906
質問者

補足

ありがとうございます。 言葉が足らず申し訳ありません マウスクリックでフォーカスを移したくないということです。 移動させたくないコントロールはテキストボックスとコンボボックスです。 よろしくお願いします。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

う~~~ん。難しいですね。はじめからマウスを使うのが前提になっている言語仕様ですからね。 マウスでの移動をさせたくないという所を詳しく教えていただけないですか? 入力必須項目であれば、その項目が入力されないうちは全ての項目のEnableをFalseにしておくとか…。

tomotomo0906
質問者

補足

ありがとうございます。 今行っている作業がCOBOLプログラムをVB化という作業をしています。 動きを少しでも忠実に再現して欲しいという要望がでているのです。 ですのでマウスで移動させたくないということみたいです。 EnableをFalseにすることも考えたのですが、それでは工数がかかりすぎるとのことで却下されてしまいました。 マウス移動させたくない場所は 明細入力をする部分になります。 コンボボックスが1つテキストボックスが3つ並んで1行で、 それが10行分となります。 こんな情報でよろしいでしょうか?

関連するQ&A

  • サブサブフォームのレコード移動方法

     いつもお世話になっております。サブサブフォームのニューレコードに移動するボタンを作成しようとしているのですが、サブフォームは移動できるのですが、サブサブフォームを移動させることができません。 Me.sub1.Form.sub2.Form.コンボボックス名.SetFocus DoCmd.GoToRecord , , acNewRec で記述してみたのですが反応がありませんでした。指定方法が間違っているのでしょうか?よろしくお願いします。

  • Accessのカレンダーコントロールについて

    いつもお世話になっております。 アクセスのカレンダーコントロール(MSCAL.ocx)に ついて教えてください。 コントロールを表示して日を指定します。 その後コントロール上にある年を指定するコンボボックスで別の年を指定します。 するとコントロール上は日が指定されていない状態 になりますが、 Me.Calendar.Value には以前にしていした日付が残っています。 実現したいのは年を指定するコンボボックスで 別の年を指定した場合、その指定された年数を 知りたいのですが、Me.Calendar.Valueには 以前の日付が入っているため、知ることが できません。 何かいい方法はないでしょうか? よろしくお願いいたします。

  • コントロールツールボックスを表示させた状態でセルの選択位置をマウスで移動させたい。

    MS-Excel2000のマクロにおいて、 UserForm1.Showでコントロールツールボックスを表示させた状態で セルの選択位置をマウスで移動させたいと思っておりますが、 コントロールツールボックスがあるとセルを選択位置移動ができません。 (もちろん、コントロールツールボックスを消せば セルの選択位置移動はできます。) どのような指示にすればできますでしょうか? よろしくご教授願います。 やりたい事は、 はんこ(スタンプ)みたいにコントロールツールボックスの コマンドボタンを押したら文字がアクティブセルに表示するようにしたい。 ただし、コントロールツールボックスを表示したままで アクティブセルはマウスで任意の位置を選択できるようにする。 ってことです。

  • タブキー 自身のコントロールにフォーカスをあてたい

    タブキーで移動しても自身のコントロールにフォーカスをあてたい txt_検索文字と言うコントロールがあり、 txt_検索文字に文字を入力して、タブキーで移動すると、 Private Sub txt_検索文字_AfterUpdate() ’更新処理・・・ Me.Controls("txt_検索文字").SetFocus End Sub のイベントが発生するのですが、 タブキーを押してイベントが終わっても、再度、txt_検索文字のままにしたいのですが、 Me.Controls("txt_検索文字").SetFocus がきいてないようです。 他のコントロールにフォーカスが当たってしまいます。 ようは、タブキーを押してコントロールの更新イベントが発生しても、再度同じコントロールのままカーソルを充てる方法を教えてください。

  • ACCEESでマウスがテキストボックスを移動した時変化させたい

    お世話になります あるテキストボックスをクイックすると 関連するフォームを表示するように、作りました ところがそのテキストボックスは何のヘンテツもなく クイックしていいものかわかりません こんな時、マウスが通過したとき、何か変化させたいのですが 何かアイデァないでしょうか そのテキストボックスのプロパティのイベントで 「マウスボタンの移動時」というのがあってこれを 使うのかな!、と思うのですが、その先わかりません アドバイスください よろしくお願いします

  • NumericUpDownでキャレット移動

    VB.NET VisualStudio2017でWindowsアプリケーションを開発しています。 お客様からの要望でテキストボックスがフォーカスが移った際には入力済の文字列を全選択し、その状態で文字列の任意の場所でマウスをクリックするとその場所にマウスカーソル(キャレット)を移動しています。 Private Sub txtTest_MouseDown(sender As Object, e As MouseEventArgs) ' マウスを押した位置にキャレットを移動する Dim charIndex As Integer = txtTest.GetCharIndexFromPosition(e.Location) txtTest.Select(charIndex, 0) End Sub 同様のことをNumericUpDownコントロールで行いたいのですが、NumericUpDownコントロールにはGetCharIndexFromPositionメソッドが存在しません。 Windows API のSendMessageも調査してみましたが、TextBox向けの事例にしかヒットしませんでした。 何か良い方法をご存知の方がいらっしゃれば、お知恵をお借りしたく存じます。 よろしくお願いいたします。

  • コントロール名取得

    例えば、画面にコンボボックスが2つあるとします。 Loadイベント時にどちらのコンボボックスが クリックしたかを判断したいのですが、方法はありますか?ポストバックの前に判断したいのです

  • Ver.6.0で動的コントロールのプロパティについて

    フォーム上で、 動的コントロール=コンボボックスの宣言をし、 標準モジュールで、動的コントロールを実際に追加したいコードを作る時、サイズ(Left、Top、)や状態(Visible)などの設定はできるのですが、 Sorted(コンボボックス内での自動昇順)やStyle(コンボボックスの種類)等の、設定がソース上で出来ません。 どうすれば、ソース上で、設定できるのでしょうか。 問題のコードをデバッグすると、デザイン上でしか、設定出来ませんとメッセージが表示され、実現不可能な事を言われています。

  • ASP.NET 動的コントロールのフォーカス移動

    ASP.NET(VB)で開発しています。 Page_init時に生成されるテキストボックス1、2(動的コントロール)を表示します。 テキストボックス1のテキストチェンジイベント時に テキストボックス2にフォーカスが移動するようにしたいです。 テキストチェンジでPostBackが発生し、サーバ側でテキストボックス2.Focus() と記述しているのですが、動作は、テキストボックス2に フォーカスが移らず、画面上のどこにもフォーカスがあたっていない状態になってしまいます。 動的コントロールへ、PostBack時にフォーカス移動させるにはどうしたら良いか お願いいたします。

  • コンボボックスのコントロール

    コンボボックスの書式設定について教えていただけますか? コンボボックスのコントロールの《リンクするセル》を簡単に変更する方法はありますか? コンボボックスを30コ作りたいのですが、コンボボックスをコピーすると 《リンクするセル》も同じものがコピーされてしまいます。 関数のように順番にセル番号が変化しません。 これをひとつづつ手入力をするのが大変なので こーすると早いよ! などの方法があったら教えていただけませんか? よろしくお願い致します。

専門家に質問してみよう