- PR -

VB.NETにおけるコントロールの初期化

1
投稿者投稿内容
VB!VB?VB♪
会議室デビュー日: 2003/06/20
投稿数: 6
お住まい・勤務地: 愛知県近辺
投稿日時: 2003-06-20 18:07
はじめて投稿させていただくVB!VB?VB♪(←バグじゃないですよ^^;です。

早速ですが質問です
1.概要
 VB6.0で開発したVBPをアップグレードしたのですが案の定コントロール配列がすごいことに
 なってます。コントロール配列(VB6.0)を別の形で実現したい。
2.詳細
 (1)画面イメージ
   現状では、ComandButtonを12個配置しForm_KeyDownを利用し、押されたボタンを
   判断し、押されたボタンに対応した処理を行うようなプログラムです。
(2)具体的な処理内容(質問部分に限る)
   上記(1)を行う際Form_Loadにおいて12個のComandButtonをEnabled =False と
   します。それを行ったあと使用可能なComandButtonを指定しEnabled =Trueとします
(3)VB6.0時のソース
'---------------------------------------------------------------------------
 Public Sub GF_ShowFunction(frmObject As Form, FuncNO As String) '標準モジュール内
Dim i As Integer
'全て使用不可にする
For i = 0 To frmObject.cmdFunction.Count - 1    ※1 VB.NETで実現したい!
frmObject.cmdFunction(i).Enabled = False    ※2 VB.NETで実現したい!
Next                          ※3 VB.NETで実現したい!
'指定のものを使用可にする
For i = 1 To 12
Select Case Mid(FuncNO, i, 1)
Case "1" '【 F1 】
frmObject.cmdFunction(0).Enabled = True
Case "2" '【 F2 】
frmObject.cmdFunction(1).Enabled = True
Case "3" '【 F3 】
frmObject.cmdFunction(2).Enabled = True
            ・
            ・   (以下中略)
            ・
End Select
Next i
End Sub
'----------------------------------------------------------------------------
 上記補足説明
 cmdFunction(1to12):コントロール配列(ComandButton)
frmObject:フォーム名を受け取ります(meでもOK!)
FuncNO:Enabled = Trueとしたい指定コード(例:"124C") ※"C"=F12に対応

3.後書き
 上記をなやんで(調べて♪)今日一日の業務が終了してしまったような・・・(><;) 
 まだVB.NETを始めてから半月も経ってるのに全然上達してにゃいです。。。
 
 どなたか良きアイデア等(愛の手?w)ございましたら宜しく、宜しくお願い致します!

                                 以 上
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-06-20 19:42
こんにちは。

 MSDN(ヘルプ)をひけばわかることですが、VS.NETではコントロール配列をサポートしていません。ここの過去ログを検索すればわかることですが、別途用意した配列や別途作成したコレクションに自前で放り込むか、「Microsoft.VisualBasic.Compatibility」を参照追加し、「Microsoft.VisualBasic.Compatibility.VB6」名前空間にあるcontrolArrayを使ってみてください(←未確認)。
999
会議室デビュー日: 2003/05/17
投稿数: 14
投稿日時: 2003-06-20 20:52
「VB.NETで実現したい!」ことと違っていたらすみません。

あまりお勧めしませんが、「VB.NETで実現したい!」部分は一応動きます。
なるべく、サンプルを変更しないようにはしましたが、
GF_ShowFunctionの引数の型は変更しました。
FuncButtonクラスは、端折ってます。

ちょっと、無理やりって感じがしますね。

===================================================

Public Class Form1
Inherits System.Windows.Forms.Form
Private m_FuncNO As FuncButton '←追加

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

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

' InitializeComponent() 呼び出しの後に初期化を追加します。
m_FuncNO = New FuncButton(New Button() {Me.Button0, Me.Button1, Me.Button2, Me.Button3}) '←追加

End Sub
#End Region

end class

------------------------------------------------------------

Module Module1
Public Sub GF_ShowFunction(ByVal funcButton As FuncButton, ByVal funcNO As String)
Dim i As Integer

For i = 0 To FuncButton.Count - 1
FuncButton(i).Enabled = False
Next

For i = 0 To FuncNO.Length - 1
Select Case FuncNO.Chars(i)
Case "1"
FuncButton(0).Enabled = True
Case "2"
FuncButton(1).Enabled = True
End Select
Next i
End Sub
End Module

------------------------------------------------------------

Public Class FuncButton
Private m_button As New System.Collections.ArrayList()

Public Sub New()
End Sub

Public Sub New(ByVal buttons As Button())
m_button.AddRange(buttons)
End Sub

Public Sub Add(ByVal value As Button)
m_button.Add(value)
End Sub

Public Sub Remove(ByVal obj As Button)
m_button.Remove(obj)
End Sub

Public Function Contains(ByVal item As Button)
Return m_button.Contains(item)
End Function

Default Public Property Item(ByVal index As Integer) As Button
Get
Return CType(m_button(index), Button)
End Get
Set(ByVal Value As Button)
m_button.Item(index) = Value
End Set
End Property

Public ReadOnly Property Count() As Integer
Get
Return m_button.Count
End Get
End Property
End Class
VB!VB?VB♪
会議室デビュー日: 2003/06/20
投稿数: 6
お住まい・勤務地: 愛知県近辺
投稿日時: 2003-06-23 19:07
こんばんは!
Jittaさん、999さんご返答ありがとうございました。

Jittaへ
Jittaさんの言われることはごもっともです。まずは自分で調べる。鉄則ですね。
そうなんですけども・・・、調べた(MSDN及びここのレス等々)結果(調べ方が悪い?)
内容等が理解できなかった罠。。。情けないと思いながら恥をしのんで投稿させて頂きまし
た(><;)

999さんへ
サンプルを使ってのご指導ありがとうございました!しかし・・・・オブジェクト指向を完全
に理解していない私にとってはちょっと理解するのが難しかったです(現在進行形^^;)
そこで、もしお時間と手間を惜しまないよとおっしゃっていただけましたら一つお願いが
あります。できれば、先日ご指導いただいたサンプルソースにサル(VB!VB?VB♪)に
でも解るように、ちょっとしたコメントを付け出していただけると大変たすかります。
もしお忙しいようでしたら・・・仕方が無いです。
大変、身勝手かつずうずうしいお願いかと思いますが宜しくお願い致します。

                           以        上




Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-06-24 08:39
こんにちは。

 FuncButtonですが、デフォルトコンストラクタでm_buttonをnewしておかないとオブジェクトがないエラーになります。それより、CollectionBaseを継承すればArrayListを宣言しなくてもよいです。MSDNに、厳密に型指定をしたコレクションの作成、のようなタイトルのサンプルがあります。

引用:

999さんの書き込み (2003-06-20 20:52) より:
Public Class FuncButton
Inherits System.Collections.CollectionBase

Public Sub New()
End Sub

Public Sub New(ByVal buttons As Button())
list.AddRange(buttons)
End Sub
' 以下、m_buttonをlistに変更

Public Sub GF_ShowFunction(ByVal funcNO As String)
Dim i As Integer
For i = 0 to list.Count - 1
CType(list.Item(i), Button).Enabled = False
Next
For i = 0 To funcNO.Length - 1
Dim n as Integer = CInt(funcNO.SubString(i, 1)) - 1 ' ここ不安
CType(list.Item(n), Button).Enabled = True
Next
End Sub

End Class



[追加]
 せっかくクラスを作るのですから、GF_ShowFunctionメソッドを組み込みました。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-06-24 09:10 ]
999
会議室デビュー日: 2003/05/17
投稿数: 14
投稿日時: 2003-06-25 02:04
Jittaさんのように、コレクションとして操作したいのか。
それとも、コンポーネントとして操作したいのかによって、機能が異なってきます。
個人的な意見としては、仮に12個限定のボタンでシステム上の共通インターフェースとするならば、ユーザコントロールを作成してみてはどうでしょうか。

仕様が分からないので、汎用的(中途半端ですが)にコンポーネントで実装する場合、
自分なら、以下の仕様にします。
1.コントロール配列にするボタンを一元管理をする管理クラスを作成する。
2.管理クラスはデザイン画面にて、フォーム上のボタンを設定できる。

そのため、Componentから継承し、全てのプロパティはこの管理クラスからアクセス
します。イベントは、Clickのみ、記述しました。

新しいプロジェクトの「クラスライブラリ」のクラスに貼り付けてください
(参照:System.Windows.Forms.dll)。

ビルド後、ツールボックスにて、ツールボックスのカスタマイズを選択後、
ビルドしたdllを参照すればコンポーネントが使用できるようになります。

テスト用の、プロジェクトを「Windows アプリケーション」にて作成して下さい。

テスト用アプリケーションにて
Imports ButtonCollection
Imports ButtonCollection.FuncNO

ButtonCollection1.GF_ShowFunction(New FuncNO() {F1, F3, F6})
にて、Enabledを制御できます。

Clickイベントのsenderにて、イベントが起きたボタンを知ることができます。

※あくまでも、サンプルとして作成しました。
Buttonsプロパティのエディタは既定のエディタの為、使用すると不具合が発生します。
また、例外処理は記述してません。
---------------------------------------------------------------
Imports System.Windows.Forms
Imports System.ComponentModel

<DefaultEvent("Click")> _
Public Class ButtonCollection
Inherits System.ComponentModel.Component

#Region " コンポーネント デザイナで生成されたコード "

Public Sub New(ByVal Container As System.ComponentModel.IContainer)
MyClass.New()

'Windows.Forms クラス作成デザイナのサポートに必要です。
Container.Add(Me)
End Sub

Public Sub New()
MyBase.New()

' この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub

'Component は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
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 Region

Public Enum FuncNO
F1 = 0
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
End Enum

Private m_buttons() As Button = New Button() {Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}
Public Event Click(ByVal sender As System.Object, ByVal e As EventArgs)

<Editor("エディタは自作して下さい。", "[追加][削除]ボタンを使用すると不具合が発生!!。")> _
Public Property Buttons() As Button()
Get
Return m_buttons
End Get
Set(ByVal Value As Button())
Dim i As Integer
For i = 0 To m_buttons.Length - 1
If Not m_buttons(i) Is Nothing Then
RemoveHandler m_buttons(i).Click, AddressOf OnClick
End If
Next
m_buttons = Value
For i = 0 To m_buttons.Length - 1
If Not m_buttons(i) Is Nothing Then AddHandler m_buttons(i).Click, AddressOf OnClick
Next
End Set
End Property


Default Public Property Item(ByVal index As Integer) As Button
Get
Return CType(m_buttons(index), Button)
End Get
Set(ByVal Value As Button)
m_buttons(index) = Value
End Set
End Property

<RefreshProperties(RefreshProperties.All)> _
Public Property Count() As Integer
Get
Return m_buttons.Length
End Get
Set(ByVal Value As Integer)
ReDim Preserve m_buttons(Value - 1)
End Set
End Property

Private Sub OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim i As Integer
Dim button = CType(sender, button)
For i = 0 To m_buttons.Length - 1
If Object.Equals(button, CType(m_buttons(i), button)) Then
RaiseEvent Click(m_buttons(i), New EventArgs())
Exit For
End If
Next
End Sub

Public Sub GF_ShowFunction(ByVal funcNO() As FuncNO)
Dim i As Integer
For i = 0 To m_buttons.Length - 1
If Not m_buttons(i) Is Nothing Then
If m_buttons(i).Enabled Then m_buttons(i).Enabled = False
End If
Next
For i = 0 To funcNO.Length - 1
If funcNO(i) <= m_buttons.Length - 1 Then
If Not m_buttons(funcNO(i)) Is Nothing Then
m_buttons(funcNO(i)).Enabled = True
End If
End If
Next
End Sub
End Class
1

スキルアップ/キャリアアップ(JOB@IT)