お世話になります。

客先の要望で、マウスで移動させたくないコントロールがありどのようにしたらよいか悩んでいます。

以下のような方法を考えていたのですが・・・

1.移動元のコントロールを退避しておく
2.移動させたくないコントロールのMouseDownイベントで
 元のコントロールにSetFocusする

コンボボックスにMouseDownイベントが無く実現不可能となってしまいました。

何か良い方法はございませんでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0

コンボボックスの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
    • good
    • 0

コンボボックスのスタイルは?



VBのイベントに頼らずに、フックをしてやればよい
    • good
    • 0

#2です。



>現行のCOBOLはオフコンで動いています。
>項目の移動をすべてハードタブまたは確定キーで移動しており、
>当然ながらマウスは使用していません。

これを忠実にシミュレートして、
マウスをハード的につながなければ良いのでは・・・。

そういう問題じゃないですね。
すいません。
    • good
    • 0
この回答へのお礼

いえいえ 私もそう思いました!

当然ながら却下されてしまいましたが・・・。

お礼日時:2003/07/12 12:41

答えられそうもないですが、見た人が問題自身を理解できるのかとおもいまして。


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

この回答への補足

ありがとうございます。

>COBOLのオペレーション
現行のCOBOLはオフコンで動いています。
項目の移動をすべてハードタブまたは確定キーで移動しており、当然ながらマウスは使用していません。
マウスを使ってコントロール間の移動をさせたくないということです。

>弊害
確定時の入力チェックを強化すれば良いだけの話なので特にはあげられないのですが・・・・・。

>プログラム工数がそんなになぜ増えるのでしょうか。
実はこの動作をさせたいPGは350本あり、このオペレーション以外の部分では既に出来上がっています。納期もかなり近づいていますのでもう少し共通的に簡単にできないものかということでした。

このような補足でよろしいでしょうか?

補足日時:2003/07/12 10:49
    • good
    • 0

なるほど、そうでしたか。



でも残念ながら、COBOLはノイマン型の逐次実行タイプの言語です。

引き換えVBは、イベントドブリンタイプになります。よってCOBOL言語でのオペレーションをそのまま引き継げません。というか言語仕様的にムリです。

ここは、お客様とのご相談になると思います。もしオペレーション的にCOBOL言語と同等に使用したいのであれば、前述した様にEnableを操作するしかないです。

コストを優先させるのであれば、操作系は変わらざるを得ません。つまり明細を入力して、登録ボタンを押したときに入力漏れや入力相関のチェックが動作して、完全にならないと登録できないようにするとかですね。

方法としたらこんなものです。言語仕様が違いすぎます。
    • good
    • 0
この回答へのお礼

PAPA0427さま

アドバイスありがとうございます。

やはりそうですよね・・・・。
私もVB暦長いですがここまでこだわられるお客様も始めてなので正直戸惑っています。

もう少しがんばって上司、お客さまを説得してみます。

お礼日時:2003/07/11 21:35

tomotomo0906さん、こんにちは。



ちょっとよくわからないのですが、
そのコントロールの種類は、コンボボックスですか?

>マウスで移動させたくないコントロールがありどのようにしたらよいか

「マウスで移動させたくない」というのは、
マウスクリックでフォーカスを移したくないということなんでしょうか。
(つまり、タブキーでのフォーカスを移すのは許可するということ?)


・・・それとも、コントロールをユーザーが
ドラッグ操作で移動できる仕様にしているのでしょうか。

この回答への補足

ありがとうございます。

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

よろしくお願いします。

補足日時:2003/07/11 17:49
    • good
    • 0

う~~~ん。

難しいですね。はじめからマウスを使うのが前提になっている言語仕様ですからね。

マウスでの移動をさせたくないという所を詳しく教えていただけないですか?

入力必須項目であれば、その項目が入力されないうちは全ての項目のEnableをFalseにしておくとか…。

この回答への補足

ありがとうございます。

今行っている作業がCOBOLプログラムをVB化という作業をしています。
動きを少しでも忠実に再現して欲しいという要望がでているのです。
ですのでマウスで移動させたくないということみたいです。

EnableをFalseにすることも考えたのですが、それでは工数がかかりすぎるとのことで却下されてしまいました。

マウス移動させたくない場所は 明細入力をする部分になります。
コンボボックスが1つテキストボックスが3つ並んで1行で、
それが10行分となります。

こんな情報でよろしいでしょうか?

補足日時:2003/07/11 17:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング