ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Visual Basic User's Clubコミュのもっと簡単に書くには?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
非常に基本的な質問になるかと思います。VBのバージョンはVB2005です。
フォーム上にボタンを3つ貼り付け、それぞれのボタンを一回押したらボタンの色が赤になり、もう一度押したら元の色に戻るというごく簡単なプログラムを書きました。

Public Class Form1
  Private Flag(2) As Boolean
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Select Case Flag(0)
      Case False
        Button1.BackColor = Color.Red
        Flag(0) = True
      Case True
        Button1.BackColor = Color.FromKnownColor(KnownColor.ControlLight)
        Flag(0) = False
    End Select
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Select Case Flag(1)
      Case False
        Button2.BackColor = Color.Red
        Flag(1) = True
      Case True
        Button2.BackColor = Color.FromKnownColor(KnownColor.ControlLight)
        Flag(1) = False
    End Select
  End Sub

 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    Select Case Flag(2)
    Case False
        Button3.BackColor = Color.Red
        Flag(2) = True
      Case True
        Button3.BackColor = Color.FromKnownColor(KnownColor.ControlLight)
         Flag(2) = False
    End Select
  End Sub
End Class

少々見にくくて申し訳ありません。
実際には100個以上のボタンがあります。
100個同じようなプログラムを書くのは何とも大変なのですが、皆さんはどういう風に書かれますか?
あと、ボタンを元の色に戻すのはこんな指定方法であっているのでしょうか?

コメント(23)

私だったらコントロール配列で100回ループさせるかな。
http://dobon.net/vb/dotnet/control/buttonarray.html

色分けフラグも作らなくても、現在の色が赤だったらControlLight。それ以外なら赤とかにもできるかな?

私もそんなに詳しくないので、もっといい方法はあるかも。

ご参考までに。
私でしたら、カスタムコントロール作って、それを配置するだけっすね。
コーディングは1個分で完了です。
具体的な例は、VB2005のヘルプで、
『チュートリアル:Visual Basic による Windows フォームコントロールからの継承』
ってところに詳しく記載されています。

Buttonコントロールから継承させ、MyButtonRedというコントロールを作って、そこのClickをオーバーロードさせて、色変更のロジックを記入すればできると思いますよ。

ソリューションにライブラリが一個追加されることになるので、フォームのプロジェクトでそのライブラリを参照するようにし、プロジェクトのビルド順序を指定してやれば、フォーム編集時にツールボックスの中に自分の作成したカスタムコントロールが出てきますので、それを配置すればOKです。

最初、とっつきにくいかもしれませんが、理解すれば滅茶苦茶便利なので、利用されることをお勧めします。
Private Sub ButtonColorChange_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles Button1.Click, Button2.Click, Button3.Click

 If sender.BackColor <> Color.Red Then
   sender.BackColor = Color.Red
 Else
   sender.BackColor = Color.FromKnownColor(KnownColor.ControlLight)
 End If
End Sub

