質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

C# ボタンをクリックしている間に指定の関数を実行し続けたい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 483

yar

score 11

ボタンを右クリックし続けている間に指定した関数を実行し続けたいと考えています。
MouseDown.Up等で実装できるかもしれないと思い試してみたのですが長押しにうまく対応することができません。

具体的に「テキストに100と入力されている→ボタンを押す→テキストが99になりラベル0が1になる」処理を長押しでリアルタイムで確認できるように実装したいと考えています。

どうすれば実装することができるでしょうか?ご教授お願い致します。

C#のFormApplicationを使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yar

    2020/07/15 12:24

    >YAmaGNZ
    >テキストは1づつ減っていき、ラベルは1づつ増えていくということですか?
    それを想定しています。スピードに関しては視認できるものを想定していたのですが厳しいですかね...

    キャンセル

  • yar

    2020/07/15 12:25

    >Zuishin
    timerの処理調べて試してみます!ありがとうございます。

    キャンセル

  • TN8001

    2020/07/15 13:06 編集

    NumericUpDown+ValueChangedで満足できるならそれが一番簡単です。

    タイマーでやるならこちらはどうですか。
    [Auto-repeat Button in 10 Minutes - CodeProject](https://www.codeproject.com/Articles/629644/Auto-repeat-Button-in-10-Minutes

    キャンセル

回答 4

+2

長押し

「押した」と「離した」とをハンドリングすればよいのではないでしょうか.
(「押されてから→離されるまで」が処理実行期間)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 11:49

    回答ありがとうございます。
    ハンドリングについて調べ試してみたのですが1度しか実行されず求めてる処理にならないです...
    具体的にどうすれば繰り返すことが出きるでしょうか?

    キャンセル

  • 2020/07/15 11:59

    現状がどのような実装になっているのか不明なので何とも言えませんが,
    「質問への追記・修正、ベストアンサー選択の依頼」や,他の回答にて,より具体的な方法の話が記述されているようですので,それらを参考にした実装を行ってみてはどうでしょうか.

    キャンセル

  • この投稿は削除されました

+2

  • MouseDown で目的の処理を開始
  • MouseUp で目的の処理を終了

すればよいです。

ただし、マウスイベントのハンドラに目的の処理をまんま書いてしまうと UI の処理がブロックしてしまうので、目的の処理は

  • BackgraoundWorker
  • Task
  • Thread

などから、用途に適したものを使用して、UI 処理とは異なるスレッドで実行してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 12:33 編集

    なるほど。WPF ではそれで良かった気がしますが、Windows Forms でもそれでいいんですね。

    で、話は戻りますが
    ```
    for(i;i<規定数;i++)
    >await Task.Run(() => Lottery(i));
    ```
    には「MouseUp で処理を中断する」実装が無いですよね。

    処理を中断するコードが書かれていなければ、例えば規定数=100であれば、中断されることなく100回ループが回るのは当然な気がしますが。。

    キャンセル

  • 2020/07/15 12:34

    > Windows Forms では、イベントハンドラの中に await が書けなかったような気がするのですが、

    最近できるようになりました。

    キャンセル

  • 2020/07/15 12:36

    ★+1

    キャンセル

checkベストアンサー

+1

一番単純なのは、
ボタン押したらタイマー開始
ボタン離したらタイマー停止

で、タイマーの処理で
テキストを1減らす
ラベルを1増やす

といった感じですかね。
増減のスピードはタイマーのIntervalで調整する
タイマーに関してはTimerクラスを参照してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 20:06

    ElapsedEventHandler handler;

    // タイマーを開始する
    timer.Start();

    // タイマーの処理
    handler = (c, a) =>
    {
    timer.Elapsed += handler;
    .
    .
    .
    }
    のように書いた場合「割り当てされていないローカル変数が使用されました」とビルドエラーが起こってしまいます...

    キャンセル

  • 2020/07/15 20:37

    何故、ハンドラーの定義の中でハンドラーの追加を行うのですか?

    ボタンが押されたときにイベントハンドラを追加するのではなく、フォームのロードなど、起動されてすぐに1回だけ追加してください。
    もしくは、フォームデザイナーでタイマーを追加してイベントハンドラを設定してください。
    そのほうが簡単です。

    キャンセル

  • 2020/07/16 11:15

    >フォームデザイナーでタイマーを追加してイベントハンドラを設定してください。
    そのほうが簡単です。

    試してみたらできました!ありがとうございます!

    キャンセル

0

ボタンを右クリックし続けている間

マウスの右クリックという事でしたら、ボタンのマウスイベントを使えば、良いのでは?

例えば、bool progRun とかいうメンバ変数を用意して、
MouseDown(右ボタンを検出し)で、progRun = true;
MouseUpで、progRun = false;
別スレッドで、動いているメソッドで、この progRunが、trueの間だけ、処理を行うようにすれば、出来ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 12:01

    回答ありがとうございます。
    trueの間do..whileで実行するように試してみたのですが、一気に実行されてしまい1つ1つ実行されずに規定数一気に実行されてしまいました...
    1つ1つ実行する方法はないでしょうか?

    キャンセル

  • 2020/07/15 22:36

    他の回答へのコメントまで追い切れてませんので、解決済みかもしれませんが。
    > 1つ1つ実行する方法はないでしょうか?
    1つ終わったら、true->false にするだけでは?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る