単純な疑問なのに私には分かりません

タグの編集
投稿者 リスナー  (学生) 投稿日時 2008/12/7 20:20:19
どうも皆さんおはようございます。

フォームにボタンを一つを置いてのプログラムについてです。

たとえばボタンを押すたびに
「あの日」、「あの時」、「あの場所で」
このようにメッセージを変化させて表示するとします。
私はメッセージボックスを使いました。
これでオーケーボタンを押すたびに確かにメッセージは変わります。
しかし初期で設定したボタンを押してのリアクションではありません。

ここで考え込んでしまいました。
同じ一個のボタンだけを押すことで例えばテキストボックスの内容を上記のように変えるにはどうすればいいのかなあと。
ボタンクリックイベントでテキストボックスの内容を押すごとに上記のように変化させるには、コードは上から順に起こされますから、上から順にテキストボックス・イコール……で書いたとしても、私の眼では最後の部分、「あの場所で」のみが表示されてしまいます。

同じように画像を表示させることにしても最後の一枚のみが表示されるだけです。
ボタンが複数あれば簡単ですがそれを一個でしようとすると行き詰ってしまいました。
ボタンを一個しか設置せずに、そのボタンを押すたびに意図したメッセージや画像を順に表示させるにはどうすればいいのでしょうか。
「こんな簡単な質問」とどうかお嘆きにならずにお教えください。
投稿者   (社会人) 投稿日時 2008/12/7 21:30:10
順に表示するメッセージを変えるように状態を管理してやればいいです。
フォームにTextBoxとButtonを1つ置いて以下のコードでいけます。


Public Class Form1

    Private _messages() As String = New String() {"あの日""あの時""あの場所で"}
    Private _index As Integer = 0

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text = _messages(_index)
        _index += 1
        If _index >= 3 Then
            _index = 0
        End If
    End Sub

End Class
投稿者 あにす  (社会人) 投稿日時 2008/12/7 23:11:07
イベントプロシージャごと差し替えてしまえばテキストでも画像でもなんでも行けちゃいます。

Public Class Form1

    Dim eventList As New List(Of EventHandler)()
    Dim eventCounter As Integer = 0

    Private Sub changeEvent()
        RemoveHandler Button1.Click, eventList(eventCounter)
        If eventCounter < eventList.Count - 1 Then
            eventCounter += 1
        End If
        AddHandler Button1.Click, eventList(eventCounter)
    End Sub

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。 
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。 
        eventList.Add(AddressOf あの日)
        eventList.Add(AddressOf あの時)
        eventList.Add(AddressOf あの場所で)

        AddHandler Button1.Click, eventList(eventCounter)
    End Sub

    Private Sub あの日(ByVal sender As ObjectByVal e As EventArgs)
        Me.Label1.Text = "あの日"
        changeEvent()
    End Sub

    Private Sub あの時(ByVal sender As ObjectByVal e As EventArgs)
        Me.Label1.Text = "あの時"
        changeEvent()
    End Sub

    Private Sub あの場所で(ByVal sender As ObjectByVal e As EventArgs)
        Me.Label1.Text = "あの場所で"
        changeEvent()
    End Sub

End Class
投稿者   (社会人) 投稿日時 2008/12/8 07:10:55
こんばんは。
回答ではありません。

「入門講座の卒業制作について」という書き込みで
neptuneさんから調べ方について回答を頂いているようですが、
解決したのでしょうか??
投稿者 リスナー  (学生) 投稿日時 2008/12/8 08:06:30
どうも皆さんこんばんは。
イベントプロシージャについての章や資料を調べた結果、
ご提示の解決方法で一応の完成をしました。
ただ感覚的にというだけで必ずしも論理的理解ではないよう自覚しています。
繰り返しの読み込みが必要そうです。

それから鍵さんのご指摘についてです。
別のスレッドの件ですが解決しました。
ただこちらを利用していて思ったのですが非常に多くの情報がもたらされるので、
すぐにレスするというよりはのんびり少し日数を置いてからの方が関連の情報などもあるかと思い、
ちょっと欲張りかもしれませんがのんびりと構えていました。

中途で頻繁にスレッド設置者からレスを返すことは大事だとは思うのですが、
そういう自分のスレッドをあとで見返すと落ち着きに欠けているようで、
それだったら極力、最初と最後の二回ぐらいでまとめた方がいいかなと思いまして。
過去ログなど見ていますとわりと情緒的なスレッドもあったりで、
私なりにいろいろと考えての間のおき方でした。
誤解があったならここで解消したいと思います。

開発事務局に関するスレッドもあるかと思いますが、
放置しているわけではありません。ちょっと長い目で見守ってもらえたらなと思います。
意見が集まらないならそれなりに理由もあると思いますし、いずれにせよ考えの材料になるはずです。
(とはいえ二つのスレッドにはこれからレスを書き込みに行きますが)


それとこれは余談ですが社会派バラエティーなんぞをこないだ見ていると、
どんなに礼を尽くしてもネットでのやり取りはバーチャルだという意見に少し共鳴するものもありました。
本当にこれは完全に余談ですが。
それで書き込みのペースに間を持たせたというのもあります。
もちろんこの部分については議論の余地はないと思います。単に各人の判断だと思いますので。
ただ私としては少し冷静になって極力、事務的に最小限の書き込みにした方がいいかなと思いまして。
まだ私の中で固まったわけではないのですが最近ちょっと考えてしまったわけですね。

それでも有意義で闊達な雰囲気の掲示板ですから上手に馴染めるよう郷に入ってはの精神でこれからも
明るく参加させてもらえたらと思っております。

投稿者 ラキシス  (その他) 投稿日時 2008/12/8 10:27:05
余談ですが、メニュー選択などで上から下や下から上へループする場合は以下の様に書くとすっきりします。

Const MENU_MAX As Integer = 3

'上限の時 
index = (index + 1) Mod MENU_MAX
'下限の時 
index = (index - 1 + MENU_MAX) Mod MENU_MAX
投稿者 neptune  (社会人) 投稿日時 2008/12/9 01:00:50
こんにちは

リスナーさん>
本題に関係のない書き込みですが、まぁおっさんの愚痴と思って読んでやって下さい。
別に反応する必要はないです。独り言のような愚痴ですから。

>中途で頻繁にスレッド設置者からレスを返すことは大事だとは思うのですが、
>そういう自分のスレッドをあとで見返すと落ち着きに欠けているようで、
>それだったら極力、最初と最後の二回ぐらいでまとめた方がいいかなと思いまして。
>過去ログなど見ていますとわりと情緒的なスレッドもあったりで、
>私なりにいろいろと考えての間のおき方でした。
>誤解があったならここで解消したいと思います。
とのコメントがあったので。書いておきます。

先ず、自分が好きで勝手に、出来るアドバイス、回答などをしていますので、
別にお礼などを期待しているわけでもありませんし、実際放置などは多々ありますので
珍しいことではないです。
という前提で読んでください。

が、やはり、
「ありがとう」と言われるとよかったな、出来るなら又アドバイスあげようと思うし、
早めの確認の書き込みをしてくれると、「確認してくれてるな」と思うし、
それが、いまから研究してみますと言う返答でもやはり、お~頑張ってくれと思いますし、
放置されたら、こいつ放置か。。。。と思いますし、
解決報告なし、経過報告なしで、放ったらかしで別スレッドを立てられると、
この間つけたResはなんだっただとも思いますし、もうこいつにはRes付けんぞと思ったりします。

>私なりにいろいろと考えての間のおき方でした。
こういうことも考えに入れておいて下さいね。

ちなみに、この間のResなんかササッとサンプルコード出すより長い目で見ると役に立つと
思ってつけたんですけどねぇ。。。経験って大事ですから。