いっちゅうさんのコントロール配列や、hiro ozzy 5150さんの継承の方が良いと思いますが、上記のようなやり方も
ただ、Handles の部分に100個以上書くのは大変です(爆
対象が少ない場合は上のようなやり方でも。
皆さんありがとう(´;ω;`)ブワッ

やったことないけど継承とやらをやってみます。。
やってみると、案外簡単です。

さっきの説明で、継承したコントロールのClickは、オーバーロードじゃなくオーバーライドしてください。すまそ(o*。_。)oペコッ

ちょこちょこ見ときますので、わからないことがあればカキコしてくださいまし(^^)/
複数あるボタンに対する処理が、「色を変える」処理なら、
みなさんの、ご説明で対応できますが、実際にはボタンによ
り異なる処理を実装するのであれば、一工夫必要ですね。
(どんな処理なんだろう・・・)
うなまなさん>
ですねw
どんな処理なんだろ????
hiro_ozzy_5150 さんありがとう!

でもあかん。。
http://msdn2.microsoft.com/ja-jp/library/w2a8y03d.aspx
ここのことですよね。
これと同じ事はできるんですけど応用がわかりませんわ(´・ω・`)ショボーン

まぁもうちょっと粘ってみます。
同じことが出来たら、あとは、色々試してみることですね。

例えば、MyButton というカスタムコントロールを作ったなら、コードエディタ側(プロパティを指定するとこではなく)で、クラスの指定がありますよね?

初期状態は、
Public Class MyButton

End Class
と表示されているはずです。

その中に、
protected overrides
(最後スペース)と打てば、次に書ける候補一覧が出てきます。
候補の中から OnClick を選択すれば、OnClickをオーバーライドするコードが記入できます。

勝手に次のコードが生成されると思いますので、そこをいじくって下さい。

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
MyBase.OnClick(e)
End Sub

生成されたコードで、MyBaseで修飾しているのは、継承元のButtonコントロールを指します。
なので、
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
MyBase.BackColor = Color.Red
MyBase.OnClick(e)
End Sub

と書くと、クリックされた時にバックカラーを赤に変更されると思いますよ。

同様にして、どのイベントに対しても、処理をかけますので、色々やってみることをお勧めします。
あ〜〜〜〜〜すいません。
最後のコードのとこBackColorを設定するとこは、MyBaseじゃなくMeで修飾すべきですね。

失礼しました(o*。_。)oペコッ

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
Me.BackColor = Color.Red
MyBase.OnClick(e)
End Sub
>>1-11の書き込みを元に、ちょっと書いてみました。
http://mixi.jp/view_diary.pl?id=225232942&owner_id=42954

ポイントをまとめると……
・コントロール配列使うと楽よ。(>>1:いっちゅうさんの書き込みより)
・継承使うと楽よ。(>>2:hiro_ozzy_5150さんの書き込みより)
・「元の色」はDefaultBackColorとか良いかも。
・ReverseColorプロパティとか付けてみた(>>4:そふぃんさんの書き込みを元に。)
 これでボタンひとつひとつに違う色を設定するなんて事も大丈夫ヽ( 'ヮ')ノ

あと、Index別にイベント処理をしたいときは、Tagプロパティとか使ってみると良いかと思います。
VB2005で.Net Frameworks 2.0だと、コントロール配列にするの邪魔くさいんですよねぇ〜〜〜〜^^;
動的に作らないといけないですし・・・
なぜマイクロソフトがIndexプロパティを削ったんだろ??
謎っす^^;
ちょっと説明不足かも^^;;;

順を追ってちゃんと説明しときますね

プロジェクトの追加で『新しい項目の追加』をします。
ダイアログが出てくるので『カスタムコントロール』を選択して、追加します。デフォルトでは『CustomControl1』って名前で作られます。

まず、先に隠れてるファイルを見えるように、ソリューションエキスプローラーの中のツールバーの左から2つ目のボタンをクリックして、隠しファイルを見えるようにします。
そしたら、CustomControl1.vbの横に『+』が出てきますので、クリックします。
CustomControl1.Designer.vbが見えると思いますので、それを右クリックして、『コードの表示』で開きます。
次のコードが出てきますので、

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class CustomControl1
Inherits System.Windows.Forms.Control

'Control は、コンポーネント一覧に後処理を実行するために、dispose をオーバーライドします。
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub

'コントロール デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ: 以下のプロシージャはコンポーネント デザイナで必要です。
' コンポーネント デザイナを使って変更できます。
' コード エディタを使って変更しないでください。
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
components = New System.ComponentModel.Container()
End Sub

End Class

2行目と3行目のとこだけ修正します。
【修正前】
Partial Class CustomControl1
Inherits System.Windows.Forms.Control
【修正後】
Partial Class MyButton
Inherits System.Windows.Forms.Button

これで、Buttonコントロールから継承したMyButtonというコントロールが作成されます。

これで、CustomControl1.Designer.vbは閉じます。

次に、CustomControl1.vbを編集します。

最初は、
Public Class CustomControl1

Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(pe)

'カスタム描画コードをここに追加します。
End Sub

End Class
になってます。
まず最初に、1行目の
Public Class CustomControl1

Public Class MyButton
に変更します。

次に今回はOnPaintは関係ないので、削除してもらってもいいですし、そのままでもOKです。
追加で

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
Me.BackColor = Color.Red
MyBase.OnClick(e)
End Sub

を記述して、閉じます。
後は、一回ビルドして、その後、フォームエディタを開くと、ツールボックスの一覧の中に新しくMyButtonってのが出来ると思います。
フォームに配置して、動作確認して下さい。
ボタンをコントロール配列で作れば出来ますよね。
VB6と違ってコントロール配列を作るのは
難しいですが…
夜な夜な考えてたんですが(笑)
ボタンコントロールを100個以上作って、同じ動き・・・
マインスイーパーみたいな感じかな?と思いました。
他には、囲碁、オセロあたりをイメージしましたね^^;

ボタンコントロールの場合、クリックした後、フォーカスがいってしまうところと、デフォルトでは右クリックが使えないっていうところを注意してください。
>>18
確かに・・・
でもボタンが押されたタイミングで計算ロジックを実行
して制御するんだったら、コントロール配列的な考えは
難しいかも・・・2次元配列なのか?

Drawingした方が楽かも。。。
みんな、みんなありがとう!
。・゚・(ノ∀`)・゚・。

mixi最高や〜〜〜〜〜!!
みのりん星人さん>

がんばって下さい^^v

今回は、クリックイベントの話しでしたが、ちなみに、100個のボタンのプロパティを楽に設定する方法としては、やはりコントロール配列にして、インデックスでアクセスするのが一番なので、色々研究してください。

コントロール配列にするのが邪魔くさければ(笑)下記の方法とかもあります。

コントロールの名前を Button1 〜 Button100 で作っておく。

Dim i As Integer
For i = 1 To 100
Me.Controls.Item("Button" & i).Text = i
Next i

コントロール名を文字修飾で探す方法です。必ずコントロールの名前を間違わずに設定することがポイントですね。

ちゃんと調べてませんが、文字修飾で探すと実行時のスピードは遅くなるんじゃないかな???
多分ですが、コントロール配列にした方が実行スピードは早いと思います。

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Visual Basic User's Club 更新情報

Visual Basic User's Clubのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング