外出自粛中でも楽しく過ごす!QAまとめ>>

VB2005,Frameworks2を使用しています。

フォームに設置したButtonは、通常マウスをクリックする度にイベントが発生しますが、これをボタンをマウスで押している間だけイベントを発生されたいのですがその様なイベントやボタンの設定が見つかりません。

やはりタイマー等を使わないと再現できないのでしょうか?
よろしくお願いします。

A 回答 (2件)

繰り返し処理ならMouseDownでタイマースタート、MouseUpでタイマー停止、がシンプルだと思われます。


ボタンを押している間だけ何らかの処理が進行するようなものなら、マルチスレッドですかね。MouseDownでスレッドスタート、MouseUpでスレッドを停止させるようなフラグをONにするか、スレッド強制終了させるか。。。
どちらにしても、イベントのプロシージャからは即座に脱出しないとパフォーマンスに影響します。
    • good
    • 0
この回答へのお礼

ありがとうございます。
最初はMouseDownイベント内に処理をループさせ、さらにSleepとDoEvents入れてみましたが上手く動作しなかったので、こちらのタイマーを使ったシンプルな方法を採用してみたところ上手く動作したのでご報告します。

また質問の機会があれば宜しくお願いします。

お礼日時:2009/12/10 17:00

こんにちは。


当方VB2005ではありませんがMouseDown,MouseUpイベントはありませんか?
MouseDown・・・押されている。
MouseUp・・・離した。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコマンドボタンを押している間の処理について(C#)

現在C#にてアプリを作っています。
そこで、フォーム上にあるボタンを押している間は
ある画像のスクロールさせる処理を行いたいのですが、
どういったイベント等の方法で行えばよいか教えてください。

Aベストアンサー

Clickのイベントではなく、MouseDownとMouseUpの
イベントを利用すると良いと思います。

スクロールの処理については、別スレッドでやると
良いでしょう。

この説明だけでは分かり難いと思いますので、
サンプルプログラムを作ってみました。

C#のコードは、ほとんど書いた事が無いので、
あやしいところもあるかもしれませんが、
一応、参考までに・・・。
(サンプルは、参考URLからダウンロード出来ます。)

参考URL:http://psv.servehttp.com/programming_folder/win/CSharp/VS7.0/CSButtonTest/

Q[ExcelVBA] コマンドボタンを押しっぱなしにしている間、マクロを繰り返す方法

AccessVBAでは、コマンドボタンで「AutoRepeat」プロパティを使えば、
コマンドボタンを押しっぱなしにしている間、繰り返して処理を続けます。

しかし、
Excelの場合、コマンドボタンにAutoRepeatのような「繰り返しプロパティ」がありません。

このような場合、どのように同様な処理を行うのでしょうか?
簡単な作動例のコードを教えていただけると幸いです。


たとえば。作動のイメージですが。
Sub test1()
range("A1")=range("A1") + 1
End Sub

このtest1というマクロを、コマンドボタンを押しっぱなしにしている間、
繰り返して足し続けるような処理です。

コマンドボタンを1回クリックすれば、セルA1の数字は1増えますし、
押しっぱなしにしている間はカウントが増え続けます。

Aベストアンサー

こんばんは。

>このtest1というマクロを、コマンドボタンを押しっぱなしにしている間、
>繰り返して足し続けるような処理です。

私は、押し続けて、作動するボタンは知りません。
Excelの場合は、私は、こんな風にします。

'-------------------------------------------

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Dim flg As Boolean
Private Sub CommandButton1_Click()
  flg = Not flg
  CommandButton1.Caption = flg
  If flg Then
    Call Test1
  End If
End Sub
Sub Test1()
  Do
    Range("A1").Value = Range("A1").Value + 1
    Sleep 500  'スピードを調整
    DoEvents
  Loop While flg
End Sub

こんばんは。

>このtest1というマクロを、コマンドボタンを押しっぱなしにしている間、
>繰り返して足し続けるような処理です。

私は、押し続けて、作動するボタンは知りません。
Excelの場合は、私は、こんな風にします。

'-------------------------------------------

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Dim flg As Boolean
Private Sub CommandButton1_Click()
  flg = Not flg
  CommandButton1.Caption = flg
  If flg Then
   ...続きを読む

Qコマンドボタンの長押し

コマンドボタンのクリック処理についてです。

コマンドボタンのクリックは取得できると思うのですが、
長押しを行った場合、それを認識することなんてできるのでしょうか?

コマンドボタンによる数値入力を行いたく、
長押しができれば、任意の数値が入力できると思いまして。

すいませんが、どなたかお願いいたします。

Aベストアンサー

sienna>多分、MouseDown・MouseUpの事だと思います。

すみません、そのとおりです。

関数ローカルではなく、フォームローカルなBoolean変数を用意しておいて、MouseDownイベントでその変数にTrueを、MouseUpイベントでその変数にFalseをセットします。

もしくは、タイマーコントロールのEnableを、MouseDown時にTrueに、MouseUp時にFalseに設定するのもいいでしょう。
Timerイベントに

Text1.Text = Text1.Text + 1

とか書いておいて、インターバルを500とかにすれば、0.5秒ごとに数値がアップするカウンタの出来上がりです。

QVB.NETでマウスクリックイベントを発生させたい。

VB.NETでformの外で任意の座標でマウスクリックイベントを発生させたい。
formにはボタンがあり、そのボタンを押すを固定位置(formの外)でマウスの左クリックイベントを発生させたいのですがどのような手段を使えばいいでしょうか。

環境 Windows XP,VB2008 Exoress

Aベストアンサー

こちらの記事がわかりやすくていいんじゃないかなー。
http://blog.livedoor.jp/akf0/archives/51560984.html

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QTextBoxでEnterキーを押すと、にあるButtonを押したのと同じ効果を出す方法

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtTest.KeyDown
If (e.KeyCode = Keys.Enter) Then
'★★★ここでどういうコードを書いてよいかわかりません。
End If
End Sub
----------------------------
ボタンを押したときのイベントハンドラ
Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    ボタンを押したら、このイベントハンドラを呼び出したい。
    もしくは、間接的に呼び出したい。
-------
どなたか、やり方をご存知の方がいらっしゃいましたら、よろしくお願いします。

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal ...続きを読む

Aベストアンサー

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、Cと同じ手続きでAPIで起こせばよいと思います。
http://okwave.jp/kotaeru.php3?q=199357


Public Class Form1
  Inherits System.Windows.Forms.Form

  Private Declare Auto Function SendMessage Lib "user32" ( _
    ByVal hWnd As Integer, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Integer _
  ) As Integer
  Private Declare Auto Function GetDlgCtrlID Lib "user32" ( _
    ByVal hWnd As Integer _
  ) As Integer

  Private Const WM_COMMAND As Integer = &H111
  Private Const BN_CLICKED As Integer = &H0

#Region " Windows フォーム デザイナで生成されたコード "
#End Region

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    btnTest.PerformClick()
    SendMessage( _
      Me.Handle.ToInt32, _
      WM_COMMAND, _
      BN_CLICKED * GetDlgCtrlID(btnTest.Handle.ToInt32) * &H10000, _
      btnTest.Handle.ToInt32 _
    )
  End Sub
End Class

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、...続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング